【问题标题】:Why is HTTP status-line different from the request-line为什么 HTTP 状态行与请求行不同
【发布时间】:2019-11-23 08:41:17
【问题描述】:

HTTP Request-Line 和 Status-Line 都有 3 个组件:

Request-Line= Method       SP Request-URI SP HTTP-Version  CRLF
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

状态行(服务器响应)很好:

  • 它以 HTTP 版本(与任何协议一样)开头,因此解码器可以根据第一个字段对其进行解析
  • 后跟一些协议定义的值(状态代码),即单个单词且不需要任何 SP/CR/LF 字符
  • 以任何 TEXT 字符(CR/LF 除外)作为原因短语结尾。

我不明白为什么 Request-Line 如此不同:

  • HTTP 版本在末尾​​li>
  • 必须对 Request-URI 进行转义以避免出现 SP/CR/LF 字符(这里是著名的 %20)

为什么它不遵循与状态行相同(干净)的模式?

Request-Line= HTTP-Version SP Method     SP Request-URI CRLF

这样,Request-URI 可以是任何 TEXT 字符(CR/LF 除外)

所以它看起来像这样:

HTTP/1.1 GET /user/with space
...

HTTP/1.1 404 NOT FOUND
...

见:

【问题讨论】:

  • 就是这样。没有特别的原因。
  • 即使更改了顺序,也不会更改 URI 中允许的字符集。
  • 如果唯一有问题的地方 \r \n 可能会极大地影响授权字符集

标签: http http-1.1


【解决方案1】:

它可能来自HTTP/0.9,早期的协议版本。

请求部分是:

GET http://www.example.com/foo.html\r\n

响应部分是响应正文(没有标题),因此直接以 <html> 开头的 html 响应为例。

请求行是:

METHOD OSP Absolute-Request-URL CRLF
  • 为 OSP 提供了很多可选空间,例如制表符或换页符
  • 位置部分也有主机部分(今天的协议仍然支持)

重要的是没有没有协议版本,也没有协议部分。在响应和请求中。

在创建 HTTP/1.0 时,隐含需要仍然支持 HTTP/0.9 请求和响应。一些服务器今天仍在做的事情。

在响应端添加了所有响应标头部分(例如说明响应的 mime 类型!),并且第一行是根据响应的协议版本开始的这个好主意构建的。

在请求方面,添加了协议版本作为可选添加,因此您仍然可以决定发出 HTTP/0.9 请求还是新版本,最重要的是,HTTP/0.9 服务器可能仍然可以理解您的查询(并忽略 SP PROTOCOL 添加(甚至在请求中添加的可选标头)。 今天,如果您忘记了请求的协议部分,兼容 HTTP/0.9 的服务器将只解析您的请求的第一行并忽略额外的标头。

这些是等效的查询(但第一个是在 http 0.9 中,不会在响应中得到任何标题):

# HTTP 0.9:
GET http://www.example.com/foo.html\r\n
# HTTP/1.0 version:
GET http://www.example.com/foo.html HTTP/1.0\r\n
\r\n
# or
GET /foo.html HTTP/1.0\r\n
Host: www.example.com\r\n
\r\n
#or
GET http://www.example.com/foo.html HTTP/1.0\r\n
Host: www.foo.com\r\n
\r\n

我认为他们一直在考虑解析器中需要的代码更新,并且在第一行末尾添加协议更容易实现。也许旧的解析器仍然可以向 HTTP/1.0 查询发送 0.9 响应(这很糟糕但易于编写)。

也许只是在现有行上添加一些东西似乎更像是一种改进,而不是在现有协议的行上添加前缀。

也许您此时应该已经足够大,可以评论 RFC 并告诉他们您的方式会更优雅(这是正确的):-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 2017-05-14
    • 2022-01-08
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2011-08-02
    • 2022-01-08
    相关资源
    最近更新 更多