我正在尝试为客户端设计一个简单的代理服务器来访问网站。我使用以下代码从客户端获取消息。
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
答案 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。有效载荷可以是任何东西。