00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _httpconnect_h
00027 #define _httpconnect_h
00028
00029
00030 #include <string>
00031
00032 #include <curl/curl.h>
00033 #include <curl/types.h>
00034 #include <curl/easy.h>
00035
00036 #ifndef _rc_reader_h_
00037 #include "RCReader.h"
00038 #endif
00039
00040 #ifndef _object_type_h
00041 #include "ObjectType.h"
00042 #endif
00043
00044 #ifndef _http_cache_h
00045 #include "HTTPCache.h"
00046 #endif
00047
00048 #ifndef http_response_h
00049 #include "HTTPResponse.h"
00050 #endif
00051
00052 #ifndef _util_h
00053 #include "util.h"
00054 #endif
00055
00056 using std::string;
00057 using std::vector;
00058
00059 namespace libdap
00060 {
00061
00074 class HTTPConnect
00075 {
00076 private:
00077 CURL *d_curl;
00078 RCReader *d_rcr;
00079 HTTPCache *d_http_cache;
00080
00081 char d_error_buffer[CURL_ERROR_SIZE];
00082
00083 bool d_accept_deflate;
00084
00085 string d_username;
00086 string d_password;
00087 string d_upstring;
00088
00089 vector<string> d_request_headers;
00090
00091 void www_lib_init();
00092 long read_url(const string &url, FILE *stream, vector<string> *resp_hdrs,
00093 const vector<string> *headers = 0);
00094
00095 HTTPResponse *plain_fetch_url(const string &url);
00096 HTTPResponse *caching_fetch_url(const string &url);
00097
00098 bool url_uses_proxy_for(const string &url) throw();
00099 bool url_uses_no_proxy_for(const string &url) throw();
00100
00101 void extract_auth_info(string &url);
00102
00103
00104
00105 friend size_t save_raw_http_header(void *ptr, size_t size, size_t nmemb,
00106 void *http_connect);
00107 friend class HTTPConnectTest;
00108 friend class ParseHeader;
00109
00110 protected:
00116 HTTPConnect() {
00117 throw InternalErr(__FILE__, __LINE__, "Unimplemented method");
00118 }
00119 HTTPConnect(const HTTPConnect &) {
00120 throw InternalErr(__FILE__, __LINE__, "Unimplemented method");
00121 }
00122 HTTPConnect &operator=(const HTTPConnect &) {
00123 throw InternalErr(__FILE__, __LINE__, "Unimplemented assignment");
00124 }
00126
00127 public:
00128 HTTPConnect(RCReader *rcr);
00129
00130 virtual ~HTTPConnect();
00131
00132 void set_credentials(const string &u, const string &p);
00133 void set_accept_deflate(bool defalte);
00134
00140 void set_cache_enabled(bool enabled)
00141 {
00142 if (d_http_cache)
00143 d_http_cache->set_cache_enabled(enabled);
00144 }
00145
00147 bool is_cache_enabled()
00148 {
00149 return (d_http_cache) ? d_http_cache->is_cache_enabled() : false;
00150 }
00151
00152 HTTPResponse *fetch_url(const string &url);
00153 };
00154
00155 }
00156
00157 #endif // _httpconnect_h