--- parser3/src/classes/curl.C 2018/08/24 16:31:06 1.60 +++ parser3/src/classes/curl.C 2020/11/10 22:42:24 1.65 @@ -17,7 +17,7 @@ #include "pa_http.h" #include "ltdl.h" -volatile const char * IDENT_CURL_C="$Id: curl.C,v 1.60 2018/08/24 16:31:06 moko Exp $"; +volatile const char * IDENT_CURL_C="$Id: curl.C,v 1.65 2020/11/10 22:42:24 moko Exp $"; class MCurl: public Methoded { public: @@ -310,38 +310,41 @@ struct CurlInfo : public PA_Allocated{ CurlInfo(CURLINFO aid, OptionType atype): id(aid), type(atype) {} }; -class CurlInfoHash: public HashString { +class CurlInfoHash: public OrderedHashString { public: CurlInfoHash() { #define CURL_INF(type, name) put(str_lower(#name),new CurlInfo(CURLINFO_##name, CurlInfo::type)); + CURL_INF(CURL_STRING, SCHEME); + CURL_INF(CURL_HTTP_VERSION, HTTP_VERSION); + CURL_INF(CURL_STRING, EFFECTIVE_URL); + CURL_INF(CURL_STRING, CONTENT_TYPE); + CURL_INF(CURL_INT, RESPONSE_CODE); + CURL_INF(CURL_INT, OS_ERRNO); + + CURL_INF(CURL_DOUBLE, NAMELOOKUP_TIME); CURL_INF(CURL_DOUBLE, APPCONNECT_TIME); + CURL_INF(CURL_DOUBLE, PRETRANSFER_TIME); + CURL_INF(CURL_DOUBLE, STARTTRANSFER_TIME); CURL_INF(CURL_DOUBLE, CONNECT_TIME); + CURL_INF(CURL_DOUBLE, TOTAL_TIME); + CURL_INF(CURL_DOUBLE, CONTENT_LENGTH_DOWNLOAD); CURL_INF(CURL_DOUBLE, CONTENT_LENGTH_UPLOAD); - CURL_INF(CURL_STRING, CONTENT_TYPE); - CURL_INF(CURL_STRING, EFFECTIVE_URL); CURL_INF(CURL_INT, HEADER_SIZE); - CURL_INF(CURL_INT, HTTPAUTH_AVAIL); - CURL_INF(CURL_DOUBLE, NAMELOOKUP_TIME); + CURL_INF(CURL_INT, REQUEST_SIZE); + CURL_INF(CURL_DOUBLE, SIZE_DOWNLOAD); + CURL_INF(CURL_DOUBLE, SIZE_UPLOAD); + CURL_INF(CURL_DOUBLE, SPEED_DOWNLOAD); + CURL_INF(CURL_DOUBLE, SPEED_UPLOAD); + CURL_INF(CURL_INT, NUM_CONNECTS); - CURL_INF(CURL_INT, OS_ERRNO); - CURL_INF(CURL_DOUBLE, PRETRANSFER_TIME); CURL_INF(CURL_STRING, PRIMARY_IP); + CURL_INF(CURL_INT, HTTPAUTH_AVAIL); CURL_INF(CURL_INT, PROXYAUTH_AVAIL); CURL_INF(CURL_INT, REDIRECT_COUNT); CURL_INF(CURL_DOUBLE, REDIRECT_TIME); CURL_INF(CURL_STRING, REDIRECT_URL); - CURL_INF(CURL_INT, REQUEST_SIZE); - CURL_INF(CURL_INT, RESPONSE_CODE); - CURL_INF(CURL_DOUBLE, SIZE_DOWNLOAD); - CURL_INF(CURL_DOUBLE, SIZE_UPLOAD); - CURL_INF(CURL_DOUBLE, SPEED_DOWNLOAD); - CURL_INF(CURL_DOUBLE, SPEED_UPLOAD); CURL_INF(CURL_INT, SSL_VERIFYRESULT); - CURL_INF(CURL_DOUBLE, STARTTRANSFER_TIME); - CURL_INF(CURL_DOUBLE, TOTAL_TIME); - CURL_INF(CURL_HTTP_VERSION, HTTP_VERSION); - CURL_INF(CURL_STRING, SCHEME); } } *curl_infos=0; @@ -520,13 +523,13 @@ static void curl_setopt(HashStringValue: } case CurlOption::CURL_FILE:{ // file-spec curl option - const char *file_spec_cstr=curl_check_file(r.absolute(v.as_string())); + const char *file_spec_cstr=curl_check_file(r.full_disk_path(v.as_string())); res=f_curl_easy_setopt(curl(), opt->id, file_spec_cstr); break; } case CurlOption::CURL_STDERR:{ // verbose output redirection from stderr to file curl option - const char *file_spec_cstr=curl_check_file(r.absolute(v.as_string())); + const char *file_spec_cstr=curl_check_file(r.full_disk_path(v.as_string())); FILE *f_stderr=options().f_stderr=pa_fopen(file_spec_cstr, "wt"); if (f_stderr){ res=f_curl_easy_setopt(curl(), opt->id, f_stderr); @@ -652,9 +655,9 @@ public: char *buf; size_t length; size_t buf_size; - ResponseHeaders& headers; + HTTP_Headers& headers; - Curl_buffer(ResponseHeaders& aheaders) : buf((char *)pa_malloc_atomic(MAX_STRING)), length(0), buf_size(MAX_STRING-1), headers(aheaders){} + Curl_buffer(HTTP_Headers& aheaders) : buf((char *)pa_malloc_atomic(MAX_STRING)), length(0), buf_size(MAX_STRING-1), headers(aheaders){} void resize(size_t size){ buf_size=size; @@ -677,7 +680,7 @@ static int curl_writer(char *data, size_ return size; } -static int curl_header(char *data, size_t size, size_t nmemb, ResponseHeaders *result){ +static int curl_header(char *data, size_t size, size_t nmemb, HTTP_Headers *result){ if(result == 0) return 0; @@ -708,7 +711,7 @@ static void _curl_load_action(Request& r CURLcode res; // we need a container for headers as VFile fields can be put only after VFile.set - ResponseHeaders response; + HTTP_Headers response; CURL_SETOPT(CURLOPT_HEADERFUNCTION, curl_header, "curl header function"); CURL_SETOPT(CURLOPT_WRITEHEADER, &response, "curl header buffer"); @@ -722,7 +725,8 @@ static void _curl_load_action(Request& r CURL_SETOPT(CURLOPT_POSTFIELDSIZE, 0, "post content-length"); } - if((res=f_curl_easy_perform(curl())) != CURLE_OK){ + ALTER_EXCEPTION_SOURCE(res=f_curl_easy_perform(curl()), new String(options().url)); + if(res != CURLE_OK){ const char *ex_type = 0; switch(res){ case CURLE_OPERATION_TIMEDOUT: @@ -740,10 +744,10 @@ static void _curl_load_action(Request& r case CURLE_SSL_ENGINE_INITFAILED: ex_type = "curl.ssl"; break; case CURLE_WRITE_ERROR: - check_file_size(response.content_length, *new String(options().url)); break; + check_file_size(response.content_length, new String(options().url)); break; default: break; } - throw Exception( PA_DEFAULT(ex_type, "curl.fail"), 0, "%s", f_curl_easy_strerror(res)); + throw Exception( PA_DEFAULT(ex_type, "curl.fail"), new String(options().url), "%s", f_curl_easy_strerror(res)); } // assure trailing zero @@ -780,8 +784,8 @@ static void _curl_load_action(Request& r VHash* vtables=new VHash; result.fields().put("tables", vtables); - for(Array_iterator i(response.headers); i.has_next(); ){ - ResponseHeaders::Header header=i.next(); + for(Array_iterator i(response.headers); i.has_next(); ){ + HTTP_Headers::Header header=i.next(); if(asked_charset) header.transcode(*asked_charset, r.charsets.source());