502无法解析服务器标头_编写下载服务器。 第三部分:标头:内容长度和范围...

502无法解析服务器标头

这次,我们将探索更多HTTP请求和响应标头,以改善下载服务器的实现: Content-lengthRange 。 前者表示下载量很大,后者允许部分下载文件,或者从我们开始的地方失败后继续下载。

Content-length响应标头对于跟踪下载进度的客户端非常有用。 如果在甚至开始流传输字节之前就提前发送了预期的资源大小,则Web浏览器之类的客户端可以显示非常准确的进度条,甚至可以通过测量平均下载速度来估计总下载时间。 如果没有Content-length客户端,则客户端将仅保持尽可能长的下载时间,希望流结束一天。 但是,在某些情况下很难获得准确的内容长度。 例如,也许您从其他下载服务器流式传输资源,或者您的资源被即时压缩并直接发送到Servlet响应。 在这两种情况下,您能做的最好的事情就是实际上在磁盘上本地缓存数据,弄清楚大小是多少,并在数据可用时开始流式传输。 这与始终流式传输,永远不要完全保留在内存中的建议并不矛盾。 在这种情况下,我们将临时文件存储在磁盘上,但是在完全准备好并且知道其大小后仍将流式传输。

从Java的角度来看,提供内容长度非常简单:

private ResponseEntity<Resource> response(FilePointer filePointer, HttpStatus status, Resource body) {return ResponseEntity.status(status).eTag(filePointer.getEtag()).contentLength(filePointer.getSize()).lastModified(filePointer.getLastModified().toEpochMilli()).body(body);
}

请注意,还存在一个Resource.contentLength()方法,但是不同类型的资源对它的计算方式有所不同,有时会急于读取整个资源。 我有自己的FilePointer抽象,知道我们要下载的文件大小。

Range标头是RFC 7233中很好描述的HTTP / 1.1的“新”功能。 这个想法是客户端可以仅请求一部分资源(就字节范围而言),主要有两个原因:

  • 先前的下载已中断,我们不想重复相同的工作。 在这种情况下,客户端知道收到了多少字节并要求剩余部分
  • 我们正在流式传输数据(例如视频),我们想跳过某些部分。 考虑一下像Youtube这样的在线播放器,然后单击进度条中间的。 客户可以简单地估计它现在需要文件的哪一部分,与电影持续时间成比例。

并非所有服务器都需要实现Range请求,因此需要进行一些协商。 第一个客户端发送一个请求,仅请求文件的一部分,在此示例中为前100个字节:

> GET /big_buck_bunny_1080p_surround.avi HTTP/1.1
> Range: bytes=0-99
...

如果目标服务器支持范围请求,则响应206 Partial Content

< HTTP/1.1 206 Partial Content
< Last-Modified: Tue, 06 May 2008 11:21:35 GMT
< ETag: "8000089-375a6422-44c8e0d0f0dc0"
< Accept-Ranges: bytes
< Content-Length: 100
< Content-Range: bytes 0-99/928670754

这里有很多有趣的标题。 首先是206,而不是通常的200 OK。 如果为200 OK,则客户端必须假定服务器不支持范围请求。 示例服务器的运行情况非常好,它还会向我们发送Last-ModifiedETag标头,以改善缓存。 此外,服务器通过发送Accept-Ranges标头确认其能够处理Range请求。 当前仅广泛使用bytes ,但是RFC将来允许其他范围单位(秒?帧?),最后两个标头是最有趣的。 Content-Length不再声明资源的总大小,而是我们请求的范围的大小,在这种情况下为100字节。 完整资源的大小以Content-Range编码: bytes 0-99/928670754 。 就我们收到的内容而言,服务器非常精确:前100个字节( 0-99 ),而总资源大小为928670754 。 知道客户端的总大小后,基本上可以请求多个文件中的文件部分。

Range请求的规范具有很大的灵活性,例如,我们可以在一个请求中请求多个范围,例如:

> GET /big_buck_bunny_1080p_surround.avi HTTP/1.1
> Range: bytes=0-9,1000-1009
...
< HTTP/1.1 206 Partial Content
< Accept-Ranges: bytes
< Content-Type: multipart/byteranges; boundary=5187ab27335732
<--5187ab27335732
Content-type: video/x-msvideo
Content-range: bytes 0-9/928670754[data]
--5187ab27335732
Content-type: video/x-msvideo
Content-range: bytes 1000-1009/928670754[data]
--5187ab27335732--

