对服务器的Python错误请求

时间:2019-02-06 00:33:32

标签: python bad-request

我编写了以下程序,用于向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.

有人可以告诉我如何解决吗?

1 个答案:

答案 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)作为行终止符。