From 79bedb43ecac0089aab995cbf3f509cc15499501 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Sat, 25 Feb 2006 00:02:55 +0000 Subject: [PATCH] HTTP fix and code cleanup svn path=/trunk/boinc/; revision=9551 --- checkin_notes | 21 ++++++++++++++++ client/http_curl.C | 55 ++++++----------------------------------- client/http_curl.h | 22 ++--------------- client/net_xfer_curl.C | 26 +------------------ client/net_xfer_curl.h | 19 +------------- client/pers_file_xfer.C | 4 +-- 6 files changed, 35 insertions(+), 112 deletions(-) diff --git a/checkin_notes b/checkin_notes index 3a006e2a7f..883da55999 100755 --- a/checkin_notes +++ b/checkin_notes @@ -2319,3 +2319,24 @@ Rom 23 Feb 2006 Rom 24 Feb 2006 (HEAD) - Tag for 5.3.21 release, all platforms boinc_core_release_5_3_21 + +David 24 Feb 2006 + - remove "gzip" from list of encodings accepted by Curl; + having it in the list breaks existing projects + that use .gz files and decompress them in the app + (e.g. Einstein and CPDN). + We can fix this by adding a element in ; + I'll do this later. + - Remove old HTTP code and data that's deprecated by Curl + (e.g. timeout, blocksize stuff; stuff related + to parsing URL into host/port/file/) + remove commented-out code. + - GUI RPC: a elements now includes + a rather than a . + This change doesn't affect the BOINC Manager, + which I believe is the only client of this RPC + + client/ + http_curl.C,h + net_xfer_curl.C,h + pers_file_xfer.C diff --git a/client/http_curl.C b/client/http_curl.C index 97c278bc44..b4ad25133a 100644 --- a/client/http_curl.C +++ b/client/http_curl.C @@ -135,9 +135,7 @@ void get_user_agent_string() { } HTTP_OP::HTTP_OP() { - strcpy(m_url, ""); // CMC added this to "preserve" the url for libcurl - strcpy(url_hostname, ""); - strcpy(filename, ""); + strcpy(m_url, ""); content_length = 0; file_offset = 0; strcpy(request_header, ""); @@ -161,9 +159,7 @@ int HTTP_OP::init_get( } req1 = NULL; // not using req1, but init_post2 uses it file_offset = off; - safe_strcpy(m_url, url); - parse_url(url, url_hostname, port, filename); - NET_XFER::init(url_hostname, port, HTTP_BLOCKSIZE); + NET_XFER::init(); // usually have an outfile on a get if (off != 0) { bytes_xferred = off; @@ -184,9 +180,6 @@ int HTTP_OP::init_post( SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_HTTP); req1 = NULL; // not using req1, but init_post2 uses it - strcpy(m_url, url); - parse_url(url, url_hostname, port, filename); - if (in) { // we should pretty much always have an in file for _post, optional in _post2 strcpy(infile, in); @@ -194,8 +187,7 @@ int HTTP_OP::init_post( if (retval) return retval; // this will return 0 or ERR_NOT_FOUND content_length = (int)size; } - //PROXY::init(url_hostname, port); - NET_XFER::init(url_hostname,port, HTTP_BLOCKSIZE); + NET_XFER::init(); http_op_type = HTTP_OP_POST; http_op_state = HTTP_STATE_CONNECTING; scope_messages.printf("HTTP_OP::init_post(): %p io_done %d\n", this, io_done); @@ -206,14 +198,14 @@ int HTTP_OP::init_post( // polling at the net_xfer level // int HTTP_OP::libcurl_exec( - const char* , const char* in, const char* out, double offset, bool bPost + const char* url, const char* in, const char* out, double offset, bool bPost ) { CURLMcode curlMErr; CURLcode curlErr; - //char proxy_buf[256]; char strTmp[128]; - // get user agent string + safe_strcpy(m_url, url); + if (g_user_agent_string[0] == 0x00) { get_user_agent_string(); } @@ -296,33 +288,6 @@ The checking this option controls is of the identity that the server claims. The // set the user agent as this boinc client & version curlErr = curl_easy_setopt(curlEasy, CURLOPT_USERAGENT, g_user_agent_string); - // note: custom headers here means EVERYTHING needs to be set here, - // including form content types. Probably best just to set the user agent above - // and let libcurl handle the headers. - - // create custom header for BOINC -#if 0 - pcurlList = curl_slist_append(pcurlList, "Pragma: no-cache"); - pcurlList = curl_slist_append(pcurlList, "Cache-Control: no-cache"); - - pcurlList = curl_slist_append(pcurlList, g_user_agent_string); - - //sprintf(strTmp, "Host: %s:%d", url_hostname, port); - //pcurlList = curl_slist_append(pcurlList, strTmp); - if (offset>0.0f) { - file_offset = offset; - sprintf(strTmp, "Range: bytes=%.0f-", offset); - pcurlList = curl_slist_append(pcurlList, strTmp); - } - pcurlList = curl_slist_append(pcurlList, "Connection: close"); - pcurlList = curl_slist_append(pcurlList, "Accept: *\/*"); - - // "Proxy-Authorization: Basic %s\015\012" - if (pcurlList) { // send custom headers if required - curlErr = curl_easy_setopt(curlEasy, CURLOPT_HTTPHEADER, pcurlList); - } -#endif - // bypass any signal handlers that curl may want to install curlErr = curl_easy_setopt(curlEasy, CURLOPT_NOSIGNAL, 1L); // bypass progress meter @@ -339,7 +304,7 @@ The checking this option controls is of the identity that the server claims. The curlErr = curl_easy_setopt(curlEasy, CURLOPT_MAXREDIRS, 5L); curlErr = curl_easy_setopt(curlEasy, CURLOPT_AUTOREFERER, 1L); curlErr = curl_easy_setopt(curlEasy, CURLOPT_FOLLOWLOCATION, 1L); - curlErr = curl_easy_setopt(curlEasy, CURLOPT_ENCODING, ""); + curlErr = curl_easy_setopt(curlEasy, CURLOPT_ENCODING, "deflate"); // setup any proxy they may need setupProxyCurl(); @@ -477,11 +442,7 @@ int HTTP_OP::init_post2( double size; //char proxy_buf[256]; - strcpy(m_url, url); - parse_url(url, url_hostname, port, filename); - //PROXY::init(url_hostname, port); - //NET_XFER::init(get_proxy_server_name(url_hostname),get_proxy_port(port), HTTP_BLOCKSIZE); - NET_XFER::init(url_hostname,port, HTTP_BLOCKSIZE); + NET_XFER::init(); req1 = r1; if (in) { safe_strcpy(infile, in); diff --git a/client/http_curl.h b/client/http_curl.h index 06f1263d27..bab936e17b 100644 --- a/client/http_curl.h +++ b/client/http_curl.h @@ -69,32 +69,14 @@ public: HTTP_OP(); ~HTTP_OP(); - // proxy info PROXY_INFO pi; - int port; - char filename[256]; - char url_hostname[256]; - - // CMC added this to "preserve" the url for libcurl use, - // as we don't really need to do all the parsing stuff char m_url[256]; char szCurlProxyUserPwd[128]; // string needed for proxy username/password - // the hostname part of the URL. - // May not be the host we connect to (if using proxy) int content_length; double file_offset; char request_header[4096]; - //HTTP_REPLY_HEADER hrh; - // move these to net_xfer - /* - int http_op_state; // values below - int http_op_type; - int http_op_retval; - */ - // zero if success, or a BOINC error code, or an HTTP status code -//// bool proxy_auth_done; //int init_head(const char* url); int init_get(const char* url, const char* outfile, bool del_old_file, double offset=0); @@ -112,8 +94,8 @@ private: // internal use in the class -- takes an init_get/post/post2 and turns it into // an appropriate libcurl request int libcurl_exec(const char* url, const char* in = NULL, const char* out = NULL, - double offset = 0.0f, bool bPost = true); - + double offset = 0.0f, bool bPost = true + ); }; // global function used by libcurl to write http replies to disk diff --git a/client/net_xfer_curl.C b/client/net_xfer_curl.C index f80e336a52..1d4e05a934 100644 --- a/client/net_xfer_curl.C +++ b/client/net_xfer_curl.C @@ -157,33 +157,9 @@ void NET_XFER::close_file() { } } -void NET_XFER::init(char* host, int p, int b) { +void NET_XFER::init() { reset(); - safe_strcpy(hostname, host); - port = p; - blocksize = (b > MAX_BLOCKSIZE ? MAX_BLOCKSIZE : b); start_time = gstate.now; - reset_timeout(); -} - -bool NET_XFER::check_timeout(bool time_passed) { - if (seconds_until_timeout == 0) { - io_done = true; - error = ERR_TIMEOUT; - return true; - } - if (time_passed) { - seconds_until_timeout--; - } - return false; -} - -void NET_XFER::reset_timeout() { - seconds_until_timeout = NET_XFER_TIMEOUT; -} - -char* NET_XFER::get_hostname() { - return hostname; } NET_XFER_SET::NET_XFER_SET() { diff --git a/client/net_xfer_curl.h b/client/net_xfer_curl.h index 83367203db..8f31ff9640 100644 --- a/client/net_xfer_curl.h +++ b/client/net_xfer_curl.h @@ -39,8 +39,6 @@ extern CURLM* g_curlMulti; // the global libcurl multi handle // The following classes implement polling (non-blocking) I/O // between a disk file (or memory block) and a socket -#define MAX_BLOCKSIZE 16384 - // global functions for starting & stopping libcurl extern int curl_init(); extern int curl_cleanup(); @@ -74,8 +72,6 @@ public: bool bSentHeader; // CMC -- a flag that I already sent the header CURLcode CurlResult; // CMC -- send up curl result code - // int socket; // CMC -- deprecated, net_xfer's via curlEasy handle above - char hostname[256]; // The host we're connecting to (possibly a proxy) bool is_connected; bool want_download; // at most one should be true bool want_upload; @@ -97,13 +93,10 @@ public: // (used if !do_file_io) long error; long response; - int port; - int blocksize; double start_time; double xfer_speed; double bytes_xferred; // bytes transferred in this session double content_length; - int seconds_until_timeout; // CMC - moved from http_op int http_op_state; // values below @@ -113,17 +106,12 @@ public: NET_XFER(); ~NET_XFER(); void reset(); - void init(char* host, int port, int blocksize); + void init(); int get_ip_addr(int &ip_addr); - //int open_server(); void close_socket(); void close_file(); - // int do_xfer(int&); // CMC not needed for libcurl void update_speed(); void got_error(); - char* get_hostname(); - bool check_timeout(bool); - void reset_timeout(); }; // bandwidth limitation is implemented at this level, as follows: @@ -147,11 +135,6 @@ public: void get_fdset(FDSET_GROUP&); void got_select(FDSET_GROUP&, double); -#if 0 - bool poll(); - int net_sleep(double); - int do_select(double& bytes_transferred, double timeout); -#endif NET_XFER* lookup_curl(CURL* pcurl); // lookup by easycurl handle }; diff --git a/client/pers_file_xfer.C b/client/pers_file_xfer.C index cc16d2d16e..cd4fff0534 100644 --- a/client/pers_file_xfer.C +++ b/client/pers_file_xfer.C @@ -427,12 +427,12 @@ int PERS_FILE_XFER::write(MIOFILE& fout) { " %f\n" " %f\n" " %f\n" - " %s\n" + " %s\n" " \n", fxp->bytes_xferred, fxp->file_offset, fxp->xfer_speed, - fxp->get_hostname() + fxp->m_url ); } return 0;