HTTP / 1.1 400错误请求。命令部件数量不正确

时间:2016-09-27 12:06:47

标签: python sockets http web bad-request

我试图执行本书第34章的第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好的   日期:太阳,2010年3月14日23:52:41 GMT   服务器:Apache   最后修改时间:2009年12月29日星期二01:31:22 GMT   ETag:&#34; 143c1b33-a7-4b395bea&#34;   Accept-Ranges:字节   内容长度:167   连接:关闭   Content-Type:text / plain   但柔和通过窗户打破的光线   它是东部,朱丽叶是太阳   太阳公平,杀死羡慕的月亮   谁已经病了,悲伤苍白

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

  

&#39; HTTP / 1.1 400错误请求。命令部件数量不正确[&#39; GET&#39;,&#39; http://www.py4inf.com/code/romeo.txt&#39;,&#39; HTTP / 1.0&#39;,&#39; X-WS-Ver :&#39;,&#39; 1.0&#39;]&#39;

我找不到任何有关此错误的好解释。我希望有人可以帮忙!

1 个答案:

答案 0 :(得分:2)

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

  • 以&#34; Anti-Virus&#34;
  • 销售的任何商品
  • 任何以&#34;网络安全解决方案&#34;
  • 销售的产品
  • 计算机或路由器上的恶意软件
  • 网络范围(透明)代理
  • Python程序或安装中的库
  • 您的ISP或网络管理员

在您的情况下,此服务需要注入一个完全无用的标头X-WS-Ver。但是,这种服务对HTTP的解释比你和py4inf.com服务器的解释更严格; HTTP行应该以{{1​​}}结尾,但您只使用\r\n。此服务会修改您发送到

的数据
\n

或类似的东西。这当然是这项服务非常错误的行为。由于新请求不再是有效的HTTP,py4inf.com将返回错误消息,正确地指示它收到的请求格式错误(GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\nX-WS-Ver: 1.0\r\n\r\n )。

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

  • 如果您的本地计算机上存在问题,请禁用违规服务(如果它无用且不正确地修改连接,它不太可能提供太多(如果有的话)安全性),或使用其他计算机
  • 可以在VPN提供商的帮助下获得不受限制的网络访问
  • 发送正确的HTTP,即
400 Bad request
  • 使用加密连接(使用Python的ssl模块),即mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n') # ^^ ^^ 计划下的网址。