2009-10-16 51 views
3

尋找一點幫助,我目前已經寫了一個HTTP服務器。它目前正確處理GET請求。然而,在使用POST時,緩衝讀取器似乎掛起。當請求停止時,輸入流的其餘部分通過緩衝讀取器讀取。我在谷歌上發現了一些東西。我曾嘗試將CRLF和協議版本從1.1更改爲1.0(瀏覽器自動將請求作爲1.1),我們將不勝感激。謝謝Buffered Reader HTTP POST

回答

1

這不安全!但是展示瞭如何在初始HTTP頭之後的輸入流期間獲取POST數據。

這也只適用於POST數據來作爲「例如=真&壞=假」等

private HashMap hashMap = new HashMap(); 
private StringBuffer buff = new StringBuffer(); 
private int c = 0; 
private String[] post; public PostInputStream(InputStream in) { 

    try { 
     //Initalizes avaliable buff 
     if (in.available() != 0) { 
      this.buff.appendCodePoint((this.c = in.read())); 
      while (0 != in.available()) { 
       //Console.output(buff.toString()); 
       buff.appendCodePoint((this.c = in.read())); 
      } 

      this.post = buff.toString().split("&"); 

      for (int i = 0; i < this.post.length; i++) { 
       String[] n = this.post[i].split("="); 
       if (n.length == 2) { 
        hashMap.put(URLDecoder.decode(n[0], "UTF-8"), URLDecoder.decode(n[1], "UTF-8")); 
       } else { 
        Console.error("Malformed Post Request."); 
       } 
      } 
     } else { 
      Console.error("No POST Data"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
2

不會寫我自己的實現。請看下面的現有的組件,如果你想:

+0

如果我可以多次寫「借調」而不感到無聊,是的,那就是要走的路。 – 2009-10-16 19:12:43

+0

對不起,我的意思是服務器不是客戶端。 – Hugh 2009-10-16 19:44:12

+0

儘管如此,Apache HttpComponents仍是一條可行之路。 – Bombe 2009-10-16 19:57:42

7

我與漢斯同意,你應該使用一個標準和經過充分測試的庫來做到這一點。但是,如果您正在編寫服務器以瞭解HTTP,請參閱您想做的事情。

你真的不能使用BufferedReader,因爲它會緩衝輸入並可能從套接字讀取太多字節。這就是爲什麼你的代碼掛起,BufferedReader試圖讀取比在套接字上可用的字節更多的字節(因爲POST數據沒有行結束),並且它正在等待更多字節(這將永遠不可用) 。

簡單地解析POST請求的方法是使用InputStream的直接

  • 對於每個線在頭 一次讀一個字節,直到到達一個「\ r」和然後a'\ n'

  • 查找以「Content-Length:」開頭的行,提取該行末尾的數字。

  • 當你得到一個空的標題行時,你就完成了標題。

  • 現在準確讀取來自Content-Length標題的字節數。現在

你可以寫你的迴應。

0

正如karoroberts說你必須檢查在POST發送的內容的長度。但你仍然可以使用BufferedReader。

只是要檢查的Content-Length頭它的大小和讀完所有的頭,你可以設置大小的字符數組,使帖子內容的閱讀後:

的char [ ] buffer = new char [contentLength]; 請求。讀(緩衝液);

其中請求是BufferedReader。 如果您需要字符串中的POST內容,您可以使用:String.valueOf(buffer);

注意:BufferedReader.read返回字符的整數,因此您可以檢查Content-Length標頭是否存在不一致。