4.HTTP消息

4.1消息类型

HTTP消息由客户端发到服务器端的request和相反方向的response组成。

HTTP-message = Request | Response ; HTTP/1.1 messages

Request(sec5)和response(sec6)消息使用RFC822[9]的通用消息格式来传递实体(message的有效负荷)。由一个开始行,0或多个头区(头部),一个空行(在CRLF前什么也没有)来指示头区结束,和一个可能的body。

generic-message = start-line

*(message-header CRLF)

CRLF

[ message-body ]

start-line = Request-Line | Status-Line

为了保持健壮性,服务器应该在Request-Line被期待的地方忽略任何空行。换句话说,如果服务器在消息的开始读协议流,首先接收了一个CRLF,它应该忽略crlf。

某些臭虫很多的HTTP/1。0client实现产生额外的CRLF在一个POSTrequest后。重申一下在BNF处的禁令,一个HTTP/1。1client绝对不能在一个request的前后加CRLF。

4.2消息头

HTTP头区,包含general-header (section 4.5), request-header (section 5.3), response-header

(section 6.2),和entity-header (section 7.1) fields,遵从通用的格式定义(sec3.1RFC822[9])。每一个头区由一个名字跟着一个:和一个区值组成。区名是大小写不敏感的。区值可以一任何数目的LWS开头,虽然一个SP最好。头区可以扩展成多行,当然需要使用最少一个SP或HT来作为多出行的引导。应用应该遵从都知道的或被指明的通用形式来产生HTTP结构,因为可能出现某些应用无法接受超出通用形式的东西。

message-header = field-name ":" [ field-value ]

field-name = token

field-value = *( field-content | LWS )

field-content =

and consisting of either *TEXT or combinations

of token, separators, and quoted-string>

field-content并没有包含任何打头的或结尾的LWS:出现在非空格字符前或后。而这样出现的LWS可以在不改变区值语义的情况下被删除掉。任何出现在field-content之间的LWS可以在解释区值或转向消息流前以SP取代之。

不同区名的头区出现顺序不相同也没有关系。但是,最好首先发送通用头区,然后是request或response头区,以entity-header头区结束。

在一个消息中可以出现多头区对应同一个区名,只要对那个头区的头区值是可以用逗号分隔的列表。必须可能把多个头区合并成“name:value”对而不改变语义。顺序是重要的,因为解释需要顺序,而且因此一个proxy绝对不能改变顺序。

4.3消息体

HTTP消息的消息体被用来携带跟随request和response的实体。消息体只在一个传输编码被使用时才和实体不同。

message-body = entity-body

|

当要保证消息被安全和合适传输时需要传输编码,Transfer-Encoding就是用来指示传输编码的。这是消息的一个属性,而不是实体的,因此可以在request/response链中被增加或删除。(但是,sec3.6增加了什么时候可以用这个属性)。

什么情况下确定消息中有一个消息体在request和response不同的。

Request是当包含Content-Length或Transfer-Encoding头区时有消息体。如果一个request的方法定义中不允许一个消息体包含在消息中发送,那么就绝对不能。一个server应该读或传递一个消息中的消息体,而如果request中的方法定义中没有指示消息体,那就应该忽略过去。

对于response,有无则依赖于request的方法和response的状态码(sec6.1.1)。所有对应HEADrequest方法的肯定没有,即使实体头区的存在可能让人相信它存在。所有的1xx,204和304也肯定没有。所有其它的一定有,即使它可能是0长度。

4.4消息长度

消息长度是指在传输编码使用后消息体的长度。当一个消息体被包含在一个消息中时,体长由下面决定(按优先级的顺序):

1.任何肯定不包含一个消息体的response消息总是在第一个空行处终结,而无论出现在消息中的实体的头区。

2.如果一个Transfer-Encoding头区(sec14.41)被给出而且只有”identity”,那么传输长度是使用“chunked”传输编码,直到连接被关闭消息被终结。

3.如果一个Content-Length头区(sec14.13)被给出,那么它既代表了实体长度也代表了传输长度。如果这两个长度不相等肯定不会有Content-Length。如果一个消息既存在Transfer-Encoding又存在Content-Length,后者被忽略。

4.如果消息使用“multipart/byteranges”做媒体类型,并且transfer-length也没被给出,那么这个自定界的媒体类型定义了传输长度。这个类型如果接收者无法解析它那肯定不能被使用;在一个request中,如果包含一个Range头和若干byte-range说明那个client能够解析multipart/ranges。一个rang头可能被一个不理解multipart/byteranges的proxy传递,在这种情况下,server必须使用1,3,5提供的方法定界。

5.到server关闭一个连接(关闭连接不能被用来指示一个request的结束,因为那样将导致server无法发送一个response。)

为了和HTTP/1。0应用兼容,包含一个消息体的。1请求肯定包含一个有效的Content-Length

除非知道server是HTTP/1。1兼容。如果一个request包含一个消息体而没有

Content-Length,那么server如果不能决定消息的长度应该回以400,或411如果它坚持接收一个有效Content-Length。

所有接收实体的HTTP/1。1应用必须接收“chunked”传输编码(sec3.6),因此允许使用这个机制决定消息长度。

消息绝对不能同时包含Content-Length头区和一个非identity传输编码。如果一定包含,那么Content-Length被忽略。

如果一个Content-Length真被给出了,那它一定对应消息体的字节个数。HTTP/1。1user agent必须告诉用户如果一个无效长度被接受和看到。

4.5通用头区

有一些头区在request和response中通用,但是不能用于被传输的实体。这些头区只用于被传递的消息。

general-header = Cache-Control ; Section 14.9

| Connection ; Section 14.10

| Date ; Section 14.18

| Pragma ; Section 14.32

