HTTP/1.1 400 错误请求。命令部分数量错误

HTTP/1.1 400 Bad Request. Bad number of command parts

我正在尝试执行本书第 12 章中的以下代码 "Python for Informatics"。

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print data
mysock.close()

根据本书,脚本应打印以下内容:

HTTP/1.1 200 OK Date: Sun, 14 Mar 2010 23:52:41 GMT Server: Apache Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT ETag: "143c1b33-a7-4b395bea" Accept-Ranges: bytes Content-Length: 167 Connection: close Content-Type: text/plain But soft what light through yonder window breaks It is the east and Juliet is the sun Arise fair sun and kill the envious moon Who is already sick and pale with grief

不幸的是,变量数据填充了以下字符串:

'HTTP/1.1 400 Bad Request. Bad number of command parts ['GET', 'http://www.py4inf.com/code/romeo.txt', 'HTTP/1.0', 'X-WS-Ver:', '1.0']'

对于这个错误我找不到任何好的解释。希望有人能帮忙!

在您的 Python 安装、机器或网络上,某些东西正在重写请求并注入自己的代码。主要嫌疑人是

  • 任何以 "Anti-Virus"
  • 形式销售的商品
  • 任何以 "Network Security Solution"
  • 形式销售的商品
  • 您的计算机或路由器上有恶意软件
  • 一个network-wide(透明)代理
  • 您的 Python 程序或安装中的库
  • 您的 ISP 或网络管理员

在您的情况下,此服务想要注入完全无用的 header X-WS-Ver。但是,此服务对 HTTP 的解释比您和 py4inf.com 服务器的解释更严格; HTTP 行应该以 \r\n 结尾,但您只使用 \n。此服务修改您发送至

的数据
GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\nX-WS-Ver: 1.0\r\n\r\n

或类似的东西。这当然是此服务的一个非常错误的行为。由于新请求不再是有效的 HTTP,py4inf.com 将 return 一条错误消息,正确地表明它收到的请求格式错误 (400 Bad request)。

要使您的程序运行,您可以选择以下任一选项:

  • 如果您的本地机器上有问题,请禁用有问题的服务(如果它无用且错误地修改连接,则它不太可能提供太多(如果有的话)安全性),或者使用另一台机器
  • 获得不受限制的网络访问,也许在 VPN 提供商的帮助下
  • 发送正确的 HTTP,即
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n')
#                                                             ^^  ^^
  • 使用加密连接(使用 Python 的 ssl 模块),即 https:// 方案下的 URL。