我已经下载Privoxy的几个星期前,为了好玩我很好奇,想知道如何它的一个简单的版本可以做到的。
我知道我需要配置浏览器(客户)发送请求到代理。 代理发送请求到web(让说这是一个HTTP代理)。 代理将获得答案...但如何才能代理发送回请求浏览器(客户端)?
我在网络上搜索C#和HTTP代理上,但还没有发现,让我明白它是如何工作的幕后正确的东西。 (我相信我不想一个反向代理,但我不知道)。
请问你们有一些解释或一些信息,这将让我继续这个小项目?
更新
这是我的理解(见下图)。
第1步我配置客户端(浏览器)的所有要求,在港口代理听被发送到127.0.0.1。 通过这种方式,请求将不会被发送到Internet直接,但会由代理进行处理。
第二步代理看到一个新的连接,读取HTTP头,看看他必须执行请求。 他执行请求。
第三步代理收到请求的应答。 现在,他必须把从网络到客户端,但怎么回答???
有用的链接
颏代理 :我发现这个项目是一个代理(但更多的,我想)。 我可能会检查源,但我真的想一些基本的东西,了解更多的概念。
ASP代理 :我也许能在这里也得到一些信息。
请求反射器 :这是一个简单的例子。
这里是一个Git的中心资源库和简单的HTTP代理 。
你可以建立一个与HttpListener
类侦听传入请求和HttpWebRequest
类来中继请求。
我不会使用HttpListener或类似的东西,那样你会遇到很多问题。
更重要的是这将是一个巨大的痛苦,以支持:
- 代理保持活动
- SSL是不行的(以正确的方式,你会得到弹出窗口)
- .NET库严格遵循这会导致某些请求失败的RFC(即使IE,FF和世界上其他任何浏览器将工作)。
你需要做的是:
- 监听TCP端口
- 解析浏览器请求
- 提取主机连接到TCP级别的主机
- 转发一切来回,除非你想添加自定义页眉等。
我写了2个不同的HTTP代理服务器在.NET中有不同的要求,我可以告诉你,这是做到这一点的最好办法。
颏这样做,但他们的代码是“代表意大利面条”,除了转到更糟:)
我最近写的轻量代理在使用C#.NET 的TcpListener和TcpClient的 。
https://github.com/titanium007/Titanium-Web-Proxy
它支持安全HTTP的正确方式,客户端机器需要信任由代理使用的根证书。 同时还支持WebSockets的继电器。 HTTP 1.1的所有功能,除了流水线的支持。 流水线是不被大多数现代浏览器反正。 也支持Windows认证(普通纸,消化)。
您可以通过引用项目挂钩您的应用程序,然后查看和修改的所有流量。 (请求和响应)。
至于表现,我已经测试它在我的机器和工作没有任何明显的延迟。
代理可以通过以下方式工作。
第一步,配置客户端使用的ProxyHost:proxyPort。
代理服务器是在ProxyHost的监听TCP服务器:proxyPort。 打开浏览器使用代理连接并发送HTTP请求。 代理解析这一请求,并尝试检测“主机”头。 这头会告诉代理,这样打开连接。
步骤2:代理打开连接于“主机”报头中指定的地址。 然后将其发送HTTP请求发送到该远程服务器。 读取响应。
第3步:响应从远程HTTP服务器读出后,发送代理通过与浏览器的较早打开的TCP连接的响应。
它用图解的将是这样的:
Browser Proxy HTTP server
Open TCP connection
Send HTTP request ----------->
Read HTTP header
detect Host header
Send request to HTTP ----------->
Server
<-----------
Read response and send
<----------- it back to the browser
Render content
如果你只是希望拦截流量,您可以使用小提琴手核心创建一个代理...
http://fiddler.wikidot.com/fiddlercore
与UI来看看它运行小提琴手第一,它是一个代理,允许你调试HTTP / HTTPS流量。 这是写在C#中,有哪些你可以建立到您自己的应用的核心。
请记住FiddlerCore是不是免费的商业应用。
事情已经成为OWIN和的WebAPI真的很容易。 我在寻找一个C#代理服务器,我也遇到了这个职位http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ 。 这将是我走的道路。
同意邪恶博士如果您使用HTTPListener你将有很多问题,你必须解析请求,并且将参与到页眉和...
- 使用TCP监听听浏览器请求
- 仅解析请求的第一行,并得到主机的域名和端口连接
- 发送确切的原始请求的发现主机上的浏览器请求的第一行
- 接收来自目标站点的数据(我有问题,在本节)
- 发送从主机接收到浏览器的精确数据
你看你不需要知道什么是浏览器请求并解析它,只能从第一行第一行的目标网站的地址通常喜欢这个GET http://google.com HTTP1.1或CONNECT facebook.com: 443(这是SSL请求)
SOCKS4是一个非常简单的协议来实现。 你听初始连接,连接到客户端所请求的主机/端口,成功代码发送到客户端然后在插座传出和传入数据流进行转发。
如果你使用HTTP去你必须阅读和可能的设置/删除一些HTTP头,这样有点更多的工作。
如果我没有记错,SSL将通过HTTP和SOCKS代理工作。 对于HTTP代理,则执行CONNECT动词,如上所述,那么客户端打开整个代理TCP流中的SSL连接,其工作原理非常类似于SOCKS4。
该浏览器连接到代理,以便代理从Web服务器获取数据通过浏览器发起的代理相同的连接刚刚发。