use of org.apache.hc.core5.http.nio.SessionInputBuffer in project httpcomponents-core by apache.
the class TestChunkCoding method testCorruptChunkedInputStreamTruncatedCRLF.
// Truncated stream (missing closing CRLF)
@Test
public void testCorruptChunkedInputStreamTruncatedCRLF() throws IOException {
final String s = "5\r\n01234";
final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
final ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.ISO_8859_1));
final ChunkedInputStream in = new ChunkedInputStream(inBuffer, inputStream);
final byte[] tmp = new byte[5];
Assertions.assertEquals(5, in.read(tmp));
Assertions.assertThrows(MalformedChunkCodingException.class, () -> in.read());
in.close();
}
use of org.apache.hc.core5.http.nio.SessionInputBuffer in project httpcomponents-core by apache.
the class AbstractMessageParser method parseHeaders.
/**
* Parses HTTP headers from the data receiver stream according to the generic
* format as specified by the HTTP/1.1 protocol specification.
*
* @param inBuffer Session input buffer
* @param inputStream Input stream
* @param maxHeaderCount maximum number of headers allowed. If the number
* of headers received from the data stream exceeds maxCount value, an
* IOException will be thrown. Setting this parameter to a negative value
* or zero will disable the check.
* @param maxLineLen maximum number of characters for a header line,
* including the continuation lines. Setting this parameter to a negative
* value or zero will disable the check.
* @param parser line parser to use.
* @param headerLines List of header lines. This list will be used to store
* intermediate results. This makes it possible to resume parsing of
* headers in case of a {@link java.io.InterruptedIOException}.
*
* @return array of HTTP headers
*
* @throws IOException in case of an I/O error
* @throws HttpException in case of HTTP protocol violation
*
* @since 4.1
*/
public static Header[] parseHeaders(final SessionInputBuffer inBuffer, final InputStream inputStream, final int maxHeaderCount, final int maxLineLen, final LineParser parser, final List<CharArrayBuffer> headerLines) throws HttpException, IOException {
Args.notNull(inBuffer, "Session input buffer");
Args.notNull(inputStream, "Input stream");
Args.notNull(parser, "Line parser");
Args.notNull(headerLines, "Header line list");
CharArrayBuffer current = null;
CharArrayBuffer previous = null;
for (; ; ) {
if (current == null) {
current = new CharArrayBuffer(64);
} else {
current.clear();
}
final int readLen = inBuffer.readLine(current, inputStream);
if (readLen == -1 || current.length() < 1) {
break;
}
// discussion on folded headers
if ((current.charAt(0) == ' ' || current.charAt(0) == '\t') && previous != null) {
// we have continuation folded header
// so append value
int i = 0;
while (i < current.length()) {
final char ch = current.charAt(i);
if (ch != ' ' && ch != '\t') {
break;
}
i++;
}
if (maxLineLen > 0 && previous.length() + 1 + current.length() - i > maxLineLen) {
throw new MessageConstraintException("Maximum line length limit exceeded");
}
previous.append(' ');
previous.append(current, i, current.length() - i);
} else {
headerLines.add(current);
previous = current;
current = null;
}
if (maxHeaderCount > 0 && headerLines.size() >= maxHeaderCount) {
throw new MessageConstraintException("Maximum header count exceeded");
}
}
final Header[] headers = new Header[headerLines.size()];
for (int i = 0; i < headerLines.size(); i++) {
final CharArrayBuffer buffer = headerLines.get(i);
headers[i] = parser.parseHeader(buffer);
}
return headers;
}
use of org.apache.hc.core5.http.nio.SessionInputBuffer in project httpcomponents-core by apache.
the class TestResponseParser method testConnectionClosedException.
@Test
public void testConnectionClosedException() throws Exception {
final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] {});
final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
final DefaultHttpResponseParser parser = new DefaultHttpResponseParser();
final ClassicHttpResponse response = parser.parse(inBuffer, inputStream);
Assertions.assertNull(response);
}
use of org.apache.hc.core5.http.nio.SessionInputBuffer in project httpcomponents-core by apache.
the class TestResponseParser method testBasicMessageParsingLeadingEmptyLines.
@Test
public void testBasicMessageParsingLeadingEmptyLines() throws Exception {
final String s = "\r\n" + "\r\n" + "HTTP/1.1 200 OK\r\n" + "Server: whatever\r\n" + "\r\n";
final ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII));
final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16, StandardCharsets.US_ASCII.newDecoder());
final DefaultHttpResponseParser parser = new DefaultHttpResponseParser(Http1Config.custom().setMaxEmptyLineCount(3).build());
final ClassicHttpResponse httpresponse = parser.parse(inBuffer, inputStream);
Assertions.assertEquals(200, httpresponse.getCode());
Assertions.assertEquals("OK", httpresponse.getReasonPhrase());
final Header[] headers = httpresponse.getHeaders();
Assertions.assertEquals(1, headers.length);
}
use of org.apache.hc.core5.http.nio.SessionInputBuffer in project httpcomponents-core by apache.
the class TestResponseParser method testMessageParsingTimeout.
@Test
public void testMessageParsingTimeout() throws Exception {
final String s = "HTTP\000/1.1 200\000 OK\r\n" + "Server: wha\000tever\r\n" + "Date: some date\r\n" + "Set-Coo\000kie: c1=stuff\r\n" + "\000\r\n";
final TimeoutByteArrayInputStream inputStream = new TimeoutByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII));
final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
final DefaultHttpResponseParser parser = new DefaultHttpResponseParser();
int timeoutCount = 0;
ClassicHttpResponse httpresponse = null;
for (int i = 0; i < 10; i++) {
try {
httpresponse = parser.parse(inBuffer, inputStream);
break;
} catch (final InterruptedIOException ex) {
timeoutCount++;
}
}
Assertions.assertNotNull(httpresponse);
Assertions.assertEquals(5, timeoutCount);
Assertions.assertEquals(200, httpresponse.getCode());
Assertions.assertEquals("OK", httpresponse.getReasonPhrase());
final Header[] headers = httpresponse.getHeaders();
Assertions.assertEquals(3, headers.length);
}
Aggregations