2012-01-13 109 views
-1

我目前正在創建一個小型web服務器(用於測試目的),並且在閱讀HTTP請求標頭(來自瀏覽器,我的情況爲鉻)時出現問題。閱讀完整的HTTP請求標題

首先,我只是嘗試了這樣的事情:

BufferedReader in = new BufferedReader(
    new InputStreamReader(client_socket.getInputStream(), "UTF-8") 
); 
StringBuilder builder = new StringBuilder(); 
while (in.ready()){ 
    builder.append(in.readLine()); 
} 
return builder.toString(); 

這第一個請求的罰款。但是,第一個請求完成後,ready()-方法僅返回false(我關閉了以及所有讀者/作者)。

一點點搜索我碰到這個問題,年長後跌跌撞撞:Read/convert an InputStream to a String

我嘗試的第一個四種解決方案(兩次與Apache的風景,一個與Scanner和一個用do-while循環)。他們都被永遠封鎖,瀏覽器給了我一個「網站無法訪問」 - 錯誤。

我想自己做這件事(不使用任何圖書館或嵌入式服務器),這就是爲什麼我甚至嘗試。

我現在有點迷路了,你會怎麼做呢?

回答

1

您正在讀取套接字,直到沒有更多數據可讀。那是錯的。你必須保持閱讀,直到你遇到一個長度爲0線,然後處理接收到的報頭,以確定是否有更多的數據讀取(尋找Content-Length: ...Transfer-Encoding: chunked頭),例如:

StringBuilder builder = new StringBuilder(); 
String line; 
do 
{ 
    line = in.readLine(); 
    if (line == "") break; 
    builder.append(line); 
} 
while (true); 
// use builder as needed... 
// read message body data if headers say there 
// is a body to read, per RFC 2616 Section 4.4... 

閱讀RFC 2616 Section 4更多細節。這不僅可以促進正確的請求讀取,還可以正確支持HTTP保持活動(用於在單個連接上發送多個請求)。

+0

雖然你給的代碼剪斷不會編譯('String'開始大寫),固定版本的工作正常。我也會檢查引用的RFC,謝謝你。 – 2012-01-13 21:52:56

1

上面Remy Lebeau提出的解決方案是錯誤的,正如它在我的測試中顯示的那樣。這種替代是故障 - 安全:

StringBuilder builder = new StringBuilder(); 
String line; 
do 
{ 
    line = in.readLine(); 
    if (line.equals("")) break; 
    builder.append(line); 
} 
while (true); 

參考:How do I compare strings in Java?