几周前我下载了 Privoxy,为了好玩,我很好奇如何完成它的简单版本。

我知道我需要配置浏览器(客户端)以将请求发送到代理。代理将请求发送到网络(假设它是一个 http 代理)。代理将收到答案...但是代理如何将请求发送回浏览器(客户端)呢?

我在网上搜索了 C# 和 http 代理,但没有找到能让我了解它如何在幕后正确工作的东西。(我相信我不想要反向代理,但我不确定)。

你们中有人有一些解释或信息可以让我继续这个小项目吗?

更新

这是我的理解(见下图)。

步骤1 我将客户端(浏览器)配置为将所有请求发送到代理侦听端口上的 127.0.0.1。这样,请求不会直接发送到互联网,而是由代理处理。

第2步 代理看到一个新连接,读取 HTTP 标头并查看他必须执行的请求。他执行请求。

步骤3 代理接收请求的答复。现在他必须将答案从网络发送给客户,但是如何发送???

alt text

有用的链接

Mentalis代理 :我发现这个项目是一个代理(但我想要更多)。我可能会检查来源,但我真的想要一些基本的东西来更多地理解这个概念。

代理服务器 :我或许也能在这里得到一些信息。

请求反射器 :这是一个简单的例子。

这里有一个 具有简单 Http 代理的 Git Hub 存储库.

有帮助吗?

解决方案

您可以使用 HttpListener 类侦听传入的请求和 <代码> HttpWebRequest 类来中继请求。

其他提示

我不会使用 HttpListener 或类似的东西,这样你会遇到很多问题。

最重要的是,支持将是一个巨大的痛苦:

  • 代理保持活动状态
  • SSL 将不起作用(以正确的方式,您将看到弹出窗口)
  • .NET 库严格遵循 RFC,这会导致某些请求失败(即使 IE、FF 和世界上任何其他浏览器都可以工作。)

你需要做的是:

  • 监听 TCP 端口
  • 解析浏览器请求
  • 提取主机在 TCP 级别连接到该主机
  • 来回转发所有内容,除非您想添加自定义标头等。

我在 .NET 中编写了 2 个具有不同要求的不同 HTTP 代理,我可以告诉您这是最好的方法。

Mentalis 这样做,但他们的代码是“委托意大利面条”,比 GoTo 更糟糕:)

我最近使用 TcpListener TcpClient

https://github.com/titanium007/Titanium-Web-Proxy

它以正确的方式支持安全HTTP,客户端机器需要信任代理使用的根证书。还支持WebSockets中继。除流水线外,支持HTTP 1.1的所有功能。大多数现代浏览器都不使用流水线技术。还支持Windows身份验证(普通,摘要)。

您可以通过引用项目来连接应用程序,然后查看和修改所有流量。 (请求和回复)。

就性能而言,我已经在我的机器上进行了测试,并且没有任何明显的延迟。

代理可以按以下方式工作。

步骤1,配置客户端使用proxyHost:proxyPort。

Proxy是一个正在侦听proxyHost:proxyPort的TCP服务器。 浏览器打开与Proxy的连接并发送Http请求。 代理解析此请求并尝试检测“主机”。头。此标头将告知Proxy在何处打开连接。

步骤2:代理打开与“主机”中指定的地址的连接。头。然后它将HTTP请求发送到该远程服务器。阅读回复。

步骤3:从远程HTTP服务器读取响应后,Proxy通过先前打开的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

如果您只想拦截流量,可以使用fiddler核心创建代理......

http://fiddler.wikidot.com/fiddlercore

首先使用UI运行fiddler以查看它的功能,它是一个允许您调试http / https流量的代理。它是用c#编写的,并且有一个可以构建到自己的应用程序中的核心。

请记住,FiddlerCore不适用于商业应用程序。

使用OWIN和WebAPI,事情变得非常简单。在我搜索C#代理服务器时,我也发现了这篇文章 http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ 。这将是我正在走的道路。

同意邪恶的博士 如果您使用HTTPListener,您将遇到很多问题,您必须解析请求并参与标题和...

  1. 使用tcp侦听器侦听浏览器请求
  2. 仅解析请求的第一行并获取要连接的主机域和端口
  3. 在浏览器请求的第一行
  4. 上将确切的原始请求发送到找到的主机
  5. 从目标网站接收数据(我在本节中有问题)
  6. 将从主机收到的确切数据发送到浏览器
  7. 你看到你甚至不需要知道浏览器请求中的内容并解析它,只从第一行获取目标站点地址 第一行通常喜欢这个 获取 http://google.com HTTP1.1 要么 CONNECT facebook.com:443(这是针对ssl请求)

Socks4是一个非常简单的协议。您侦听初始连接,连接到客户端请求的主机/端口,将成功代码发送到客户端,然后通过套接字转发传出和传入流。

如果您使用HTTP,则必须阅读并可能设置/删除一些HTTP标头,以便更多工作。

如果我没记错,SSL将在HTTP和Socks代理中运行。对于HTTP代理,您实现了CONNECT谓词,它的工作原理与上面描述的socks4非常相似,然后客户端在代理的tcp流中打开SSL连接。

浏览器已连接到代理,因此代理从Web服务器获取的数据仅通过浏览器启动的代理连接发送给代理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top