From 94ee74764950e4283be88b265326c373427c4b85 Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Mon, 20 Sep 2021 22:20:30 +0800 Subject: [PATCH] Fix Gist upload and other web operation may fail to post data Remove unused files in Docker images. Cleanup codes. --- scripts/Dockerfile | 2 +- src/handler/webget.cpp | 178 ++++------------------------------ src/handler/webget.h | 3 +- src/parser/infoparser.cpp | 1 - src/script/script_quickjs.cpp | 2 +- 5 files changed, 25 insertions(+), 161 deletions(-) diff --git a/scripts/Dockerfile b/scripts/Dockerfile index f3de278..37eb88b 100644 --- a/scripts/Dockerfile +++ b/scripts/Dockerfile @@ -38,7 +38,7 @@ RUN apk add --no-cache --virtual .build-tools git g++ build-base linux-headers c mv subconverter /usr/bin && \ mv base ../ && \ cd .. && \ - rm -rf subconverter quickjspp libcron toml11 && \ + rm -rf subconverter quickjspp libcron toml11 /usr/lib/lib*.a /usr/include/* /usr/local/include/lib*.a /usr/local/include/* && \ apk add --no-cache --virtual subconverter-deps pcre2 libcurl yaml-cpp libevent && \ apk del .build-tools .build-deps diff --git a/src/handler/webget.cpp b/src/handler/webget.cpp index 55f8108..a62c4e5 100644 --- a/src/handler/webget.cpp +++ b/src/handler/webget.cpp @@ -231,13 +231,19 @@ static int curlGet(const FetchArgument &argument, FetchResult &result) { case HTTP_POST: curl_easy_setopt(curl_handle, CURLOPT_POST, 1L); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, argument.post_data.data()); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, argument.post_data.size()); + if(argument.post_data) + { + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, argument.post_data->data()); + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, argument.post_data->size()); + } break; case HTTP_PATCH: curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "PATCH"); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, argument.post_data.data()); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, argument.post_data.size()); + if(argument.post_data) + { + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, argument.post_data->data()); + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, argument.post_data->size()); + } break; case HTTP_HEAD: curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L); @@ -249,14 +255,16 @@ static int curlGet(const FetchArgument &argument, FetchResult &result) unsigned int fail_count = 0, max_fails = 1; while(true) { - *result.status_code = curl_easy_perform(curl_handle); - if(*result.status_code == CURLE_OK || max_fails >= fail_count) + retVal = curl_easy_perform(curl_handle); + if(retVal == CURLE_OK || max_fails >= fail_count) break; else fail_count++; } - curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &retVal); + long code = 0; + curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &code); + *result.status_code = code; if(result.cookies) { @@ -277,9 +285,9 @@ static int curlGet(const FetchArgument &argument, FetchResult &result) curl_easy_cleanup(curl_handle); - if(data) + if(data && !argument.keep_resp_on_fail) { - if(*result.status_code != CURLE_OK || retVal != 200) + if(retVal != CURLE_OK || *result.status_code != 200) data->clear(); data->shrink_to_fit(); } @@ -316,7 +324,7 @@ std::string webGet(const std::string &url, const std::string &proxy, unsigned in int return_code = 0; std::string content; - FetchArgument argument {HTTP_GET, url, proxy, "", request_headers, nullptr, cache_ttl}; + FetchArgument argument {HTTP_GET, url, proxy, nullptr, request_headers, nullptr, cache_ttl}; FetchResult fetch_res {&return_code, &content, response_headers, nullptr}; if (startsWith(url, "data:")) @@ -386,138 +394,29 @@ void flushCache() operateFiles("cache", [](const std::string &file){ remove(("cache/" + file).data()); return 0; }); } -int curlPost(const std::string &url, const std::string &data, const std::string &proxy, const string_array &request_headers, std::string *retData) -{ - CURL *curl_handle; - CURLcode res; - struct curl_slist *list = NULL; - long retVal = 0; - - curl_init(); - curl_handle = curl_easy_init(); - list = curl_slist_append(list, "Content-Type: application/json;charset='utf-8'"); - for(const std::string &x : request_headers) - list = curl_slist_append(list, x.data()); - - curl_progress_data limit; - curl_set_common_options(curl_handle, url.data(), &limit); - curl_easy_setopt(curl_handle, CURLOPT_POST, 1L); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data.data()); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, data.size()); - curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writer); - curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, retData); - curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list); - if(proxy.size()) - curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy.data()); - - res = curl_easy_perform(curl_handle); - curl_slist_free_all(list); - - if(res == CURLE_OK) - { - curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &retVal); - } - - curl_easy_cleanup(curl_handle); - - return retVal; -} - int webPost(const std::string &url, const std::string &data, const std::string &proxy, const string_icase_map &request_headers, std::string *retData) { //return curlPost(url, data, proxy, request_headers, retData); int return_code = 0; - FetchArgument argument {HTTP_POST, url, proxy, "", &request_headers, nullptr, 0}; + FetchArgument argument {HTTP_POST, url, proxy, &data, &request_headers, nullptr, 0, true}; FetchResult fetch_res {&return_code, retData, nullptr, nullptr}; return webGet(argument, fetch_res); } -int curlPatch(const std::string &url, const std::string &data, const std::string &proxy, const string_array &request_headers, std::string *retData) -{ - CURL *curl_handle; - CURLcode res; - long retVal = 0; - struct curl_slist *list = NULL; - - curl_init(); - - curl_handle = curl_easy_init(); - - list = curl_slist_append(list, "Content-Type: application/json;charset='utf-8'"); - for(const std::string &x : request_headers) - list = curl_slist_append(list, x.data()); - - curl_progress_data limit; - curl_set_common_options(curl_handle, url.data(), &limit); - curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "PATCH"); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data.data()); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, data.size()); - curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writer); - curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, retData); - curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list); - if(proxy.size()) - curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy.data()); - - res = curl_easy_perform(curl_handle); - curl_slist_free_all(list); - if(res == CURLE_OK) - { - res = curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &retVal); - } - - curl_easy_cleanup(curl_handle); - - return retVal; -} - int webPatch(const std::string &url, const std::string &data, const std::string &proxy, const string_icase_map &request_headers, std::string *retData) { //return curlPatch(url, data, proxy, request_headers, retData); int return_code = 0; - FetchArgument argument {HTTP_PATCH, url, proxy, "", &request_headers, nullptr, 0}; + FetchArgument argument {HTTP_PATCH, url, proxy, &data, &request_headers, nullptr, 0, true}; FetchResult fetch_res {&return_code, retData, nullptr, nullptr}; return webGet(argument, fetch_res); } -int curlHead(const std::string &url, const std::string &proxy, const string_array &request_headers, std::string &response_headers) -{ - CURL *curl_handle; - CURLcode res; - long retVal = 0; - struct curl_slist *list = NULL; - - curl_init(); - - curl_handle = curl_easy_init(); - - list = curl_slist_append(list, "Content-Type: application/json;charset='utf-8'"); - for(const std::string &x : request_headers) - list = curl_slist_append(list, x.data()); - - curl_progress_data limit; - curl_set_common_options(curl_handle, url.data(), &limit); - curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, writer); - curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, &response_headers); - curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L); - curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list); - if(proxy.size()) - curl_easy_setopt(curl_handle, CURLOPT_PROXY, proxy.data()); - - res = curl_easy_perform(curl_handle); - curl_slist_free_all(list); - if(res == CURLE_OK) - res = curl_easy_getinfo(curl_handle, CURLINFO_HTTP_CODE, &retVal); - - curl_easy_cleanup(curl_handle); - - return retVal; -} - int webHead(const std::string &url, const std::string &proxy, const string_icase_map &request_headers, std::string &response_headers) { //return curlHead(url, proxy, request_headers, response_headers); int return_code = 0; - FetchArgument argument {HTTP_HEAD, url, proxy, "", &request_headers, nullptr, 0}; + FetchArgument argument {HTTP_HEAD, url, proxy, nullptr, &request_headers, nullptr, 0}; FetchResult fetch_res {&return_code, nullptr, &response_headers, nullptr}; return webGet(argument, fetch_res); } @@ -533,39 +432,4 @@ string_array headers_map_to_array(const string_map &headers) int webGet(const FetchArgument& argument, FetchResult &result) { return curlGet(argument, result); - /* - switch(argument.method) - { - case HTTP_GET: - return curlGet(argument, result); - case HTTP_POST: - { - string_array request_header; - if(argument.request_headers != nullptr) - request_header = headers_map_to_array(*argument.request_headers); - int res = curlPost(argument.url, argument.post_data, argument.proxy, request_header, result.content); - *result.status_code = res; - return res; - } - case HTTP_PATCH: - { - string_array request_header; - if(argument.request_headers != nullptr) - request_header = headers_map_to_array(*argument.request_headers); - int res = curlPatch(argument.url, argument.post_data, argument.proxy, request_header, result.content); - *result.status_code = res; - return res; - } - case HTTP_HEAD: - { - string_array request_header; - if(argument.request_headers != nullptr) - request_header = headers_map_to_array(*argument.request_headers); - int res = curlHead(argument.url, argument.proxy, request_header, *result.response_headers); - *result.status_code = res; - return res; - } - } - return -1; - */ } diff --git a/src/handler/webget.h b/src/handler/webget.h index 8ce1a4a..b8c3f56 100644 --- a/src/handler/webget.h +++ b/src/handler/webget.h @@ -20,10 +20,11 @@ struct FetchArgument const http_method method; const std::string url; const std::string proxy; - const std::string post_data; + const std::string *post_data = nullptr; const string_icase_map *request_headers = nullptr; std::string *cookies = nullptr; const unsigned int cache_ttl = 0; + const bool keep_resp_on_fail = false; }; struct FetchResult diff --git a/src/parser/infoparser.cpp b/src/parser/infoparser.cpp index 495a574..be01a0d 100644 --- a/src/parser/infoparser.cpp +++ b/src/parser/infoparser.cpp @@ -86,7 +86,6 @@ bool getSubInfoFromHeader(const std::string &header, std::string &result) bool getSubInfoFromNodes(const std::vector &nodes, const RegexMatchConfigs &stream_rules, const RegexMatchConfigs &time_rules, std::string &result) { std::string remarks, stream_info, time_info, retStr; - string_size spos; for(const Proxy &x : nodes) { diff --git a/src/script/script_quickjs.cpp b/src/script/script_quickjs.cpp index ead3274..c696227 100644 --- a/src/script/script_quickjs.cpp +++ b/src/script/script_quickjs.cpp @@ -370,7 +370,7 @@ static qjs_fetch_Response qjs_fetch(qjs_fetch_Request request) } std::string response_headers; - FetchArgument argument {method, request.url, request.proxy, request.postdata, &request.headers.headers, &request.cookies, 0}; + FetchArgument argument {method, request.url, request.proxy, &request.postdata, &request.headers.headers, &request.cookies, 0}; FetchResult result {&response.status_code, &response.content, &response_headers, &response.cookies}; webGet(argument, result);