python socket bad request 400

时间:2014-10-13 02:59:30

标签: python http

我有一个代码,我想使用python(2.7.6)套接字在网站上请求一个文本文件。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
h='58.68.237.xxx'
p=80
s.connect((h,p))
m='GET / HTTP/1.1\r\n\r\n'
s.sendall(m)
r=s.recv(4096)
print r

而且,我得到了输出:

HTTP/1.1 400 Bad Request\r\n
Date: Mon, 13 Oct 2014 02:46:15 GMT\r\n
Server: Apache/2.2.3 (CentOS)\r\n
Content-Length: 300\r\nConnection: close\r\n
Content-Type: text/html; charset=iso-8859-1\r\n
\r\n
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 //EN">\n
<html><head>\n
<title>400 Bad Request</title>\n
</head><body>\n
<h1>Bad Request</h1>\n
<p>Your browser sent a request that this server could not understand.<br/>\n
</p>\n<hr>\n
<address>Apache/2.2.3 (CentOS) Server at 127.0.0.1 Port 80</address>\n
</body></html>\n

问题: 我的代码出了什么问题? 如何解决好请求?

3 个答案:

答案 0 :(得分:5)

HTTP 1.1要求您为所有请求传输Host标头。来自RFC 1626 section 14.23

  

客户端必须在所有HTTP / 1.1请求中包含Host头字段      消息。 [...]全部      基于Internet的HTTP / 1.1服务器必须以400(错误请求)响应      任何缺少Host头的HTTP / 1.1请求消息的状态代码      字段。

Host标题的原因是,如果在同一IP地址上提供多个网站,则允许服务器消除访问哪个网站的歧义。

或者,您可以使用HTTP 1.0而不是HTTP 1.1。 HTTP 1.0不需要Host标题,因此如果您连接的服务器上只有一个网站,它可能会有效,但如果它拥有多个网站,那么您和&# #39; ll可能仍会出现400错误。

答案 1 :(得分:2)

我尝试使用HTTP 1.0并且工作正常:

m = 'GET / HTTP/1.0\r\nHost: www.cnn.com\r\n\r\n'

答案 2 :(得分:1)

添加Host标题:

m = 'GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n'

用您的IP地址替换www.cnn.com

相关问题