2012-01-24 27 views
0

我正在從一個解決方案重定向http請求從我的瀏覽器到另一臺pc。 簡而言之:是否有更準確的方式將傳入的HttpListenerRequest作爲HttpRequest發送給客戶端?最準確的方式重定向HttpRequests

背景:瀏覽器發送http請求到127.0.0.1:9666(yes,click'n'load),應該由下載程序來回答。 在我的情況下,下載程序沒有運行在運行瀏覽器的機器上。 像這樣的端口轉發工具不適用於我:http://www.quantumg.net/portforward.php 因此,我決定在C#中編寫特定的click'n'load轉向器。 我的問題是重定向瀏覽器的請求。 ATM,我在127.0.0.1:9666上收聽,向客戶端發送一些信息,客戶端將其重定向到下載程序,該程序將回答。 (長期短:這是重定向到瀏覽器)。 但是,使用預定義的情況來重定向僅核心信息對我來說似乎並不完全正確。應該可以重定向整個請求。所以我不需要區分不同的情況,這應該更準確。 除了複製所有標頭和屬性外,還有其他方式可以重定向這個請求嗎?

服務器使用HttpListener來偵聽瀏覽器的請求。然後,服務器向客戶端發送一個HttpReqest。 客戶端使用HttpListener來偵聽服務器的請求。 客戶端向Downloader發送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標頭,緩衝區長度爲1024bytes)。第二次迭代:當執行Outstream.Read時,什麼都不會發生。不管我等多久。看起來,讀者正在等待流量接收,但沒有流量接收(奇怪的......)當線程睡眠500-1500ms時,第一次讀取返回351bytes被讀取(完整的http請求),然後再次,第二次迭代,什麼也沒有。 從瀏覽器或JDownloader的Ne​​tworkStream中讀取時會發生這種情況。它們永遠不會返回0.一個骯髒的方法得到這個工作是用Read == Buffer.Length替換while參數,因爲它會在接收到Buffer.Length字節的時候失敗(無盡的等待,yay)。 DataAvailable屬性也似乎並不總是正確的,有時它被設置爲false,當程序甚至沒有從流中讀取某些內容,但有字節接收。(也很奇怪...) 任何正確的接收循環的其他想法?


沒人?我的問題的簡短摘要:瀏覽器的請求流和JDownloaders響應流都不返回0.當嘗試另一次讀取時,程序只是等待接收更多字節。 所以我不知道一個故障安全方法來讀取整個流。 只是在重複,直到字節數讀取大於緩衝區的長度將導致前面提到的無休止的等待字節,當streamlength%BufferLength中== 0,

而且,它似乎JDownloader需要更多的時間來產生一個答案,下將它寫入流中,而不是我的程序試圖讀取流。所以我只會收到一部分流。另一次讀取嘗試將導致無休止的字節等待。 有沒有另一種方式來接收沒有靜態延遲(通過線程睡眠)整個流?

+0

好吧,我現在已經完成了「手動」方式 - 不是非常準確,但它工作正常:只有在發送除標題以外的其他內容時纔會讀取整個流。當有POST數據時,還有一個內容長度標題。所以我只是從流中讀取,直到tcp緩衝區爲空,然後檢查是否給出了內容長度。如果是,則過濾出內容長度,並重復讀取直到內容長度+標題長度等於或小於接收到的字節總量。瞧。 – NoMad

回答

1

你可以打開一個TcpListener並轉發原始字節嗎?這樣你根本不需要關心HTTP。

+0

謝謝,使用套接字(或其他相關的東西)沒有出現在我的腦海中,我曾經浪費了2天使用套接字進行編程,基於HttpRequest的代碼做得更好,編碼花費了4個小時。 (那是當我開始在C#編程)。只需通過TCP重定向字節就可以完美工作。唯一的問題是答覆請求的下載程序...它太慢了。當我從流中讀取(請求的答案)時,只有標題,內容丟失。有沒有比Thread.Sleep(1000)更好的方法?如果需要,我可以稍後發佈源代碼 – NoMad

+0

您應該不需要睡眠。您應該調用read直到它返回0.然後,套接字被關閉。讀取將阻塞,直到有任何字節可用或套接字關閉。 – usr