2009-10-16 49 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标头是否存在不一致。