tindy2013 / subconverter

Utility to convert between various subscription format
GNU General Public License v3.0
13.27k stars 2.84k forks source link

[BUG] 下载配置时报错,失败:HTTP返回状态码(400) #635

Open dwwangzz opened 1 year ago

dwwangzz commented 1 year ago

确认版本最新

检索issue

subconverter版本

v0.7.2

转换过程

配置文件已经下载好后,节点验证或者订阅规则转换过程

转换设置

默认配置,本地配置和远程配置都时一样的报错,可以使用:ACL4SSR_Mini 本地 精简版测试

复现步骤

subconverter转换订阅地址用clash下载报错“下载配置失败,HTTP返回状态码400”; 浏览器直接访问订阅下载地址,报错:The following link doesn't contain any valid node info: https://xxx。 但是我确定不用订阅转换直接下载配置后是有能用节点的。 然后我就测试了一下把配置base64解码后,又手动添加一个其他订阅的节点在转码后使用nginx代理,在重新使用subconverter转换,就可以成功转换了。如果需要提供订阅连接我可以提供。

期望结果

希望可以正常转换配置

实际结果

  1. 使用clash和subconverter下载订阅时报错“下载配置失败,HTTP返回状态码400”;
  2. 然后我在浏览器直接访问订阅下载地址,报错:The following link doesn't contain any valid node info: https://xxx。但是我确定不用订阅转换直接下载配置后是有能用节点的

错误信息

1. 使用clash和subconverter下载订阅时报错“下载配置失败,HTTP返回状态码400”;
2. 在浏览器直接访问订阅下载地址,报错:The following link doesn't contain any valid node info: https://xxx。但是我确定不用订阅转换直接下载配置后是有能用节点的。
tsvico commented 1 year ago

遇到同样的问题,我尝试patch src/handler/webget.cpp

diff --git a/src/handler/webget.cpp b/src/handler/webget.cpp
index 78ad4f9..643fdb2 100644
--- a/src/handler/webget.cpp
+++ b/src/handler/webget.cpp
@@ -196,8 +196,8 @@ static int curlGet(const FetchArgument &argument, FetchResult &result)
         for(auto &x : *argument.request_headers)
             list = curl_slist_append(list, (x.first + ": " + x.second).data());
     }
-    list = curl_slist_append(list, "SubConverter-Request: 1");
-    list = curl_slist_append(list, "SubConverter-Version: " VERSION);
+    // list = curl_slist_append(list, "SubConverter-Request: 1");
+    // list = curl_slist_append(list, "SubConverter-Version: " VERSION);
     if(list)
         curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list);

控制台报错 HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR

再次尝试指定http1.1

diff --git a/src/handler/webget.cpp b/src/handler/webget.cpp
index 78ad4f9..77c66d9 100644
--- a/src/handler/webget.cpp
+++ b/src/handler/webget.cpp
@@ -156,6 +156,7 @@ static inline void curl_set_common_options(CURL *curl_handle, const char *url, c
     curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 15L);
     curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, user_agent_str.data());
     curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, "");
+    curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
     if(data)
     {
         if(data->size_limit)
@@ -196,8 +197,8 @@ static int curlGet(const FetchArgument &argument, FetchResult &result)
         for(auto &x : *argument.request_headers)
             list = curl_slist_append(list, (x.first + ": " + x.second).data());
     }
-    list = curl_slist_append(list, "SubConverter-Request: 1");
-    list = curl_slist_append(list, "SubConverter-Version: " VERSION);
+    // list = curl_slist_append(list, "SubConverter-Request: 1");
+    // list = curl_slist_append(list, "SubConverter-Version: " VERSION);
     if(list)
         curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list);

控制台报错

2023/09/02 Sat 15:19:11.421269 [663 140256771570488][VERB] Fetch failed. No local cache available.
* Connected to xxxx.com (20.222.xx.0) port 443
* ALPN: offers http/1.1
* Recv failure: Connection reset by peer
* OpenSSL SSL_connect: Connection reset by peer in connection to xxxxxxx.com:443 
* Closing connection

有大佬提供更多的方案吗

ps: 0.5.2版本正常获取,但是转换出的结果在新版的openwrt上有报错

dwwangzz commented 1 year ago

你好!你发的邮件我已经收到!                       ——正                                    

dwwangzz commented 1 year ago

目前我还没有好的办法,如果能生成配置文件,就可以先把配置文件导出来看看,具体是哪个规则出问题了。我的问题和你还不大一样,我是下载订阅配置的时候就直接失败

Mythologyli commented 1 year ago

可以试试这个使用 openssl 的版本 #644

https://github.com/Mythologyli/subconverter-curl-openssl/actions/runs/6498803908

dwwangzz commented 1 year ago

你好!你发的邮件我已经收到!                       ——正