在尝试提取给定的主体时,我遇到了一个奇怪的问题 HTTP发布请求。
如果我尝试仅提取标题,则可以正常工作。当我尝试提取正文时,方法会阻塞(甚至认为流中仍有数据)。
这是我的代码:
private void extractHeader() throws Exception {
StringBuffer buffer = new StringBuffer();
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
boolean extractBody = false;
int bodyLength = 0;
String line;
while (!(line = bufferedReader.readLine()).equals("")) {
buffer.append(line + "");
if (line.startsWith("POST")) {
extractBody = true;
}
if (line.startsWith("Content-Length:")) {
bodyLength = Integer.valueOf(line.substring(line.indexOf(' ') + 1, line.length()));
}
}
requestHeader = buffer.toString();
if (extractBody) {
char[] body = new char[bodyLength];
reader.read(body, 0, bodyLength);
requestBody = new String(body);
}
}
这是请求请求:
POST /params_info.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8080/index.html
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
firstname=Mickey&lastname=Mouse
根据我的理解,循环将一直持续到看到空字符串 然后停下来。在这个阶段,读者可以阅读内容长度'字节数。所以阅读身体和完成应该没有问题。相反,它会阻止线路上的“阅读器”(body,0,bodyLength);' (我不使用readLine()的原因是因为body不以\ n开头。
我尝试过以各种方式调试它但我一无所获。有人可以帮忙吗?
答案 0 :(得分:1)
您正在使用bufferedReader
:
while (!(line = bufferedReader.readLine()).equals("")) {
但是使用reader
来阅读正文,该bufferedReader
没有可用的数据,因为 reader.read(body, 0, bodyLength);
已经读取并缓存了这些内容:
bufferedReader.read(body, 0, bodyLength);
将该行更改为
app.get('/fetching', function(req, res){
connection.fetcher(function(data)
{
res.render("testing.html",data);
}
);
});