Как читать HTTP-запрос с помощью InputStream? Я читала это так:Как правильно прочитать HTTP-запрос?
InputStream in = address.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder result = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
Но reader.readLine()
может быть заблокирован, потому что нет никакой гарантии, что null
линия будет достигнута. Конечно, я могу прочитать заголовок Content-Length, а затем запрос на чтение в цикле:
for (int i = 0; i < contentLength; i++) {
int a = br.read();
body.append((char) a);
}
Но если Content-Length установлен слишком большим (я предполагаю, что это может быть установлено вручную для целей), br.read()
будет заблокирован. Я стараюсь читать байты непосредственно из InputStream, как это:
byte[] bytes = getBytes(is);
public static byte[] getBytes(InputStream is) throws IOException {
int len;
int size = 1024;
byte[] buf;
if (is instanceof ByteArrayInputStream) {
size = is.available();
buf = new byte[size];
len = is.read(buf, 0, size);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
bos.write(buf, 0, len);
buf = bos.toByteArray();
}
return buf;
}
Но она ждет навсегда. Что?
Почему нет гарантии, что линия «null» будет достигнута? Согласно документации, он возвращает «null, если конец потока достигнут». Поэтому, если соединение закрыто, вы получите нулевое значение после прочтения последней строки. –
Первая нулевая строка, к которой я могу добраться, - это разделитель между заголовками и объектом запроса (например, данные формы). Но после тела нет нулевой линии. Что? – Tony
Может быть, вы получите запрос с пустым телом? –