【问题标题】:How to find an content length int in http header file如何在 http 头文件中查找内容长度 int
【发布时间】:2014-11-12 03:59:15
【问题描述】:

我正在尝试在头文件中查找内容长度的整数。我们目前使用的东西适用于某些网站,但不适用于较大的文件(超过 9999 字节)。我们如何在特定标头的末尾找到换行符,以便我们可以准确地获得内容长度的整数?

content_length = headers[headers.find("Content-Length: ")+16:headers.find("Content-Length: ")+20]

我会尝试搜索“\r\n”,但这是有问题的,因为 http 标头中有很多。很遗憾,我们无法访问 urllib。

示例标题:

GET http://example.com/ HTTP/1.1\r\n
Content-Length: 95972\r\n
Keep-Alive: 300\r\n
Connection: keep-alive\r\n\r\n

【问题讨论】:

  • 标头名称不区分大小写。只是说
  • Content-Length 的正则表达式搜索怎么样?
  • 您的示例代码中有两次对headers.find 的调用。但是您不能将此概括为查找您需要查找的换行符?

标签: python http networking


【解决方案1】:

简单。假设您的标头存储到一个字符串:

for line in headers:
    if "Content-Length:" in line:
        contentLength = line

contentLength = contentLength[16:]

警告:并非所有 HTTP 标头都包含 Content-Length,并且某些标头可能包含多个 Content-Length。

【讨论】:

  • 如果“Content-Length”稍后再次出现在标头中(例如,作为 cookie 的值),则会中断。
  • 这也是一个完全有效的警告,没有考虑 cookie。
【解决方案2】:

标题以“\r\n”结尾,而不仅仅是“\n”。请阅读 RFC for HTTP。

因此,您应该阅读 Content-Length 标头,直到您点击字符“\r”,然后您可以检查下一个字符是否为“\n”以进行确认。

或者正则表达式可以是:"Content-Length:\s+\d+\s+"

编辑 是的,正文中可以有很多“\r\n”,但您不必解析所有内容,您只需遍历以“\r\n”分隔的标题行,并获取以“内容长度”,这就是你要找的。此外,HTTP 消息正文将在“\r\n\r\n”之后开始。

【讨论】:

  • 由于我使用的是 Linux,这是一个简单的错字。在任何情况下,每一行都有一个回车,并且由于内容长度可以是任意长度,我们不能直接将其去掉。这让我回到了我提出的问题。
猜你喜欢
  • 2022-01-28
  • 2013-01-23
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2012-01-17
  • 2012-07-13
  • 2012-12-02
相关资源
最近更新 更多