我正在尝试编写一个http代理,然后从寻找一些代码作为参考开始。我在Github上找到了此示例以及其他一些“轻量级”代理示例,其中包含数百行代码:https://github.com/abhinavsingh/proxy.py
虽然我可以理解代码,但我想知道为什么这些功能是必需的? HTTP代理不应该非常简单:一个套接字服务器接受来自浏览器的数据,一个套接字客户端建立与Web服务器的连接,并在服务器和客户端之间交换数据吗?为什么在我发布的示例中会有像HTTPparse()这样的函数?
答案 0 :(得分:3)
真正的HTTP代理不仅是接受来自客户端的连接并将该连接转发到固定服务器的软件。
相反,HTTP代理需要首先从客户端发送的HTTP请求中提取目标。为此,代理需要解析HTTP请求标头。它还需要修改标头,以便将HTTP代理请求更改为HTTP请求,这主要涉及从URI中删除protocol://host:port
并保留其余部分。但这也可能涉及添加Via
标头。另外,代理可能需要自己的身份验证,在这种情况下,也需要从HTTP请求标头中提取,验证和删除此信息。
由于可能在同一TCP连接内将多个HTTP请求(也发送到不同的服务器)发送到代理,因此代理需要解析所有请求。这意味着它需要知道请求在哪里开始和结束。鉴于请求标头和主体的大小都是可变的,代理需要首先读取完整的标头,对其进行分析以获取有关主体大小的信息,然后相应地读取和转发主体(即由{{1 }}标头,分块传输编码或连接结束)。来自服务器的响应必须以相同的方式处理。
此外,代理还需要能够处理HTTP Content-Length
请求,以便客户端可以为CONNECT
连接甚至其他协议构建隧道。
这只是基本的代理功能。代理也可能用于缓存数据,在这种情况下,它需要能够理解何时以及如何缓存数据以及何时不允许缓存的各种方式。它可能需要解决具有特定客户端或服务器的怪癖。它可能用于拦截TLS,修改流量等...