2012-03-12 28 views
2

我正在用firefox進行測試。服務器收到來自firefox的HTTP請求作爲字符串,現在我不確定如何處理它。我需要連接到端口8080並以字符串形式發送請求嗎?然後在端口8080上收聽響應?如果是的話,會有什麼反應呢?我不確定期望什麼類型的內容。一串HTML?然後我發回到Firefox,也作爲一個字符串?編寫一個C HTTP代理服務器 - 如何接收和重定向一個HTTP響應

另外,從其他閱讀來看,我已經意識到有很多不同種類的代理 - 我對此還不瞭解。我的代理只需要作爲客戶和實際互聯網之間的中間人,除此之外別無其他。

+0

你可以更清楚地瞭解代理的目的。基本上只是爲了隱藏瀏覽器上的IP(或處理非公開IP)?有沒有一些特定的原因,你不能或不想使用像Squid這樣的現成解決方案?另外,性能是否重要? (如果是這樣,這是一個*大*工作。) – 2012-03-12 02:00:10

+0

這是一個類項目。只需要過濾掉通過命令行參數提供的一些域。我沒有尋找任何代碼,只是一個通用的路徑。不,絕對沒有表現。這是一件小事。 – Aerovistae 2012-03-12 02:01:45

+0

@DavidSchwartz這是作業,看他最後一個問題 – wintersolutions 2012-03-12 02:02:38

回答

5

代理HTTP的規則實際上相當複雜。但是,如果你不關心性能,你可能會忽略大部分,特別是如果你不關心性能。

首先,你必須聽一些端口。你需要解析你收到的查詢。它將由若干行組成,每行都有一個CRLF對。您將通過兩個CRLF對知道查詢標題的結尾。可以有一個查詢體(如果這是一個POST),並且你不想解析它,因爲它很複雜。因此,您可以僞造它:

  1. 檢查查詢是否有任何Connection標頭。如果你有任何問題,請刪除它們。

  2. 在另一端連接到服務器。

  3. 在發送請求和請求標題之後,但在標記請求標頭結尾的第二個CRLF之前,添加一個Connection: close標頭。然後發送第二個CRLF。

  4. 現在代理方向。如果您懶得使用selectpoll,您可以使用額外的流程或其他線程。確保正確代理一個半關閉連接。 (瀏覽器在完成查詢時可能會關閉發送 - 它仍在偵聽回覆。)

  5. 瀏覽器不應嘗試重新使用連接。如果HTTP/1.0,它將需要特定的權限來做到這一點,它不會得到。如果HTTP/1.1,服務器應該接受它的Connection: close請求,並用它自己的Connection: close頭響應。

請注意,HTTPS實際上更簡單。如果您需要支持,則必須解析CONNECT請求。但是,您只需連接到另一端,報告成功或失敗,並進入雙向代理模式。

1

您必須解析請求才能訪問客戶需要的URL。該URL包含您需要的信息:要連接的服務器的名稱。客戶端連接到您的代理,但實際上需要http://example.com。你必須連接到example.com。之後,你可以成爲一個完全透明的TCP代理。正確處理雙向數據傳輸,以及TCP半關閉。轉發您截取並解析的請求。

由於代理不總是透明的,所以存在不同種類的代理。代理可以提供額外的認證和加密。或者它可以過濾HTML:例如刪除或縮小圖像以便在低帶寬網絡上更快地瀏覽。或者它可以爲整個局域網提供緩存,所以人們不會多次下載同一個文件。

你應該做的第一件事就是編寫完全通用的TCP代理:端口轉發器。這是一個配置了IP和端口號的程序。它監聽客戶端連接,連接到配置的IP和端口目標,然後在該客戶端和客戶端之間傳遞數據。

如果你不能寫這個,你將無法制作一個類似的HTTP代理,但從客戶端請求中獲取其配置(更復雜)。

相關問題