Open Dmcz opened 3 years ago
在使用http客户端下载文件时, 对端返回的http status code 为 419. 测试后发现下载文件的请求头中包含了 Range 但是为空. 示例:
Host: 192.168.8.52 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Content-Type: application/x-www-form-urlencoded Range:
这并不符合: Range: bytes=start-end 的格式。因此服务端会判定为异常并返回code 419. 于是试图换个思路,通过传递headers来复写请求头中的header。 当我传递Range: bytes=1-后, 发现请求头中的Range消失了....,文件可以正常的下载
Range: bytes=start-end
Range: bytes=1-
虽然目前解决了业务中的问题,但是感觉这应该属于不合理的地方。 应该修改withDownloadOffset方法当offset = 0时请求头不包含Range
withDownloadOffset
或者有没有更合适的方法来解决这个问题。 请大佬们帮忙看看。
composer info | grep saber swlib/saber v1.x-dev 7b97f01 Swoole coroutine HTTP client
PHP 8.0.10 (cli) (built: Aug 27 2021 01:57:09) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.10, Copyright (c) Zend Technologies
swoole Swoole => enabled Author => Swoole Team <team@swoole.com> Version => 4.6.7 Built => Sep 6 2021 02:26:14 coroutine => enabled with boost asm context epoll => enabled eventfd => enabled signalfd => enabled spinlock => enabled rwlock => enabled openssl => OpenSSL 1.1.1l 24 Aug 2021 dtls => enabled http2 => enabled json => enabled curl-native => enabled pcre => enabled zlib => 1.2.11 mutex_timedlock => enabled pthread_barrier => enabled async_redis => enabled
<?php use Swlib\Saber; use Swlib\SaberGM; use Swlib\Http\Exception\RequestException; require 'base.php'; \Swoole\Coroutine\run(function () { $url = 'http://192.168.8.52/group1/M00/00/00/wKgINGFEMNSAH4vNAAAsk_heX2w512.jpg?token=9ad2493d8d0c3ab2eab7d419d277992d&ts=1631953656'; $client = Saber::create(); // 请求头中存在Range, 但是Range为空 $request = $client->download($url, './test', 0, [ 'timeout' => 60, 'psr' => true ]); echo $request->getHeadersString() . PHP_EOL; echo '-----------' . PHP_EOL; // 请求头中存在Range, Range为 Range: bytes=5- $request = $client->download($url, './test', 5, [ 'timeout' => 60, 'psr' => true ]); echo $request->getHeadersString() . PHP_EOL; echo '-----------' . PHP_EOL; // 请求头中不存在Range $request = $client->download($url, './test', 0, [ 'timeout' => 60, 'psr' => true, 'headers' =>[ 'Range' => 'bytes=1-', 'Test' => 'bytes=1-', ] ]); echo $request->getHeadersString() . PHP_EOL; echo '-----------' . PHP_EOL; // 请求头中存在Range, Range为 Range: bytes=5- $request = $client->download($url, './test', 5, [ 'timeout' => 60, 'psr' => true, 'headers' =>[ 'Range' => 'bytes=1-', 'Test' => 'bytes=1-', ] ]); echo $request->getHeadersString() . PHP_EOL; echo '-----------' . PHP_EOL; });
Host: 192.168.8.52 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Content-Type: application/x-www-form-urlencoded Range: ----------- Host: 192.168.8.52 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Content-Type: application/x-www-form-urlencoded Range: bytes=5- ----------- Host: 192.168.8.52 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Content-Type: application/x-www-form-urlencoded Test: bytes=1- ----------- Host: 192.168.8.52 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 Content-Type: application/x-www-form-urlencoded Test: bytes=1- Range: bytes=5- -----------
问题描述
在使用http客户端下载文件时, 对端返回的http status code 为 419. 测试后发现下载文件的请求头中包含了 Range 但是为空. 示例:
这并不符合:
Range: bytes=start-end
的格式。因此服务端会判定为异常并返回code 419. 于是试图换个思路,通过传递headers来复写请求头中的header。 当我传递Range: bytes=1-
后, 发现请求头中的Range消失了....,文件可以正常的下载虽然目前解决了业务中的问题,但是感觉这应该属于不合理的地方。 应该修改
withDownloadOffset
方法当offset = 0时请求头不包含Range或者有没有更合适的方法来解决这个问题。 请大佬们帮忙看看。
版本信息
示例代码及结果