This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit c3bd168427cadc1b860791c1f2204fe03c2cb740 Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon May 10 21:20:46 2021 +0100 Remove support for the identity T-E header value --- java/org/apache/coyote/http11/Http11Processor.java | 8 +- .../apache/coyote/http11/TestHttp11Processor.java | 95 ++++++++++++++++------ webapps/docs/changelog.xml | 6 ++ 3 files changed, 78 insertions(+), 31 deletions(-) diff --git a/java/org/apache/coyote/http11/Http11Processor.java b/java/org/apache/coyote/http11/Http11Processor.java index f43efe1..3b8ed2f 100644 --- a/java/org/apache/coyote/http11/Http11Processor.java +++ b/java/org/apache/coyote/http11/Http11Processor.java @@ -212,11 +212,8 @@ public class Http11Processor extends AbstractProcessor { // Parsing trims and converts to lower case. - if (encodingName.equals("identity")) { - // Skip - } else if (encodingName.equals("chunked")) { - inputBuffer.addActiveFilter - (inputFilters[Constants.CHUNKED_FILTER]); + if (encodingName.equals("chunked")) { + inputBuffer.addActiveFilter(inputFilters[Constants.CHUNKED_FILTER]); contentDelimitation = true; } else { for (int i = pluggableFilterIndex; i < inputFilters.length; i++) { @@ -759,7 +756,6 @@ public class Http11Processor extends AbstractProcessor { List<String> encodingNames = new ArrayList<>(); if (TokenList.parseTokenList(headers.values("transfer-encoding"), encodingNames)) { for (String encodingName : encodingNames) { - // "identity" codings are ignored addInputFilter(inputFilters, encodingName); } } else { diff --git a/test/org/apache/coyote/http11/TestHttp11Processor.java b/test/org/apache/coyote/http11/TestHttp11Processor.java index b6f7a6b..3287127 100644 --- a/test/org/apache/coyote/http11/TestHttp11Processor.java +++ b/test/org/apache/coyote/http11/TestHttp11Processor.java @@ -254,31 +254,6 @@ public class TestHttp11Processor extends TomcatBaseTest { @Test - public void testWithTEIdentity() throws Exception { - getTomcatInstanceTestWebapp(false, true); - - String request = - "POST /test/echo-params.jsp HTTP/1.1" + SimpleHttpClient.CRLF + - "Host: any" + SimpleHttpClient.CRLF + - "Transfer-encoding: identity" + SimpleHttpClient.CRLF + - "Content-Length: 9" + SimpleHttpClient.CRLF + - "Content-Type: application/x-www-form-urlencoded" + - SimpleHttpClient.CRLF + - "Connection: close" + SimpleHttpClient.CRLF + - SimpleHttpClient.CRLF + - "test=data"; - - Client client = new Client(getPort()); - client.setRequest(new String[] {request}); - - client.connect(); - client.processRequest(); - Assert.assertTrue(client.isResponse200()); - Assert.assertTrue(client.getResponseBody().contains("test - data")); - } - - - @Test public void testWithTESavedRequest() throws Exception { getTomcatInstanceTestWebapp(false, true); @@ -1859,4 +1834,74 @@ public class TestHttp11Processor extends TomcatBaseTest { // NO-OP } } + + + @Test + public void testTEHeaderUnknown01() throws Exception { + doTestTEHeaderUnknown("identity"); + } + + + @Test + public void testTEHeaderUnknown02() throws Exception { + doTestTEHeaderUnknown("identity, chunked"); + } + + + @Test + public void testTEHeaderUnknown03() throws Exception { + doTestTEHeaderUnknown("unknown, chunked"); + } + + + @Test + public void testTEHeaderUnknown04() throws Exception { + doTestTEHeaderUnknown("void"); + } + + + @Test + public void testTEHeaderUnknown05() throws Exception { + doTestTEHeaderUnknown("void, chunked"); + } + + + @Test + public void testTEHeaderUnknown06() throws Exception { + doTestTEHeaderUnknown("void, identity"); + } + + + @Test + public void testTEHeaderUnknown07() throws Exception { + doTestTEHeaderUnknown("identity, void"); + } + + + private void doTestTEHeaderUnknown(String headerValue) throws Exception { + Tomcat tomcat = getTomcatInstance(); + + // No file system docBase required + Context ctx = tomcat.addContext("", null); + + // Add servlet + Tomcat.addServlet(ctx, "TesterServlet", new TesterServlet(false)); + ctx.addServletMappingDecoded("/foo", "TesterServlet"); + + tomcat.start(); + + String request = + "GET /foo HTTP/1.1" + SimpleHttpClient.CRLF + + "Host: localhost:" + getPort() + SimpleHttpClient.CRLF + + "Transfer-Encoding: " + headerValue + SimpleHttpClient.CRLF + + SimpleHttpClient.CRLF; + + Client client = new Client(tomcat.getConnector().getLocalPort()); + client.setRequest(new String[] {request}); + + client.connect(); + client.processRequest(false); + + Assert.assertTrue(client.isResponse501()); + } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 3cb74a3..3b68e94 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -213,6 +213,12 @@ the empty token is at the start, middle or end of the list of tokens. (markt) </fix> + <fix> + Remove support for the <code>identity</code> transfer encoding. The + inclusion of this encoding in RFC 2616 was an error that was corrected + in 2001. Requests using this transfer encoding will now receive a 501 + response. (markt) + </fix> </changelog> </subsection> <subsection name="Jasper"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org