llurlrequest.h

Go to the documentation of this file.
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, // Caller will need to set 'Destination' header
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         /* @name Instance methods
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         /* @name LLIOPipe virtual implementations
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         /* @name LLIOPipe virtual implementations
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         // constructor & destructor.
00327         LLURLRequestComplete();
00328         virtual ~LLURLRequestComplete();
00329 
00330 protected:
00331         /* @name LLIOPipe virtual implementations
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         // value to note if we actually got the response. This value
00346         // depends on correct useage from the LLURLRequest instance.
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                 // *FIX: how do we know the content type?
00388                 //http->addHeader("Content-Type: text/llsd");
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

Generated on Fri May 16 08:32:32 2008 for SecondLife by  doxygen 1.5.5