lingochamp / FileDownloader

Multitask、MultiThread(MultiConnection)、Breakpoint-resume、High-concurrency、Simple to use、Single/NotSingle-process
Apache License 2.0
11.02k stars 2.2k forks source link

response code error: 403, #1346

Open kayesn786 opened 4 years ago

kayesn786 commented 4 years ago

request headers: {Range=[bytes=0-0], User-Agent=[FileDownloader/1.7.7]} response headers: {null=[HTTP/1.1 403 Forbidden], Alt-Svc=[h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"], Content-Length=[1103], Content-Type=[text/html; charset=UTF-8], Date=[Tue, 30 Jun 2020 15:10:23 GMT], X-Android-Received-Millis=[1593529823253], X-Android-Response-Source=[NETWORK 403], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1593529817185]}

Seachal commented 7 months ago

对我来说, 第一个版本服务端没有对文件下载进行鉴权限制,可以正常下载,第二个版本,服务端开始改造增加鉴权,对已经调用过一次的下载链接进行失效处理,我这边就会遇到下面这样的异常,

ava.net.SocketException: Connection failed with request[{Range=[bytes=4073926-8147851], User-Agent=[FileDownloader/1.7.7]}] response[{null=[HTTP/1.1 403 Forbidden], Access-Control-Allow-Methods=[GET], Access-Control-Allow-Origin=[*], Connection=[keep-alive], Content-Length=[238], Content-Type=[text/html], Date=[Mon, 29 Jan 2024 02:42:16 GMT], EagleId=[907b1f2217064961368347077e], Server=[Tengine], Timing-Allow-Origin=[*], Via=[cache14.cn1306[,0]], X-Android-Received-Millis=[1706496136376], X-Android-Response-Source=[NETWORK 403], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1706496136196]}] http-state[403] on task[-891346639-1], which is changed after verify connection, so please try again.   

最终发现是因为 下载库默认开启断点续传。

image

Range 是一个请求首部,告知服务器返回文件的哪一部分。在一个 Range 首部中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206 Partial Content 状态码。假如所请求的范围不合法,那么服务器会返回 416 Range Not Satisfiable 状态码,表示客户端错误。服务器允许忽略 Range 首部,从而返回整个文件,状态码用 200

所以我这边的情况是,服务端做修改适配客户端的断点续传,客户端不需要修改。