我正在使用套接字操作,并在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)。
有什么想法吗?
答案 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客户端只会在对代理的请求中生成它们。