编写C HTTP代理服务器 - 如何接收和重定向HTTP响应

时间:2012-03-12 01:53:50

标签: http proxy network-programming

我正在使用firefox进行测试。服务器从字符串接收来自firefox的HTTP请求,现在我不确定如何处理它。我是否需要连接到端口8080并以字符串形式发送请求?然后听8080端口的响应?如果是这样,响应将会是什么?我不确定期望什么类型的内容。一串HTML?然后我将其发送回firefox,也作为字符串?

另外,fyi,从其他阅读中我已经认识到有很多不同类型的代理 - 我对此还不知道。我的代理只需要作为客户和实际互联网之间的中间人,不做任何其他事情。

2 个答案:

答案 0 :(得分:5)

代理HTTP的规则实际上非常复杂。但你可能会忽略大部分内容,特别是如果你不关心表现。

首先,你必须听一些端口。您需要解析收到的查询。它将包含一些行,每行后跟一个CRLF对。您将通过两个CRLF对知道查询头的结尾。可以有一个查询体(如果这是一个POST),你不想解析它,因为它很复杂。所以这就是你如何伪造它:

  1. 检查查询是否有Connection个标头。如果你得到了,请删除它们。

  2. 在另一端建立与服务器的连接。

  3. 发送请求和请求标头后,但在标记请求标头结束的第二个CRLF之前,添加Connection: close标头。然后发送第二个CRLF。

  4. 现在代理两个方向。如果您懒得使用selectpoll,则可以使用其他流程或其他主题。确保正确代理半封闭连接。 (浏览器可能会在完成查询时关闭发送 - 它仍在监听回复。)

  5. 浏览器不应尝试重新使用该连接。如果是HTTP / 1.0,它将需要特定的权限来做到这一点,它将无法获得。如果是HTTP / 1.1,则服务器应接受其Connection: close请求,并使用自己的Connection: close标头进行响应。

  6. 请注意,HTTPS实际上更简单。如果您还需要支持请求,则必须解析CONNECT个请求。但是,您只需连接到另一方,报告成功或失败,然后进入双向代理模式。

答案 1 :(得分:1)

您必须解析请求以获取客户端所需的URL。该URL包含您需要的信息:要连接的服务器的名称。客户端正在连接到您的代理,但实际上需要http://example.com。您必须与example.com建立连接。之后,您可以成为一个完全透明的TCP代理。正确处理双向数据传输,以及TCP半关闭。转发您截取和解析的请求。

你是对的,因为有不同种类的代理,因为代理并不总是透明的。代理可以提供额外的身份验证和加密。或者它可以过滤HTML:例如删除或缩小图像,以便在低带宽网络上更快地冲浪。或者它可以为整个局域网提供缓存,因此人们不会多次下载同一个文件。

您应该做的第一件事是为TCP编写完全通用的代理:端口转发器。这是一个配置了要连接的IP和端口号的程序。它侦听客户端连接,连接到配置的IP和端口目标,然后在该客户端和客户端之间传递数据。

如果你不能写这个,你将无法制作一个类似的HTTP代理,但从客户端请求获取其配置(更复杂)。