我正在尝试编写自己的http代理服务器,我有一个关于协议的问题。
首先,我想提到我使用this page作为参考。我认为这是准确的,但也是1998年的。如果有人能给我一个更好的推荐人,我将非常感谢他们。
所以基本上我理解连接是从握手开始的。我收到一个CONNECT
请求、代理授权等,然后连接到请求的资源URI中指定的主机和端口。然后我发送一个状态行,理想情况下是HTTP/1.1 200 Connection established
,后面跟着一些头和一个类似crlf的normal。
一旦握手完成,我的客户机和我的客户机请求的主机就通过我的代理服务器连接。我应该双向隧道数据,这是有意义的,因为我可以通过这个基于HTTP的代理连接支持任何类型的基于TCP的协议,包括HTTPS甚至WebSocket。
对我来说没有意义的是我怎么知道什么时候该停下来。如果这个代理能够真正支持任何基于tcp的协议,那么我不知道如何知道交互何时结束。http消息将是简单的两步读写,https交互将涉及多个这样的交换,websocket交互将涉及无限多个交换。
我不是在要求一个完美的解决方案。我很高兴看到像超时这样务实的做法,但我想知道为了尽可能好地完成这个项目,标准的最佳实践是什么。
谢谢大家的帮助。
最佳答案
只需同时向两个方向复制数据,直到读取流的末尾。然后:
关闭对面的套接字进行写入,并停止向该方向复制。将状态方程传播到对等方。
如果从中读取eos的套接字已经关闭以进行写入(您必须记住),请关闭两个套接字。
关于http - 如何知道何时在HTTP代理连接中停止数据隧道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33641790/