我正在研究将http请求从我的浏览器重定向到另一台PC的解决方案。 简而言之:是否有更准确的方法将传入的HttpListenerRequest作为HttpRequest发送给客户端?
背景:浏览器将http请求发送到127.0.0.1:9666(是的,点击'n'load),应由下载程序回答。 就我而言,下载程序没有在运行浏览器的机器上运行。 像这样的端口转发工具对我不起作用:http://www.quantumg.net/portforward.php 所以我决定在C#中编写一个特定的click'n'load重定向器。 我的问题是重定向浏览器的请求。 ATM,我在127.0.0.1:9666上收听,向客户端发送一些信息,客户端将其重定向到下载程序,该程序会回答。 (长期短:这被重定向到浏览器)。 但是使用预定义的案例来仅重定向核心信息似乎不适合我。应该可以重定向整个请求。所以我不需要区分各种情况,这应该更准确。 除了复制所有标题和属性之外,还有其他方法可以重定向此请求吗?
服务器使用HttpListener来监听浏览器的请求。 然后,服务器向客户端发送HttpReqest。 客户端使用HttpListener来侦听服务器的请求。 客户端向下载器发送HttpRequest, 使用GetResponse,并将其作为响应发送到服务器,服务器响应浏览器。 我在MSDN中查找了一些函数,但没有找到“复制整个请求”的好方法。
所以这是我的问题代码:
Thread.Sleep(1500);
//Read client's/JDownloader's stream, send to browser/redirector
do
{
Read = Outstream.Read(Buffer, 0, Buffer.Length);
Totalr += Read;
Instream.Write(Buffer, 0, Read);
Sent += Read;
// Bufferstr += ASCIIEncoding.ASCII.GetString(Buffer, 0, Read); debugging
} while (Read != 0);
没有Thread.Sleep,第一次读取返回171字节被读取(正好和HTTP标头,缓冲区长度是1024字节)。 第二次迭代:执行Outstream.Read时,没有任何反应。不管我等多久。看来,读者正在等待流量接收,但没有流量接收(奇怪......)当线程休眠500-1500ms时,第一次读取返回351bytes被读取(完整的http请求),然后再次,第二次迭代,没有。 从浏览器或JDownloader的NetworkStream中读取时会发生这种情况。它们永远不会返回0.一个脏方法来实现这个工作就是用Read == Buffer.Length替换while参数,脏,因为当接收到Buffer.Length字节时它会失败(无休止等待,yay)。 DataAvailable属性似乎也不总是正确的,有时它设置为false,当程序甚至没有从流中读取内容时,但是有些字节需要接收。(也很奇怪......) 正确接收循环的任何其他想法?
没人?我的问题的简短摘要:浏览器的请求流和JDownloaders响应流都没有返回0.当尝试另一次读取时,程序只等待接收更多字节。 所以我不知道读取整个流的故障安全方法。 只重复读取的字节数低于缓冲区的长度将导致前面提到的无限等待字节,当streamlength%bufferlength == 0时。
此外,似乎JDownloader需要更多时间来生成答案并将其写入流中,而不是我的程序尝试读取流。所以我只收到一部分流。另一次读取尝试将导致无休止地等待字节。 有没有另一种方法来接收整个流而没有静态延迟(通过线程休眠)?
答案 0 :(得分:1)
你能打开一个TcpListener并转发原始字节吗?这样你根本不需要关心HTTP。
答案 1 :(得分:1)
你要求的基本上是代理实现 - 构建一个运行良好的代理并不是一项简单的任务,因为你必须在两个方向上理解和处理HTTP等。
我建议使用现有的库来进行OR或一些可配置的代理: