00001
00034 #ifndef LL_LLURLREQUEST_H
00035 #define LL_LLURLREQUEST_H
00036
00042 #include <string>
00043 #include "lliopipe.h"
00044 #include "llchainio.h"
00045 #include "llerror.h"
00046
00047 class LLURLRequestDetail;
00048
00049 class LLURLRequestComplete;
00050
00064 class LLURLRequest : public LLIOPipe
00065 {
00066 LOG_CLASS(LLURLRequest);
00067 public:
00071 enum ERequestAction
00072 {
00073 INVALID,
00074 HTTP_HEAD,
00075 HTTP_GET,
00076 HTTP_PUT,
00077 HTTP_POST,
00078 HTTP_DELETE,
00079 HTTP_MOVE,
00080 REQUEST_ACTION_COUNT
00081 };
00082
00088 LLURLRequest(ERequestAction action);
00089
00096 LLURLRequest(ERequestAction action, const std::string& url);
00097
00101 virtual ~LLURLRequest();
00102
00103
00104
00106
00115 void setURL(const std::string& url);
00116
00126 void addHeader(const char* header);
00127
00134 void checkRootCertificate(bool check);
00135
00143 void setBodyLimit(U32 size);
00144
00159 void setCallback(LLURLRequestComplete* callback);
00161
00162
00163
00164
00168 void useProxy(bool use_proxy);
00169
00173 void useProxy(const std::string& proxy);
00174
00175 public:
00179 virtual EStatus handleError(EStatus status, LLPumpIO* pump);
00180
00181 protected:
00185 virtual EStatus process_impl(
00186 const LLChannelDescriptors& channels,
00187 buffer_ptr_t& buffer,
00188 bool& eos,
00189 LLSD& context,
00190 LLPumpIO* pump);
00192
00193 protected:
00194 enum EState
00195 {
00196 STATE_INITIALIZED,
00197 STATE_WAITING_FOR_RESPONSE,
00198 STATE_PROCESSING_RESPONSE,
00199 STATE_HAVE_RESPONSE,
00200 };
00201 EState mState;
00202 ERequestAction mAction;
00203 LLURLRequestDetail* mDetail;
00204 LLIOPipe::ptr_t mCompletionCallback;
00205
00206 private:
00210 void initialize();
00211
00217 bool configure();
00218
00222 static size_t downCallback(
00223 char* data,
00224 size_t size,
00225 size_t nmemb,
00226 void* user);
00227
00231 static size_t upCallback(
00232 char* data,
00233 size_t size,
00234 size_t nmemb,
00235 void* user);
00236
00241 LLURLRequest(const LLURLRequest&);
00242 };
00243
00244
00254 class LLContextURLExtractor : public LLIOPipe
00255 {
00256 public:
00257 LLContextURLExtractor(LLURLRequest* req) : mRequest(req) {}
00258 ~LLContextURLExtractor() {}
00259
00260 protected:
00261
00262
00264
00267 virtual EStatus process_impl(
00268 const LLChannelDescriptors& channels,
00269 buffer_ptr_t& buffer,
00270 bool& eos,
00271 LLSD& context,
00272 LLPumpIO* pump);
00274
00275 protected:
00276 LLURLRequest* mRequest;
00277 };
00278
00279
00285 class LLURLRequestComplete : public LLIOPipe
00286 {
00287 public:
00288
00289 virtual void header(const std::string& header, const std::string& value);
00291
00292 virtual void httpStatus(U32 status, const std::string& reason);
00294
00295 virtual void complete(
00296 const LLChannelDescriptors& channels,
00297 const buffer_ptr_t& buffer);
00298
00304 virtual void response(
00305 const LLChannelDescriptors& channels,
00306 const buffer_ptr_t& buffer);
00307
00313 virtual void noResponse();
00314
00324 void responseStatus(EStatus status);
00325
00326
00327 LLURLRequestComplete();
00328 virtual ~LLURLRequestComplete();
00329
00330 protected:
00331
00332
00334
00337 virtual EStatus process_impl(
00338 const LLChannelDescriptors& channels,
00339 buffer_ptr_t& buffer,
00340 bool& eos,
00341 LLSD& context,
00342 LLPumpIO* pump);
00344
00345
00346
00347 EStatus mRequestStatus;
00348 };
00349
00350
00367 #if 0
00368 template<class Client>
00369 class LLURLRequestClientFactory : public LLChainIOFactory
00370 {
00371 public:
00372 LLURLRequestClientFactory(LLURLRequest::ERequestAction action) {}
00373 LLURLRequestClientFactory(
00374 LLURLRequest::ERequestAction action,
00375 const std::string& fixed_url) :
00376 mAction(action),
00377 mURL(fixed_url)
00378 {
00379 }
00380 virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
00381 {
00382 lldebugs << "LLURLRequestClientFactory::build" << llendl;
00383 LLIOPipe::ptr_t service(new Client);
00384 chain.push_back(service);
00385 LLURLRequest* http(new LLURLRequest(mAction));
00386 LLIOPipe::ptr_t http_pipe(http);
00387
00388
00389 if(mURL.empty())
00390 {
00391 chain.push_back(LLIOPipe::ptr_t(new LLContextURLExtractor(http)));
00392 }
00393 else
00394 {
00395 http->setURL(mURL);
00396 }
00397 chain.push_back(http_pipe);
00398 chain.push_back(service);
00399 return true;
00400 }
00401
00402 protected:
00403 LLURLRequest::ERequestAction mAction;
00404 std::string mURL;
00405 };
00406 #endif
00407
00411 extern const std::string CONTEXT_DEST_URI_SD_LABEL;
00412
00413 #endif // LL_LLURLREQUEST_H