代理服务器无法从服务器接收响应的原因

2024-10-03 00:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 服务器消息客户端代理messageutfencodingaddr
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:14
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。有效载荷可以是任何东西

相关问题 更多 >