Uploaded image for project: 'HttpComponents HttpCore'
  1. HttpComponents HttpCore
  2. HTTPCORE-633

DefaultHttpRequestWriter with SessionOutputBufferImpl

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Minor
    • Resolution: Not A Bug
    • 5.0.1
    • None
    • HttpCore
    • None
    • Windows 10
      OpenJDK 8 (RedHat 1.8.0.252-2)
      Maven + JUnit 5.6.2

    Description

      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:

      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());
          }
      }
      

      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):

      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";
      

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

      Attachments

        Activity

          People

            Unassigned Unassigned
            gergelymolnarpro Molnár Gergely
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: