TeaOSLab / EdgeAdmin

CDN & WAF集群管理系统。
https://goedge.cloud
BSD 3-Clause "New" or "Revised" License
82 stars 42 forks source link

基于node.js的客户端请求GoEdge系统CDN大概率会返回 read ECONNRESET #25

Closed owlvlwo closed 1 year ago

owlvlwo commented 1 year ago

情景再现: GoEdge版本:1.2.2 node.js 代码:

const https = require('https'); https.get('https://xxx.com/test', (response) => { // GoEdge系统的CDN api接口 let todo = ''; // called when a data chunk is received. response.on('data', (chunk) => { todo += chunk; }); // called when the complete response is received. response.on('end', () => { console.log(JSON.parse(todo).title); }); }).on("error", (error) => { console.log("Error: " + error.message); });

正常情况:上面的接口是 https://xxx.com/test.json (有文件后缀) 时无论怎样请求都是正常返回数据 不正常情况:上面的接口是 https://xxx.com/test (无文件后缀) 时大概率(源站距离节点越远概率越大)会返回 read ECONNRESET (自动读数据超时 | 自动写数据超时都已经选中)

带着疑问去了 GoEdge 群里找答案,有个人反馈的是 goedge1.21-1.12.2 版本使用 clash 无法获取订阅,这个clash for windows 正是基于node.js的客户端。那个人已经回退了版本暂时解决。

暂时发现影响的是没有后缀的url会报错

iwind commented 1 year ago

可以把带扩展名和不带扩展名的两次请求的Request报头和Response报头都贴出来,方便我诊断问题。

owlvlwo commented 1 year ago

可以把带扩展名和不带扩展名的两次请求的Request报头和Response报头都贴出来,方便我诊断问题。

Request报头如上,没带任何东西 Response报头任何时候(无论正常还是返回 read ECONNRESET 的时候)都会返回如下

{ 'accept-ranges': 'bytes', 'content-length': '14384', 'content-type': 'application/octet-stream', date: 'Sun, 23 Jul 2023 13:45:46 GMT', etag: '"64bcbcba-3830"', 'last-modified': 'Sun, 23 Jul 2023 05:38:02 GMT', server: 'openresty', 'x-cache': 'BYPASS', connection: 'close' }

下面这是cloudflare的Response报头,所有请求都是正常的

{ date: 'Sun, 23 Jul 2023 14:10:56 GMT', 'transfer-encoding': 'chunked', connection: 'close', 'cache-control': 'max-age=3600', expires: 'Sun, 23 Jul 2023 15:10:56 GMT', location: 'https://xxx.com/1.json', 'report-to': '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=..."}],"group":"cf-nel","max_age":604800}', nel: '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}', server: 'cloudflare', 'cf-ray': '7eb4827f3809e0a4-NRT', 'alt-svc': 'h3=":443"; ma=86400' }

iwind commented 1 year ago

你把源站的content-type改成别的,比如 application/json 之类的内容试试,因为application/octet-stream会被识别为数据流传输。

owlvlwo commented 1 year ago

你把源站的content-type改成别的,比如 application/json 之类的内容试试,因为application/octet-stream会被识别为数据流传输。

感谢,源站改为 application/json 问题就解决了,只是好多没有文件后缀的接口都要去加上这个content-type去适配,麻烦一点,起码能正常用了

iwind commented 1 year ago

GoEdge不会返回Connection: close,我在想你在GoEdge之前是不是还有别的代理服务

owlvlwo commented 1 year ago

没有代理服务,源站就是nginx 我的客户端环境是win+node.js,请求任何http都会返回 connection: 'close' ,无论套没套cdn,还是cf的cdn。

iwind commented 1 year ago

根据现有提供的信息,无法准确重现此问题,所以关闭此issue。

iwind commented 1 year ago

Finally,在Windows上+Node.js复现了此问题,并将在下个发行版本中得到修复。