为什么代理服务器无法收到来自服务器的响应

时间:2021-02-13 10:17:12

标签: python sockets

我正在尝试为客户端设计一个简单的代理服务器来访问网站。我使用以下代码从客户端获取消息。

tcpSerSock.bind(('', 9999))
tcpSerSock.listen(1)
tcpCliSock, addr = tcpSerSock.accept()
print("Received a connection from:", addr)# Fill in start.
message = tcpCliSock.recv(1024).decode(encoding="utf-8")

然后我尝试将消息从代理转发到服务器,然后从服务器获取文件,以便我可以将其从代理服务器发送到客户端。

proxySock = socket(AF_INET, SOCK_STREAM)
proxySock.connect(('baidu.com', 80))
proxySock.sendall(message.encode(encoding="utf-8"))
respondMsg = proxySock.recv(1024).decode(encoding="utf-8")

但是,代理无法接收来自服务器的消息,似乎是因为“服务器已重置”。我做了一些研究,发现它可能与发送给它的消息有关。该消息如下所示,我不知道它有什么问题,因为它是从客户端获得的。有人可以帮我找出问题所在吗?

GET /www.baidu.com HTTP/1.1
Host: localhost:9999
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

1 个答案:

答案 0 :(得分:0)

<块引用>
GET /www.baidu.com HTTP/1.1
Host: localhost:9999

这不是服务器期望的消息。服务器期待这样的消息

  GET / HTTP/1.1
  Host: www.baidu.com

因此,您不能简单地将收到的消息转发到服务器,而必须对其进行更改。请注意,从我的测试中,服务器不会重置连接,而是会回复

HTTP/1.1 500 Internal Server Error
Server: bfe
...

除此之外:

message = tcpCliSock.recv(1024).decode(encoding="utf-8")
...
proxySock.sendall(message.encode(encoding="utf-8"))
respondMsg = proxySock.recv(1024).decode(encoding="utf-8")

传输的数据不应被视为 UTF-8,而应被视为二进制。事实上,历史上 HTTP 标头允许 ISO-8859-1 编码,尽管现在它仅被定义为 ASCII。有效载荷可以是任何东西。