问题标签 [http-range]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1690 浏览

http - Content-Range 用于恢复未知长度的文件

我从已经压缩的现有材料(使用 Node)即时创建了一个长度未知的 ZIP 存档。在 ZIP 存档中,文件只是被存储;ZIP 仅用于拥有一个容器。这就是缓存创建的 ZIP 文件没有意义的原因 - 不涉及真正的计算。

到目前为止,好的。现在我想允许恢复下载,并且我正在阅读有关 Accept-Range、Range 和 Content-Range HTTP 标头的信息。下载损坏的客户端会要求一个开放范围,例如:Range: bytes=8000000-.

我该如何回答?根据RFC 2616 § 14.16 ,我的答案必须包含一个 Content-Range 标头,并且在那里:

与 byte-ranges-specifier 值(参见第 14.35.1 节)不同,byte-range-resp-spec 必须只指定一个范围,并且必须包含范围的第一个和最后一个字节的绝对字节位置。

所以我不能只发送“从位置 X 开始的所有内容”,我还必须指定发送的最后一个字节——要么只发送已知大小的一部分,要么提前计算长度。这两种想法都不适合我的情况。还有其他可能吗?

0 投票
2 回答
3223 浏览

java - 使用“Range”标头时,无法让 Java 的 GZIPInputStream 从服务器读取“gzip”响应

我有一些代码我已经使用了一段时间来从 Web 服务器获取数据,几个月前,我添加了压缩支持,这似乎适用于整个文档所在的“常规”HTTP 响应包含在响应中。Range不过,当我使用标题时,它似乎不起作用。

这是执行实际工作的代码:

用标头点击 URLAccept-Encoding: gzip,deflate,identity效果很好:我可以看到服务器以压缩格式返回数据,上面的代码很好地解压缩了它。

如果我再添加一个Range: bytes=0-50标题,我会得到以下异常:

511我的代码中的行是包含调用in.read()的行。响应包括以下标头:

我已经验证,如果我不尝试解压缩响应,我实际上会在响应中得到 51 个字节......这不是服务器故障(至少我可以说)。我的服务器(Apache httpd)不支持“deflate”,所以我不能测试另一个压缩方案(至少现在不行)。

我还尝试请求更多数据(例如目标资源中总共 751 个字节中的 700 个字节),但我得到了同样的错误。

有什么我想念的吗?

更新 对不起,我忘了包括我在 Linux 上点击 Apache/2.2.22。我不知道有任何服务器错误。我在验证从服务器检索的压缩字节时会遇到一些麻烦,因为“gzip”内容编码非常简单……例如,我相信我不能只在命令行上使用“gunzip”解压缩这些字节。不过,我会试一试。

0 投票
3 回答
4023 浏览

c# - RangeFileContentResult 和带有远程请求的视频流

我有一个应用程序,旨在从我们的本地数据库流式传输视频。昨天我花了很多时间试图返回数据 aRangeFileContentResultRangeFileStreamResult没有成功。

简而言之,当我将文件作为这两个结果中的任何一个返回时,我似乎无法正确播放视频(或根本无法播放)。

来自浏览器的请求使用以下标头发送:

提供的响应以这些标头为例:

在网络流量方面,我得到了一系列 206 的部分结果,最后是 200(根据提琴手),这似乎是正确的。Chrome 的网络选项卡不同意这一点,并看到一个初始请求(我认为是握手总是 13 个字节),然后是几个状态为已取消或待处理的请求。据我了解,这或多或少是正确的,206 - 取消,206 - 取消等。但视频永远不会播放。

如果我将结果从我的控制器切换到 FileResult,视频播放和 Chrome、IE10 和 Firefox,并且似乎在下载结束之前开始播放(感觉有点像流媒体!虽然我怀疑不是)

但是对于范围结果,我在 chrome 或 IE 中一无所获,并且在 Firefox 中一滴就能下载整个视频。

据我了解,RangeFileContentResult应该处理响应客户端并下载一系列字节(我的似乎没有这样做,它只是告诉它获取整个文件(如上面的响应所示))。客户应该对此做出回应,但它似乎没有这样做。

有人对这方面有任何想法吗?具体来说:

a) 应该RangeFileContentResult将一系列字节发送回客户端?b)有什么方法可以显式控制从客户端请求的字节范围?c)在请求时,是否有任何原因或我做错了什么会导致浏览器根本不加载视频RangeFileContentResult

编辑:添加了一个图表来帮助描述我所看到的:

范围请求图像

EDIT2:好的,所以情节变厚了。在使用 RangedFile gubbins 时,我们需要推出另一个系统测试版本,我在控制器操作中留下了“RangeFileContentResult”,如下所示:

相当奇怪的是,这现在似乎在我们的 Azure 系统测试环境上按预期工作,但在我的本地计算机上仍然没有。我想知道是否有一些基于 IIS 的东西在 Azures IIS8 上运行良好,但在我的本地 7.5 实例上却没有?

0 投票
2 回答
2699 浏览

python - 试图将文件下载缓冲区拆分为单独的线程

我正在尝试将文件缓冲区下载到 5 个线程中,但它似乎变得乱码。

更新: 所以我努力工作并取得了一点进展,但是如果我下载 jpg 它似乎已损坏;

下面是下载后的图像。

损坏的图像

0 投票
0 回答
198 浏览

python - 线程完成字节范围后如何将文件块写入磁盘

从这里继续:https ://codereview.stackexchange.com/questions/

我发现在列表中保存数据字节可能很昂贵并且可能会降低系统性能,所以我认为最好在该线程的范围完成后立即将数据写入磁盘,因此其余的块完成应该写入来自队列中下一个线程完成的范围块..

那么如何在线程完成字节范围后立即将文件块写入磁盘?

