通过套接字发送时,显然很好的http请求结果格式错误

时间:2014-09-23 19:14:16

标签: python sockets http proxy httprequest

我正在使用套接字操作,并在python中编写了一个基本的拦截代理。它工作正常,但有些主机返回400个错误的请求响应。

但这些请求看起来并不准确。这是一个:

GET http://www.baltour.it/ HTTP/1.1
Host: www.baltour.it
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

相同的请求,raw:

GET http://www.baltour.it/ HTTP/1.1\r\nHost: www.baltour.it\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n

我用来发送请求的代码是最基本的套接字操作(虽然我不认为问题出在那里,但它适用于大多数主机)

socket_client.send(request_raw)

虽然socket_client.recv用于获取响应(但这里没有问题,响应格式正确,但状态为400)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当不与代理通信时,您不应该将http://hostname部分放在HTTP标头中;见section 5.1.2 of the HTTP 1.1 RFC 2616 spec

  

最常见的Request-URI形式是用于标识源服务器或网关上的资源。在这种情况下,必须传输URI的绝对路径(参见第3.2.1节,abs_path)作为Request-URI ,并且URI(权限)的网络位置必须在主机中传输标题字段。

(强调我的); abs_path是请求URI的绝对路径部分,而不是完整的绝对URI本身。

E.g。服务器希望您发送:

GET / HTTP/1.1
Host: www.baltour.it

然而,接收服务器应该容忍不正确的行为。服务器似乎也违反了RFC。在同一部分中进一步说明:

  

为了允许在未来版本的HTTP中转换为所有请求中的absoluteURI,所有HTTP / 1.1服务器必须接受请求中的absoluteURI表单,即使HTTP / 1.1客户端只会在对代理的请求中生成它们。