2016-09-27 80 views
1

我试图从“Python for Informatics”一书的第12章中执行以下代码。HTTP/1.1 400错误请求。错误的命令部分数量

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 日期:孙老师,2010 3月14日23时52分41秒GMT 服务器:Apache 最后修饰:星期二,2009年12月29日1时31分22秒GMT 的ETag: “143c1b33-a7-4b395bea” 接受-范围:字节 的Content-Length:167 连接:关闭 的Content-Type:text/plain的 但通过那柔软的光线窗口打破 那是东方朱丽叶就是太阳 起来美丽的太阳,杀死羡慕月亮 谁已经面色惨白悲伤

不幸的是,可变数据充满以下字符串:

'HTTP/1.1 400错误请求。命令部分差多少[ 'GET', 'http://www.py4inf.com/code/romeo.txt', 'HTTP/1.0', 'X-WS-版本:', '1.0']”

我找不到这个错误有什么好的解释。我希望有人能帮帮忙!

+0

你是否使用套接字来设置它?您可以使用请求库:'requests.get(url).text'。 – postelrich

+0

我得到'HTTP/1.1 200 OK'运行上面的代码。 – Ahmad

+0

GET /code/romeo.txt HTTP/1.1 \ r \ n主机:www.py4inf.com \ r \ n用户代理:Mozilla/5.0(X11; Ubuntu; Linux x86_64; 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 \ nAccept-Encoding:gzip,deflate \ r \ nConnection:keep-alive \ r \ nUpgrade-Insecure-Requests:1 \ r \ n \ r \ n''我删除了答案,因为每个异常或步骤都需要大量的定义。 – dsgdfg

回答

1

在你的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 Bad request)。

为了使您的工作方案,您可以采取以下任何选项:

  • 如果你的本地计算机上的东西是问题,禁用有问题的服务(如果它白白,并错误地修改连接,这是不太可能提供太多,如果有的话,安全反正),或使用另一台机器
  • 获得无限制的网络访问,可能与一个VPN提供商
  • 的帮助下发送适当的HTTP,即
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n') 
#                ^^ ^^ 
  • 使用下https://方案的加密连接(与Python的ssl模块),即网址。
+0

谢谢你的好解释,解决方案3工作 –

+0

太棒了!出于兴趣,您是否有任何想法可以默默修改您的数据?我仔细研究了一下,唯一可以找到的头文件是恶意软件,这也可以解释非常糟糕的实现。您是否可以在同一网络上使用另一台计算机(如果可能使用不同的操作系统)或另一个网络上的当前计算机重现原始问题? – phihag

+0

我必须检查它,但由于我有相当多的安全软件,我怀疑是这样。 –

-1

您需要更改 mysock.send( 'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0 \ n \ n') 到

mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r \n') 

,要正确结束的字节流,你需要使用“\ r \ n“,另外:你不应该使用一个字节对象的套接字?

+0

不幸的是,这导致了相同的输出。 –

+0

你也可以在最后尝试“\ r \ n \ r \ n”,这应该有效。 – Jerrynicki