我编写了以下程序,用于向Python添加HTTP请求:
import socket
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org',80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)
print('first half done')
while True:
data = mysock.recv(512)
if (len(data) < 1):
break
print(data.decode())
mysock.close()
这是运行python之后的结果。
HTTP/1.1 400 Bad Request
Date: Wed, 06 Feb 2019 00:09:46 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 308
Connection: close
Content-Type: text/html; charset=iso-8859-1
Your browser sent a request that this server could not understand.
有人可以告诉我如何解决吗?
答案 0 :(得分:1)
问题是由行尾引起的。尝试使用\n
代替\r\n
:
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
此行为在RFC2616中进行了解释:
消息标题字段的行终止符是序列CRLF。但是,我们建议应用程序在解析此类标头时,将单个LF识别为行终止符,并忽略开头的CR。
很明显,Web服务器(Apache/2.4.18 (Ubuntu)
)不遵循上述建议,仅接受CRLF(\r\n
)作为行终止符。