Molnár Gergely created HTTPCORE-633:
---------------------------------------

             Summary: DefaultHttpRequestWriter with SessionOutputBufferImpl
                 Key: HTTPCORE-633
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-633
             Project: HttpComponents HttpCore
          Issue Type: Bug
          Components: HttpCore
    Affects Versions: 5.0.1
         Environment: Windows 10
OpenJDK 8 (RedHat 1.8.0.252-2)
Maven + JUnit 5.6.2
            Reporter: Molnár Gergely


Fail to read correct a header value: Connection: Keep-Alive if the puffer size 
of the SessionOutputBufferImpl is not 1 (e.g.: 16)

Existing parser test: 
https://github.com/apache/httpcomponents-core/blob/master/httpcore5/src/test/java/org/apache/hc/core5/http/impl/io/TestRequestParser.java

No existing writer test!!

Code:

{code:java}
public class HttpCoreApiIT {
    @Test
    public void parseWriteTest() throws Exception {
        // ----------- prepare parse --------
        String rawGet = "GET /home.html HTTP/1.1\r\n" + 
                "User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows 
NT)\r\n" + 
                "Host: example.com\r\n" + 
                "Accept-Language: en-us\r\n" + 
                "Accept-Encoding: gzip, deflate\r\n" + 
                "Connection: Keep-Alive\r\n" + 
                "\r\n";
        int bufferSize = 16;
        SessionInputBuffer inBuffer = new SessionInputBufferImpl(bufferSize, 
StandardCharsets.US_ASCII.newDecoder());
        HttpMessageParser<ClassicHttpRequest> reqParser = new 
DefaultHttpRequestParser();
        Charset charset = StandardCharsets.US_ASCII;

        // try
        ClassicHttpRequest request = reqParser.parse(inBuffer,
                new 
ByteArrayInputStream(rawGet.getBytes(StandardCharsets.UTF_8)));

        // test
        assertEquals("GET", request.getMethod());
        assertEquals("/home.html", request.getPath());
        assertEquals(5, request.getHeaders().length);
        assertEquals("example.com", request.getHeader("host").getValue());
        assertEquals("en-us", request.getHeader("Accept-Language").getValue());
        assertEquals("gzip, deflate", 
request.getHeader("Accept-Encoding").getValue());
        assertEquals("Mozilla/4.0 (compatible; MSIE5.01; Windows NT)", 
request.getHeader("User-Agent").getValue());
        assertEquals("Keep-Alive", request.getHeader("Connection").getValue());

        
        
        // ----------- prepare write --------
        SessionOutputBuffer outBuffer = new SessionOutputBufferImpl(bufferSize, 
charset.newEncoder());
        HttpMessageWriter<ClassicHttpRequest> reqWriter = new 
DefaultHttpRequestWriter();

        // try
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        reqWriter.write(request, outBuffer, outputStream);
        //outBuffer.flush(outputStream); // not documented, but needed

        // prepare test with tested parser
        SessionInputBuffer otherInBuffer = new 
SessionInputBufferImpl(bufferSize, charset.newDecoder());
        ClassicHttpRequest otherRequest = reqParser.parse(otherInBuffer,
                new ByteArrayInputStream(outputStream.toByteArray()));
        outputStream.close();

        // test
        assertEquals("GET", otherRequest.getMethod());
        assertEquals("/home.html", otherRequest.getPath());
        assertEquals(5, otherRequest.getHeaders().length);
        assertEquals("example.com", otherRequest.getHeader("host").getValue());
        assertEquals("en-us", 
otherRequest.getHeader("Accept-Language").getValue());
        assertEquals("gzip, deflate", 
otherRequest.getHeader("Accept-Encoding").getValue());
        assertEquals("Mozilla/4.0 (compatible; MSIE5.01; Windows NT)", 
otherRequest.getHeader("User-Agent").getValue());
        assertEquals("Keep-Alive", 
otherRequest.getHeader("Connection").getValue());
    }
}
{code}

outBuffer.flush(outputStream);  solve the problem, but that is not documented.

[ERROR] Failures: 
[ERROR]   HttpCoreApiIT.parseWriteTest:82 expected: <Keep-Alive> but was: <Keep>


Part 2:
Does the DefaultHttpRequestParser handle well this raw request (HTTP Proxy 
tunnel):

{code:java}
String rawGet = "CONNECT example.com:80 HTTP/1.1\r\n" + 
                "Host: example.com:80\r\n" + 
                "Proxy-Authorization: basic aGVsbG86d29ybGQ=\r\n" + 
                "\r\n";
{code}

the request.getAuthority() return null, but expected: new 
URIAuthority("example.com", 80);





--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to