| Trailer ; Section 14.40

| Transfer-Encoding ; Section 14.41

| Upgrade ; Section 14.42

| Via ; Section 14.45

| Warning ; Section 14.46

通用头区的名字可以跟随一个改变的版本号而被扩展。但是,新的或实验的头区可以被给通用头区的语义如果通讯双方都认同。认不出的头区被认为是实体头区。

java http 1.1_HTTP1.1翻译 - 彪悍的人生不需要解释 - BlogJava相关推荐

  1. 彪悍的人生不需要解释

    彪悍的人生不需要解释. 走自己子的路,总有一天我会气死那些看不起我的人. 转载于:https://blog.51cto.com/kinglovelqn/1288071

  2. 帝国的黄昏(4):彪悍的人生只需要一篇论文

    来源/作者:飞总聊IT 数据猿官网 | www.datayuan.cn 今日头条丨一点资讯丨腾讯丨搜狐丨网易丨凤凰丨阿里UC大鱼丨新浪微博丨新浪看点丨百度百家丨博客中国丨趣头条丨腾讯云·云+社区 1 ...

  3. 程序员的大学|彪悍的人生可以没有妹,但必须要有技术!

    高尔基曾说"书籍是人类进步的阶梯",作为过来人来说,读书读好书真的很重要.昨晚回头翻看了一下图书馆的借书历史记录,我自己也被吓到了,到目前为止竟然借了339本之多,主要是在大二和大 ...

  4. 他51岁,给卫星写代码:彪悍的人生,从来不怕晚!

    昨天,又有一个中年程序员被裁员了.   他们和领导做朋友,容易被100万存款满足--这些中年危机的人,都有什么特点? 1.总有忙的理由.可以开一整天会,但不能坐下来看1小时书. 2.生活节奏基本不变. ...

  5. 彪悍的代码不需要解释_巨魔神大人带领大家走向胜利_:P

    考虑两种方法: 1,一台消息机, 消息机上传递着各种不同的消息. 2, 一台消息机, 消息机运行各种不同的状态. 如果采用方法1,区分因消息而区分.同时因为有很多消息是大同小异的, 即类型一致的, 在 ...

  6. 知乎热议:28岁郭宇期权过亿,彪悍从字节退休,旅居日本开温泉酒店

    点击上方"视学算法",选择"星标" 干货第一时间送达 整理:公众号@新智元 本文仅做学术分享,如有侵权,请联系删除. 最近28岁程序员郭宇宣布退休上了知乎热搜. ...

  7. “彪悍的代码 不羁的创意”—— 网易云信全国高校MINI开发挑战赛战队招募启动...

    4月18日,以"彪悍的代码 不羁的创意"为主题,由网易旗下通讯与视频云服务品牌网易云信主办的"2019全国高校MINI开发挑战赛"正式启动.全国"技术 ...

  8. 熟悉又陌生 彪悍徐茂栋的双面人生

    "该出手时出手,该冷静时冷静."唯快不破和专注极致,是互联网时代的两个重要铁律,作为一个20年成功的连续创业者,时任窝窝商城董事长兼CEO徐茂栋的创业经历,即是这样的体现. 外界对 ...

  9. 起点低,是彪悍的最好证明!

    阅读本文大概需要4分钟. 一个读者的问题:洋哥,我老家是农村的,只考上了专科,毕业后北漂两年月薪才7000,每天都会很焦虑,想努力但想到自己的过去,又怀疑努力是否有用. 和这个读者聊了很久,说了一大段 ...

  10. 微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

    作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 格子衬衫.常掉发.双肩包.修电脑.加班多--这些似乎成了大众给程序员的固定标签.近几年流行的"跨界风"开始刷新人们对 ...

最新文章

  1. 以太坊源码分析之随心笔记
  2. Python-EEG工具库MNE中文教程(14)-Epoch对象中的元数据(metadata)
  3. 【线性表4】线性表的链式实现:静态表
  4. 全球及中国阻力损失注射器行业“十四五”发展战略规划分与未来需求预测报告2021-2027年版
  5. Flutter一切皆widget但是不要将所有东西放入一个widget
  6. nodeJs 操作数据库
  7. 一些css3简单的练习
  8. Modifier ‘public‘ is redundant for interface methods错误
  9. mysql my.ini配置优化_求高手帮我优化一下 mysql 的 my.ini
  10. angular之service、factory预provider区别
  11. video.h5.player.js视频播放器
  12. C++和VC++学习方法
  13. 使用C语言绘制变换前与变换后的三角形图形——变换矩阵
  14. java实现手写签名_手写签字,保存笔迹到图片
  15. 基于视觉的车道线识别技术在智能车导航中的应用研究
  16. 论文阅读:GMAN: A Graph Multi-Attention Network for Traffic Prediction
  17. 【奇思妙想】0.1元成本柿饼派实现红外控制空调了
  18. 游戏美术设计之整体世界的画法-张聪-专题视频课程
  19. 网络安全与渗透:文件包含漏洞(十一)此生无悔入华夏,男儿何不带吴钩
  20. 如何查看Outlook搜索出的邮件所在的文件夹

热门文章

  1. 2020年黄历表_2020年黄历表(死亡时辰吉凶对照表)
  2. 2021-09-06张博
  3. python实现简单的词形统计
  4. Leetcode实战:121.买卖股票的最佳时机
  5. 2020 SSR落地开花的三大机遇
  6. 第八节课-深度学习软件
  7. C++指针(pointer)
  8. 软件工程第二次作业——git的使用
  9. android 获取alertdialog的view,Android开发实现AlertDialog中View的控件设置监听功能分析...
  10. pdf照片显示正常打印时被翻转_2020年二级建造师打印须知