python socket bad request 400

Col*_*Lee 1 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
Run Code Online (Sandbox Code Playgroud)

而且,我得到了输出:

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
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*eld 5

HTTP 1.1要求您传输Host包含所有请求的标头.来自RFC 1626第14.23节:

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

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

或者,您可以使用HTTP 1.0而不是HTTP 1.1.HTTP 1.0不需要Host标题,因此如果您连接的服务器上只有一个网站,它可能有效,但如果它托管多个网站,您可能仍然会收到400错误.