Python HTTP/1.1400错误请求。命令部分的数量不正确

Python HTTP/1.1400错误请求。命令部分的数量不正确,python,sockets,http,web,bad-request,Python,Sockets,Http,Web,Bad Request,我试图执行《Python for Informatics》一书第12章中的以下代码 导入套接字 mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流) connect(('www.py4inf.com',80)) mysock.send('GEThttp://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 尽管如此: data=mysock.recv(512) 如果(len(数据)

我试图执行《Python for Informatics》一书第12章中的以下代码

导入套接字
mysock=socket.socket(socket.AF\u INET,socket.SOCK\u流)
connect(('www.py4inf.com',80))
mysock.send('GEThttp://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
尽管如此:
data=mysock.recv(512)
如果(len(数据)<1):
打破
打印数据
mysock.close()
根据该书,脚本应打印以下内容:

HTTP/1.1200ok 日期:2010年3月14日星期日23:52:41 GMT 服务器:Apache 最后修改:2009年12月29日星期二01:31:22 GMT ETag:“143c1b33-a7-4b395bea” 接受范围:字节 内容长度:167 连接:关闭 内容类型:文本/纯文本 但是透过那边窗户的光线打破了什么 它是东方,朱丽叶是太阳 升起美丽的太阳,杀死嫉妒的月亮 谁已经病了,悲伤得脸色苍白

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

'HTTP/1.1 400错误的请求。命令部分的数量错误['GET','','HTTP/1.0','X-WS-Ver:','1.0']


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

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

  • 任何被宣传为“反病毒”的东西
  • 任何被称为“网络安全解决方案”的产品
  • 计算机或路由器上的恶意软件
  • 网络范围(透明)代理
  • Python程序或安装中的库
  • 您的ISP或网络管理员
在您的情况下,此服务希望注入一个完全无用的头
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将返回一条错误消息,正确指示它接收的请求格式错误(
400错误请求

要使程序正常工作,您可以选择以下任一选项:

  • 如果您的本地计算机出现问题,请禁用有问题的服务(如果该服务无效且错误地修改了连接,则无论如何都不可能提供太多(如果有的话)安全性),或者使用另一台计算机
  • 获得不受限制的网络访问,可能需要VPN提供商的帮助
  • 发送正确的HTTP,即
  • 使用加密连接(使用Python模块),即
    https://
    方案下的URL

您是否已设置为此使用套接字?您可以使用请求库:
requests.get(url).text
。我正在运行上述代码。
'get/code/romeo.txt HTTP/1.1\r\n主机:www.py4inf.com\r\n用户代理:Mozilla/5.0(X11;Ubuntu;Linux x8664;rv:48.0)Gecko/20100101 Firefox/48.0\r\n接受:text/html、application/xhtml+xml、application/xml;q=0.9,*/*;q=0.8\r\n接受语言:en-US,en;q=0.5\r\n接受编码:gzip,deflate\r\n连接:保持活动\r\n升级不安全请求:1\r\n\r\n'
我删除答案,因为每个异常或步骤都需要大量定义。太好了!出于兴趣,您是否知道哪个服务可以默默地修改您的数据?我进一步研究了它,我能找到的关于这个标题的唯一参考是恶意软件,这也解释了非常劣质的实现。你能用同一网络上的另一台计算机(如果可能的话,使用不同的操作系统)或另一网络上的当前计算机重现原始问题吗?我必须检查一下,但由于我有大量的安全软件,我怀疑是这样的。
GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\nX-WS-Ver: 1.0\r\n\r\n
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n')
#                                                             ^^  ^^