但是,服务器可以自由地优化多个范围请求,例如重新布置它们,合并等。从头开始实现部分请求超出了本文的范围,我希望您不必自己做。 例如,从4.2.x开始的Spring对静态资源的部分请求具有全面的内置支持,请参阅: ResourceHttpRequestHandler第463行 。

编写下载服务器

  • 第一部分:始终流式传输,永远不要完全保留在内存中
  • 第二部分:标头:Last-Modified,ETag和If-None-Match
  • 第三部分:标头:内容长度和范围
  • 第四部分:有效地执行HEAD操作
  • 第五部分:油门下载速度
  • 第六部分:描述您发送的内容(内容类型等)
  • 这些文章中开发的示例应用程序可在GitHub上找到。

翻译自: https://www.javacodegeeks.com/2015/07/writing-a-download-server-part-iii-headers-content-length-and-range.html

502无法解析服务器标头

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝pc支付php,laravel框架下的pc支付宝支付接入

Time: 14:22*/return [//pc配置pcconfig>[partner >2088302186611, //这里是你在成功申请支付宝接口后获取到的PID&#xff1b;key >sxevk9h1vekjlx4y12arl6pryrz111, //这里是你在成功申请支付宝接口后获取到的Keyseller_id >208830211, //就是partnersign_type &…

最全,面中率最高的C++经典面试题分享!

点击蓝字关注我们1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象…

mysql不同版本会覆盖吗,[mysql不同版本数据库同步]mysql数据库主从同步,master和slave上的mysql必须版本一样吗,如果不一样会有什么结果?...

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件497950890Slave_SQL_Running: No mysql同步故障解决如果数据不同步可以尝试该资料mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Running: NoLast_Errno: 1062….Seconds_Behind_Master:NU…

不可变集合相比可变集合_简单的基准测试:不可变集合VS持久集合

不可变集合相比可变集合通常&#xff0c;您需要向集合中添加新元素。 因为您是一个优秀而谨慎的开发人员&#xff0c;所以您希望尽可能保持不变。 因此&#xff0c;向不可变集合中添加新元素将意味着您必须创建一个新的不可变集合&#xff0c;其中包含原始集合的所有元素以及新…

C++ 面试被问到的“左值引用和右值引用”

点击蓝字关注我们1.左值和右值在C11中可以取地址的、有名字的就是左值&#xff0c;反之&#xff0c;不能取地址的、没有名字的就是右值&#xff08;将亡值或纯右值&#xff09;。举个例子&#xff0c;int a bc, a 就是左值&#xff0c;其有变量名为a&#xff0c;通过&a可以…

php如何解释xml,PHP – 如何解析这个xml?

我正在尝试解析下面的XML,以便最终得到一个看起来像样本的数组……我很难弄清楚如何获取标签内部的属性以输出我想要的方式它…XML我想要的数组::注意添加的数组元素Array[cust] > Array[rid] > 999999[member_id] > 12345[lname] > Doe[fname] > John[address]…

jug java_架构大型企业Java项目–我的虚拟JUG会话

jug java昨天我很荣幸被邀请参加虚拟JUG 。 这是一个很大的荣誉&#xff0c;其原因有很多&#xff1a;首先&#xff0c;我是vJUG董事会的一员&#xff0c;其次&#xff0c;因为这是我第二次向这个对Java感兴趣的伟大团队做演讲。 受到邀请总是很高兴。 架构大型企业Java项目 过…

初学者宝典:C语言入门基础知识大全

点击蓝字关注我们01C语言程序的结构认识用一个简单的c程序例子&#xff0c;介绍c语言的基本构成、格式、以及良好的书写风格&#xff0c;使小伙伴对c语言有个初步认识。例1&#xff1a;计算两个整数之和的c程序&#xff1a;#include main() {int a,b,sum; a20; /*定义变量a,b&a…

php怎么使用多个数据库,怎么在php项目中使用CI对多个数据库进行操作

怎么在php项目中使用CI对多个数据库进行操作发布时间&#xff1a;2020-12-19 16:57:21来源&#xff1a;亿速云阅读&#xff1a;87作者&#xff1a;Leah今天就跟大家聊聊有关怎么在php项目中使用CI对多个数据库进行操作&#xff0c;可能很多人都不太了解&#xff0c;为了让大家更…

qt如何捕获应用程序输出_企业应用程序中需要捕获的5大Java性能指标

qt如何捕获应用程序输出有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗&#xff1f; 立即开始免费试用 &#xff01; 前几篇文章介绍了应用程序性能管理&#xff08;APM&#xff09;&#xff0c;并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这…

C语言入门笔记,推荐收藏!

点击蓝字关注我们C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言是进…

php.c drcom,校园网绕过Drcom安装自动登录程序到路由器

简单记录一下&#xff0c;怎么在路由器上安装drcom脚本&#xff0c;实现自动登陆&#xff0c;一个路由器&#xff0c;全寝室都可以使用的方法。安装固件&#xff1a;我这里使用的是newifi mini型号的路由器下载后&#xff0c;插拔一次路由器&#xff0c;按下路由器上的reset按钮…

jax-rs jax-ws_如何以大数据的JAX-RS响应的形式将JPA结果流化/序列化

jax-rs jax-ws有时&#xff0c;有必要通过JPA检索大型数据集&#xff08;例如&#xff0c;超过1,000,000条记录&#xff09;&#xff0c;并将它们填充到java.util.List的单个实例中是有风险的&#xff08;内存障碍&#xff09;。 因此&#xff0c;这是一个快速的解决方案&#…

php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序

C 如何实现字典序排序法,自然排序类似PHP的natcasesort函数,整了一天没有头绪.数组是vector排序前:[0] > IMG0.png[1] > IMG3.png[2] > img1.png[3] > img10.png[4] > img12.png[5] > img2.png排序后:[0] > IMG0.png[1] > img1.png[2] > img2.png[3…

如何优雅地利用C++编程从1乘到20?

点击蓝字关注我们知乎的一个问题&#xff1a;答主&#xff1a;小白白。数学家版本&#xff1a;&#xff08;简单利索&#xff0c;深藏功与名&#xff09;#include <iostream> #include <cmath> int main() {std::cout << std::tgamma(20 1) << std::e…

春天猫rtsy_春天:注入列表,地图,可选对象和getBeansOfType()陷阱

春天猫rtsy如果您使用Spring框架超过一个星期&#xff0c;那么您可能已经知道此功能。 假设您有多个bean实现了给定的接口。 尝试仅自动连接此类接口的一个bean注定会失败&#xff0c;因为Spring不知道您需要哪个特定实例。 您可以通过使用Primary批注来指定一个优先于其他实现…

matlab内维尔差值代码,计算方法上机练习数值积分(包括两次作业).PDF

计算方法上机练习 数值积分(包括两次的作业 )马骢问题&#xff1a; 《计算方法引论》pp.132–133 练习分析&#xff1a;在实际应中基本的数值积分&#xff0c;可 以分为以下种类 &#xff1a;• 牛顿型 &#xff1a;在给定有 限区 间上求等距节 点上 的函数值 。如牛顿-柯茨法则…

用这个C语言骰子代码做选择

点击蓝字关注我们我相信很多人都遇到选择的事情&#xff0c;比较正常的就是&#xff0c;我拿了两个offer要如何选择。用下面这段C代码挺好的&#xff0c;你可以自己加上自己喜欢的判断。#include<stdio.h> #include<stdlib.h> #include<time.h>int main() {i…

java ee的小程序_Java EE应用程序的单片到微服务重构

java ee的小程序您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么&#xff1f; 该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序&#xff0c;以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于&#xff1a…

matlab工程计算及应用 课程名称,《 MATLAB 工程计算及应用》教学大纲课程名称MATLAB 工程计算及应用.pdf...

《MATLAB 工程计算及应用》教学大纲课程名称 MATLAB 工程计算及应用 课程编号 02T5071课程英文名称 Applications of MATLAB课程性质 选修 学时和学分 32(上机 10)/1 适用专业 工科各专业大纲执笔人 蔡哓君、郭炜 审核人 蔡晓君 先修要求 高等数学、线性代数一、课程基本目的&a…