@Test public void testCommaSeparatedHeaderValues() { DefaultHttpMessage message; List<String> commaSeparatedHeaders; // test the empty headers case message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, empty()); // two headers present, but no values message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ""); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ""); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, empty()); // a single header value message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("chunked")); // a single header value with extra spaces message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, " chunked , "); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("chunked")); // two comma-separated values in one header line message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "compress, gzip"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("compress", "gzip")); // two comma-separated values in one header line with a spurious ',' and space. see RFC 7230 // section 7 // for information on empty list items (not all of which are valid header-values). message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "compress, gzip, ,"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("compress", "gzip")); // two values in two separate header lines message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "chunked"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("gzip", "chunked")); // multiple comma-separated values in two separate header lines message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "gzip, compress"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "deflate, gzip"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat(commaSeparatedHeaders, contains("gzip", "compress", "deflate", "gzip")); // multiple comma-separated values in multiple header lines with spurious spaces, commas, // and tabs (horizontal tabs are defined as optional whitespace in RFC 7230 section 3.2.3) message = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, " gzip,compress,"); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, "\tdeflate\t, gzip, "); message.headers().add(HttpHeaders.Names.TRANSFER_ENCODING, ",gzip,,deflate,\t, ,"); commaSeparatedHeaders = ProxyUtils.getAllCommaSeparatedHeaderValues(HttpHeaders.Names.TRANSFER_ENCODING, message); assertThat( commaSeparatedHeaders, contains("gzip", "compress", "deflate", "gzip", "gzip", "deflate")); }