中继代理中的分块响应
本文关键字:响应 代理 | 更新日期: 2023-09-27 18:29:54
我刚刚写了一个支持HTTP 1.1/1.0的SSL代理,为过去两天编写了一些代码。我使用HTTPWebResponse/HTTPWebRequest类从服务器获取数据。在从服务器中继数据时,我一有数据头就先将其发送到浏览器,然后从服务器发送响应流。我注意到,当响应为Chunked时,如果我只是使用流读取器使用HTTPWebresponse.GetResponseStream()
读取并将其转发到浏览器,则浏览器无法加载页面。花了一段时间后,我意识到GetResponseStream()
似乎已经被分块了,所以浏览器无法解析它(因为分块的响应头已经被发送到浏览器,这让它很困惑)。我做了一个变通办法,删除分块的标头,然后在不分块的情况下一起发送responsestream
。
但我注意到fiddlercore(免版税代理库)以某种方式中继了分块的数据,而没有采取我所做的变通方法,它是用.NET编写的,所以我认为应该有一种方法来逐个中继分块。
我的问题是,当使用流时,如何在代理中正确地中继丢弃的响应?此外,如果我的代理是为本地机器设计的,如果我在没有分块的情况下将数据一起发送到浏览器,性能会很差吗?
FiddlerCore是HTTP/1.1协议的完整实现,直接在TCP/IP套接字上编写。
因此,它不会受到高级WebRequest类固有的限制(代价是我必须自己完全实现协议)。
实际上,我决定在每次从响应流读取缓冲区时再次对数据进行分块(只有当响应标头指示分块响应时)。我想重新组块的性能损失可以忽略不计。如果我只是像我在变通方法中提到的那样等待读取所有的块,那么我就有可能破坏可用于代理的内存。