Index: src/DefaultWebRequestDummy.cpp |
=================================================================== |
copy from src/WebRequest.cpp |
copy to src/DefaultWebRequestDummy.cpp |
--- a/src/WebRequest.cpp |
+++ b/src/DefaultWebRequestDummy.cpp |
@@ -1,190 +1,10 @@ |
#include <AdblockPlus/WebRequest.h> |
-AdblockPlus::WebRequest::~WebRequest() |
-{ |
-} |
- |
-#if defined(HAVE_CURL) |
- |
-#include <sstream> |
-#include <cctype> |
-#include <algorithm> |
-#include <curl/curl.h> |
- |
-namespace |
-{ |
- struct HeaderData |
- { |
- int status; |
- bool expectingStatus; |
- std::vector<std::string> headers; |
- |
- HeaderData() |
- { |
- status = 0; |
- expectingStatus = true; |
- } |
- }; |
- |
- unsigned int ConvertErrorCode(CURLcode code) |
- { |
- switch (code) |
- { |
- case CURLE_OK: |
- return NS_OK; |
- case CURLE_FAILED_INIT: |
- return NS_ERROR_NOT_INITIALIZED; |
- case CURLE_UNSUPPORTED_PROTOCOL: |
- return NS_ERROR_UNKNOWN_PROTOCOL; |
- case CURLE_URL_MALFORMAT: |
- return NS_ERROR_MALFORMED_URI; |
- case CURLE_COULDNT_RESOLVE_PROXY: |
- return NS_ERROR_UNKNOWN_PROXY_HOST; |
- case CURLE_COULDNT_RESOLVE_HOST: |
- return NS_ERROR_UNKNOWN_HOST; |
- case CURLE_COULDNT_CONNECT: |
- return NS_ERROR_CONNECTION_REFUSED; |
- case CURLE_OUT_OF_MEMORY: |
- return NS_ERROR_OUT_OF_MEMORY; |
- case CURLE_OPERATION_TIMEDOUT: |
- return NS_ERROR_NET_TIMEOUT; |
- case CURLE_TOO_MANY_REDIRECTS: |
- return NS_ERROR_REDIRECT_LOOP; |
- case CURLE_GOT_NOTHING: |
- return NS_ERROR_NO_CONTENT; |
- case CURLE_SEND_ERROR: |
- return NS_ERROR_NET_RESET; |
- case CURLE_RECV_ERROR: |
- return NS_ERROR_NET_RESET; |
- default: |
- return NS_CUSTOM_ERROR_BASE + code; |
- } |
- } |
- |
- size_t ReceiveData(char* ptr, size_t size, size_t nmemb, void* userdata) |
- { |
- std::stringstream* stream = static_cast<std::stringstream*>(userdata); |
- stream->write(ptr, size * nmemb); |
- return nmemb; |
- } |
- |
- size_t ReceiveHeader(char* ptr, size_t size, size_t nmemb, void* userdata) |
- { |
- HeaderData* data = static_cast<HeaderData*>(userdata); |
- std::string header(ptr, size * nmemb); |
- if (data->expectingStatus) |
- { |
- // Parse the status code out of something like "HTTP/1.1 200 OK" |
- const std::string prefix("HTTP/1."); |
- size_t prefixLen = prefix.length(); |
- if (header.length() >= prefixLen + 2 && !header.compare(0, prefixLen, prefix) && |
- isdigit(header[prefixLen]) && isspace(header[prefixLen + 1])) |
- { |
- size_t statusStart = prefixLen + 2; |
- while (statusStart < header.length() && isspace(header[statusStart])) |
- statusStart++; |
- |
- size_t statusEnd = statusStart; |
- while (statusEnd < header.length() && isdigit(header[statusEnd])) |
- statusEnd++; |
- |
- if (statusEnd > statusStart && statusEnd < header.length() && |
- isspace(header[statusEnd])) |
- { |
- std::istringstream(header.substr(statusStart, statusEnd - statusStart)) >> data->status; |
- data->headers.clear(); |
- data->expectingStatus = false; |
- } |
- } |
- } |
- else |
- { |
- size_t headerEnd = header.length(); |
- while (headerEnd > 0 && isspace(header[headerEnd - 1])) |
- headerEnd--; |
- |
- if (headerEnd) |
- data->headers.push_back(header.substr(0, headerEnd)); |
- else |
- data->expectingStatus = true; |
- } |
- return nmemb; |
- } |
-} |
- |
-AdblockPlus::ServerResponse AdblockPlus::DefaultWebRequest::GET( |
- const std::string& url, const HeaderList& requestHeaders) const |
-{ |
- AdblockPlus::ServerResponse result; |
- result.status = NS_ERROR_NOT_INITIALIZED; |
- result.responseStatus = 0; |
- |
- CURL *curl = curl_easy_init(); |
- if (curl) |
- { |
- std::stringstream responseText; |
- HeaderData headerData; |
- curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); |
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ReceiveData); |
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseText); |
- curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, ReceiveHeader); |
- curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headerData); |
- |
- struct curl_slist* headerList = 0; |
- for (HeaderList::const_iterator it = requestHeaders.begin(); |
- it != requestHeaders.end(); ++it) |
- { |
- curl_slist_append(headerList, (it->first + ": " + it->second).c_str()); |
- } |
- if (headerList) |
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerList); |
- |
- result.status = ConvertErrorCode(curl_easy_perform(curl)); |
- result.responseStatus = headerData.status; |
- result.responseText = responseText.str(); |
- for (std::vector<std::string>::iterator it = headerData.headers.begin(); |
- it != headerData.headers.end(); ++it) |
- { |
- // Parse header name and value out of something like "Foo: bar" |
- std::string header = *it; |
- size_t colonPos = header.find(':'); |
- if (colonPos != std::string::npos) |
- { |
- size_t nameStart = 0; |
- size_t nameEnd = colonPos; |
- while (nameEnd > nameStart && isspace(header[nameEnd - 1])) |
- nameEnd--; |
- |
- size_t valueStart = colonPos + 1; |
- while (valueStart < header.length() && isspace(header[valueStart])) |
- valueStart++; |
- size_t valueEnd = header.length(); |
- |
- if (nameEnd > nameStart && valueEnd > valueStart) |
- { |
- std::string name = header.substr(nameStart, nameEnd - nameStart); |
- std::transform(name.begin(), name.end(), name.begin(), ::tolower); |
- std::string value = header.substr(valueStart, valueEnd - valueStart); |
- result.responseHeaders.push_back(std::pair<std::string, std::string>( |
- name, value)); |
- } |
- } |
- } |
- |
- if (headerList) |
- curl_slist_free_all(headerList); |
- curl_easy_cleanup(curl); |
- } |
- return result; |
-} |
-#else |
AdblockPlus::ServerResponse AdblockPlus::DefaultWebRequest::GET( |
const std::string& url, const HeaderList& requestHeaders) const |
{ |
AdblockPlus::ServerResponse result; |
result.status = NS_ERROR_FAILURE; |
result.responseStatus = 0; |
return result; |
} |
-#endif |