我试图执行本书第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;
我找不到任何有关此错误的好解释。我希望有人可以帮忙!
答案 0 :(得分:2)
在Python安装,机器或网络上,有些东西正在重写请求并注入自己的代码。主要嫌疑人
在您的情况下,此服务需要注入一个完全无用的标头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
)。
要使您的程序正常运行,您可以选择以下任何选项:
400 Bad request
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\r\n\r\n')
# ^^ ^^
计划下的网址。