--- parser3/src/classes/curl.C 2016/08/03 20:35:36 1.41 +++ parser3/src/classes/curl.C 2016/11/24 19:24:45 1.47 @@ -17,7 +17,7 @@ #include "pa_http.h" #include "ltdl.h" -volatile const char * IDENT_CURL_C="$Id: curl.C,v 1.41 2016/08/03 20:35:36 moko Exp $"; +volatile const char * IDENT_CURL_C="$Id: curl.C,v 1.47 2016/11/24 19:24:45 moko Exp $"; class MCurl: public Methoded { public: @@ -153,7 +153,7 @@ static void _curl_session(Request& r, Me } static void _curl_version_action(Request& r, MethodParams& ){ - r.write_no_lang(*new VString(*new String(f_curl_version(), String::L_TAINTED))); + r.write(*new VString(*new String(f_curl_version(), String::L_TAINTED))); } static void _curl_version(Request& r, MethodParams& params){ @@ -276,6 +276,7 @@ public: CURL_OPT(CURL_INT, SSL_VERIFYHOST); CURL_OPT(CURL_STRING, SSL_CIPHER_LIST); CURL_OPT(CURL_INT, SSL_SESSIONID_CACHE); + CURL_OPT(CURL_INT, SSLVERSION); PARSER_OPT(PARSER_LIBRARY, "library"); PARSER_OPT(PARSER_NAME, "name"); @@ -409,7 +410,7 @@ static void curl_setopt(HashStringValue: throw Exception("curl", 0, "called with invalid option '%s'", key.cstr()); CURLcode res = CURLE_OK; - Value &v=r.process_to_value(*value); + Value &v=r.process(*value); switch (opt->type){ case CurlOption::CURL_STRING:{ @@ -516,7 +517,7 @@ static void curl_setopt(HashStringValue: } case CurlOption::PARSER_RESPONSE_CHARSET:{ // 'response-charset' parser option - options().response_charset=&::charsets.get(v.as_string()); + options().response_charset=&pa_charsets.get(v.as_string()); break; } } @@ -532,8 +533,8 @@ static void _curl_options(Request& r, Me if(HashStringValue* options_hash=params.as_hash(0)){ if(Value* value=options_hash->get("charset")){ // charset should be handled first as params may require transcode - Value &v=r.process_to_value(*value); - options().charset=&::charsets.get(v.as_string()); + Value &v=r.process(*value); + options().charset=&pa_charsets.get(v.as_string()); } options_hash->for_each(curl_setopt, r); } @@ -574,13 +575,13 @@ static void _curl_info(Request& r, Metho curl_infos=new CurlInfoHash(); if(params.count()==1){ const String &name=params.as_string(0, "name must be string"); - r.write_assign_lang(*curl_getinfo(name)); + r.write(*curl_getinfo(name)); } else { VHash& result=*new VHash; for(CurlInfoHash::Iterator i(*curl_infos); i; i.next() ){ result.get_hash()->put(i.key(), curl_getinfo(i.key(), i.value())); } - r.write_no_lang(result); + r.write(result); } } @@ -616,7 +617,13 @@ static int curl_header(char *data, size_ size=size*nmemb; if(size>0){ - result->add_header(pa_strdup(data, size)); + char *header=pa_strdup(data, size); + if(!pa_strncasecmp(header, "HTTP/") && !strchr(header, ':')){ + // response code, clearing possible headers from previous requests + result->clear(); + } else { + result->add_header(header); + } } return size; } @@ -673,7 +680,7 @@ static void _curl_load_action(Request& r asked_charset=detect_charset(response.content_type.cstr()); if(options().is_text) - asked_charset=charsets.checkBOM(body.buf, body.length, asked_charset); + asked_charset=pa_charsets.checkBOM(body.buf, body.length, asked_charset); if (!asked_charset) asked_charset = options().charset; @@ -713,7 +720,7 @@ static void _curl_load_action(Request& r if(Value *vcookies=vtables->hash().get("SET-COOKIE")) result.fields().put(HTTP_COOKIES_NAME, new VTable(parse_cookies(r, vcookies->get_table()))); - r.write_no_lang(result); + r.write(result); } static void _curl_load(Request& r, MethodParams& params){