00001 #ifndef BCResourceHandleCURL_H_
00002 #define BCResourceHandleCURL_H_
00003
00004 #include "BALConfiguration.h"
00005 #include "../Common/BCResourceHandleCommonImplementation.h"
00006 #include "BIResourceHandle.h"
00007 #include "BTFormData.h"
00008 #include "BTLogHelper.h"
00009 #include "CString.h"
00010 #include <curl/curl.h>
00011 #include "DeprecatedString.h"
00012 #include "PlatformString.h"
00013 #include <SharedBuffer.h>
00014 #include "StringHash.h"
00015 #include "Timer.h"
00016 #include <Vector.h>
00017 #include <wtf/HashMap.h>
00018 #include "BIObserver.h"
00019
00020 class KURL;
00021
00022 using WebCore::CString;
00023 using WebCore::DeprecatedString;
00024 using WebCore::FormData;
00025 using WebCore::SharedBuffer;
00026 using WebCore::String;
00027 using BAL::BIObserver;
00028
00029 namespace BC {
00030
00034 class BCResourceHandleCURL : public BAL::BIObserver, public BAL::BIResourceHandle, public BCResourceHandleCommonImplementation {
00035 public:
00036 BCResourceHandleCURL(const ResourceRequest&, ResourceHandleClient*, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle);
00037
00038 virtual ~BCResourceHandleCURL();
00039
00040 virtual KURL url() const { return m_request.url(); }
00041 virtual WebCore::String method() const { return m_request.httpMethod(); }
00042 virtual PassRefPtr<FormData> postData() const { return m_request.httpBody(); }
00043
00044 virtual ResourceHandleClient* client() const { return BCResourceHandleCommonImplementation::client(); }
00045 virtual void setClient(ResourceHandleClient* client) { BCResourceHandleCommonImplementation::setClient(client); }
00046 virtual const ResourceRequest& request() const { return BCResourceHandleCommonImplementation::request(); }
00047 virtual const HTTPHeaderMap& requestHeaders() const { return m_request.httpHeaderFields(); }
00048
00049 CURL* handle() { return m_handle; }
00050 void setHandle( CURL* a ) { m_handle = a; }
00051 const char* getURL() { return m_url; }
00052 void setURL(const char* url);
00053 void setHeaders(struct curl_slist* headers) { m_customHeaders = headers; }
00054
00055 bool loadsBlocked();
00056 void clearAuthentication();
00057 void cancel();
00058 PassRefPtr<WebCore::SharedBuffer> bufferedData();
00059 void setDefersLoading(bool defers);
00060
00061 void setupPUT();
00062 void setupPOST();
00063 void processMessage(CURLMsg* msg);
00064 size_t write(void* ptr, size_t size, size_t nmemb);
00065 size_t header(char* ptr, size_t size, size_t nmemb);
00066
00072 void observe(const String&, const String&);
00073
00074 private:
00075 void finish();
00076 Vector<char> runImmediately(ResourceResponse& response);
00077
00082 void checkAndSendCookies(KURL url = "");
00083
00084 protected:
00085 CURL* m_handle;
00086 char* m_url;
00087 struct curl_slist* m_customHeaders;
00092 bool m_useSimple;
00096 Vector<char> m_resultData;
00097 struct curl_slist* m_customHeader;
00098 struct curl_slist* m_customPostHeader;
00099 struct curl_httppost* m_filePost;
00100 Vector<char> m_postBytes;
00101 Vector<CString> m_cstrings;
00102 ResourceResponse m_response;
00103 ResourceError m_error;
00104 bool m_sentResponse;
00105 bool m_loading;
00106
00107 };
00108
00109 }
00110
00111 #endif // BCResourceHandleCURL_H_