0 投票
2 回答
2148 浏览

php - 使用 PHP 的 AES 128 位 CTR 部分文件解密

这不是重复的帖子,因为我到处都看过,但找不到答案。它关于部分解密。不满。

我对 PHP 有很好的了解,但对密码学知之甚少。我知道加密文件的密钥和 iv。该文件整体解密良好,但当我尝试从中间解密部分文件时出现真正的问题。

当我尝试解密文件的前 128kb 或 256kb 或文件开头的任何长度时,它解密得很好。但是当我从中间开始时,它不会解密而是给出乱码输出。

我将在这里发布文件前 100 个字节的示例。

加密为 AES 128 位 CTR 模式。

我使用了 PHP 的 mdecrypt_generic 和 mcrypt_decrypt 函数都没有成功。

使用的代码:

结果:

如你看到的。解密后,结果是文件的前 100 个字节包含数字 1的序列。该文件由 Mega.co.nz 使用 JavaScript 加密。根据 Mega 的文档,该文件已被分块加密以进行部分加密/解密。

文件加密

MEGA 使用客户端加密/解密来端到端保护文件传输和存储。从客户端接收的数据被逐字存储和传输;服务器既不解密也不重新加密,也不验证传入用户文件的加密。所有加密处理都在最终用户的控制之下。为了允许进行完整性检查的部分读取,文件被视为一系列块。为了简化服务器端处理,部分上传只能在块边界上开始和结束。此外,部分下载只有在满足相同标准时才能进行完整性检查。块边界位于以下位置:0 / 128K / 384K / 768K / 1280K / 1920K / 2688K / 3584K / 4608K /。(每 1024 KB)/EOF

我正在使用此函数计算文件的块边界:

我曾尝试单独解密第二个块,但失败了。由于显而易见的原因,我无法在此处发布 128kb 的块,但我将向您展示从第 2 个字节到第 100 个字节的块。这是相同代码的结果:

使用的代码:

结果:

结果与mcrypt_module_open('rijndael-128', '', 'ctr', '');

我需要部分解密文件,因为我正在尝试为支持并行连接/恢复支持的 Mega 编写开源下载管理器。

我需要即时解密文件以允许文件流式传输,因此下载后解密是不可能的。

在 mega 的网站上,他们自己的下载界面使用多个连接并以块的形式下载文件,还有另一个 Web 服务允许从 Mega 下载具有多个连接和恢复支持。

我需要解密部分文件以支持来自浏览器/下载管理器的 HTTP Range 标头请求。如果范围请求落在第二个或第三个块中,我需要能够解密该块并将其发送给客户端,而无需从头开始解密文件。

甚至可能吗?应该是因为有些网站已经做到了。

0 投票
0 回答
1492 浏览

python - 如何像使用 urllib2 一样重用请求模块来拆分范围标头

我有一些未重构的代码,如果在单个块中请求下载文件,我使用请求模块下载,但由于我无法弄清楚如果请求拆分为范围(irange in这种情况下)使用多个线程如何使用请求模块来实现相同的。

如何像使用 urllib2 一样重用 requests 模块来拆分范围标头?

0 投票
1 回答
420 浏览

restsharp - 无法在 RestSharp 请求中添加 Range 标头

我使用 RestSharp 执行以下请求

我使用 Fiddler 检查请求,我看到除 Range 之外的所有标头都可见。为什么?

在此处输入图像描述

0 投票
1 回答
93 浏览

http - HTTP 内容协商和 Range 标头

Range标头如何与Content Negotiation一起使用?让我解释一下,但首先让我们都同意以下几点:HTTP 是一种无状态协议。

当 HTTP 服务器能够发送单个资源的多个表示时,内容协商用于确定要发送的表示:客户端可能会指示其偏好(即英语和 GIF),然后服务器将遵守或 - 在以下情况下它不能——服务器会通过一些启发式评估来选择发送给客户端的表示。

到目前为止一切都很好......但是当你投入其中时会发生什么Range

想象以下场景:

John 在巴黎的一个机场,他的浏览器发送一个 HTTP 请求。出于某种原因,他的浏览器没有显示任何内容类型、语言或压缩方面的偏好。

由于它几乎没有经过,服务器通过一些启发式方法,决定发送 URI 的法语表示(IP 被识别为来自法国。)

在传输过程中,John 停止下载以赶上他的航班。约翰一到纽约就恢复下载。

同样,在客户端偏好信息很少的情况下,服务器这次决定发送 URI 的英文表示(IP 被识别为来自纽约。)

至此,该文件已损坏,因为它的一部分是法语,另一部分是英语。

推测:

  • 客户端可能会记住第一个响应中的内容类型和语言,以便将该信息发送回服务器以用于第二个请求(在 下Accept: text/html Accept-Language: fr)。但是,由于RFC2616RFC7233都对此进行了说明(甚至不是建议),我相信具有这种行为的 HTTP 客户端很少见……但我还没有对其进行测试。

笔记:

  • 在上面的场景中,我们可以很容易地让客户端发送首选项并让服务器无法遵守......并且仍然回退到其他启发式方法。问题仍然存在。
  • 作为另一个例子,这个问题也存在于另一个 SO 问题中:Sample http range request session

TL;博士

在上面,范围适用于所请求资源的哪种表示?!

0 投票
2 回答
71 浏览

http - 使用范围的拒绝服务攻击

https://www.rfc-editor.org/rfc/rfc7233#section-6.1

6.1。使用范围的拒绝服务攻击...服务器应该忽略、合并或拒绝严重的范围请求,例如对两个以上重叠范围的请求或对单个集合中的许多小范围的请求,特别是当范围被请求时没有明显原因的顺序。多部分范围请求并非旨在支持随机访问。...

是否有“一个集合中有许多小范围”的定义?