【问题标题】:HTTP Request\Response Header GrammarHTTP 请求\响应标头语法
【发布时间】:2014-12-18 14:35:48
【问题描述】:

在 HTTP 请求或响应的标头中,标头键在服务器之间的大小写方面将保持不变。

我问,所以我可以在我的代码中期待:(使用假函数名称)

安全精确的 Python 代码

for hdr in header.keys():
    if 'content-length' == hdr.lower():
        recv_more_data( header[hdr] )    # header[hdr] == Content-Length (5388) bytes
        break    # Exit for loop when if statement is met.

我想使用的代码

 recv_more_data (header['Content-Length'])    
 # I know to expect 'Content-Length' not 'content-Length' or some other variation

这意味着服务器将永远返回带有键的标头。

标准要求

GET / HTTP/1.1
Host: www.example-host.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: */*
Accept-Language: en-US
Accept-Encoding: gzip
Connection: closed
Content-Length: 0

一个糟糕但可能的反应?

HTTP/1.1 200 OK
Server: nginx/1.0.15
date: Thu, 23 Oct 2014 00:25:37 GMT
content-Type: text/html; charset=iso-8859-1
transfer-encoding: chunked
Connection: close
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip

澄清有助于我的代码整洁。

【问题讨论】:

    标签: http http-headers httprequest httpresponse


    【解决方案1】:

    请记住,尽管大多数主要服务器的大小写一致,但任何 Joe PHP 开发人员都可以在其代码中手动设置响应标头 - 并且无法监管该人使用什么作为大小写标准。

    【讨论】:

    • 是的,这是我的不适。当我的代码正在与“Joe PHP Devolper”编写的网站交谈时。
    【解决方案2】:

    根据 HTTP 规范,HTTP 标头名称不区分大小写

    RFC 2616 - 超文本传输​​协议 -- HTTP/1.1
    Section 4.2 - 消息头

    HTTP 标头字段,其中包括 general-header(第 4.5 节), request-header(第 5.3 节)、response-header(第 6.2 节)和 entity-header(第 7.1 节)字段,遵循相同的通用格式 在 RFC 822 [9] 的第 3.1 节中给出。每个头域包括 名称后跟冒号 (":") 和字段值。 字段名称 不区分大小写。 字段值前面可以有任何数量 LWS 的,尽管单个 SP 是首选。标题字段可以是 通过在每个额外的行前面加上 at 来扩展多行 至少一个 SP 或 HT。应用程序应遵循“通用形式”,其中 一个是已知的或指示的,在生成 HTTP 结构时,因为 可能存在一些无法接受任何内容的实现 超越常见的形式。

    RFC 7230 - 超文本传输​​协议 (HTTP/1.1):消息语法和路由
    Section 3.2 - 标题字段:

    每个标题字段由一个不区分大小写的字段名称组成 由冒号 (":")、可选的前导空格、字段值和 可选的尾随空格。

    【讨论】:

    • 好的很好。我假设服务器将始终处理区分大小写的部分。到目前为止,我检查过的标题必须是这样的情况。这就是为什么我很好奇。谢谢雷米
    • 您的编辑更有帮助。我的标头解析期望第一个冒号带有空格':'而不仅仅是冒号':'
    • 雷米,如果您愿意回答,还有一个问题。发送请求时,您认为我应该发送“标准”方式还是可以接受全部小写?不是根据RFC 而是为了正确的网络交互?
    • 您应该与大多数实现使用的内容以及 RFC 如何演示它们保持一致。
    • 正确,但这里没有必要提及 RFC 2616。
    【解决方案3】:

    HTTP 标头名称不区分大小写。

    看起来你正在使用 python。查看requests 库。它会让您的生活更加更轻松:http://docs.python-requests.org/en/latest/

    【讨论】:

    • 是的。我很了解这个模块。我只是重新发明*以更好地掌握网络编程,而不是应用程序构建。