使用 Fiddler 强制所有请求通过一个 ServerPipe

Force all requests through one ServerPipe with Fiddler

我正在尝试通过单个 ServerPipe 路由匹配的域请求, 但我无法弄清楚如何让提琴手为所有 ClientPipes

重用该 ServerPipe

基于 chromium 的浏览器的正常行为是为给定域打开最多 6 个到服务器的连接(当有多个资源要获取时)。当通过 fiddler 代理时,这通常会导致最多 6 个 ServerPipes。我想允许第一个建立服务器连接,跳过接下来的 5 个连接,然后让所有客户端请求使用第一个服务器连接。从浏览器的角度来看,它仍然有 6 个客户端连接到 fiddler。

这是我所在的位置 -

  1. 让第一个CONNECT请求正常通过,这会建立与服务器的第一个连接
  2. 当接下来的 5 个客户端 CONNECT 进来时,在 BeforeRequest 处理程序的会话上设置 x-ReplyWithTunnel 标志。这将绕过创建新的服务器连接,但会像成功建立服务器连接一样响应客户端
  3. 客户端通过 6 个客户端管道向 fiddler 发送一堆 GET 请求,从服务器请求资源。第一个管道(与实际服务器管道)中的那些完成。
  4. 其他 5 个隧道中的那些 GET 请求呈现给 fiddler,但没有处理响应并发送回客户端。

我已经尝试了各种想法,但无法让 fiddler 为所有 6 个客户端管道重用单个服务器连接。 所有 GET 请求都发送到同一个域,因此 ServerPipe 重用应该没问题,不是吗?

这可能吗?

如果是,我错过了什么?

经过一番努力终于搞定了。

在幕后,Fiddler 对每台服务器使用一个管道“池”。 在我最初的 post 中,我只允许为每个域创建一个连接。当第一个 GET 进入域时,该会话从池中取出唯一的管道供其使用。当其他 5 个 GET 到达时,他们无法在池中找到任何 Pipes,随后失败。

要解决此问题,需要限制后续的 GET 并且一次只允许它们 运行 一个,一旦每个先前的 GET 完成。

当这个有序的过程发生时,管道将被放回池中,队列中的下一个 GET 将成功找到要使用的管道。然后出现独角兽和彩虹。

我使用 SemaphoreSlim 对每个域 BeforeRequest 中的线程和 BeforeResponse 中的线程进行“排队”。基本功能可以满足我的需要,但完整的实现需要处理失败的管道、挂起 GET 和标志覆盖等问题。