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 f0797a8f7ccad15e939889167bd45f097b8ab4ca Author: Mark Thomas <ma...@apache.org> AuthorDate: Fri Jan 14 19:25:35 2022 +0000 Fix server push. Validation will see pseudo headers so should allow them --- java/org/apache/coyote/http2/StreamProcessor.java | 19 ++++++++++++++++++- webapps/docs/changelog.xml | 8 ++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/java/org/apache/coyote/http2/StreamProcessor.java b/java/org/apache/coyote/http2/StreamProcessor.java index b3597c4..5572e07 100644 --- a/java/org/apache/coyote/http2/StreamProcessor.java +++ b/java/org/apache/coyote/http2/StreamProcessor.java @@ -19,7 +19,9 @@ package org.apache.coyote.http2; import java.io.File; import java.io.IOException; import java.util.Enumeration; +import java.util.HashSet; import java.util.Iterator; +import java.util.Set; import jakarta.servlet.ServletConnection; import jakarta.servlet.http.HttpServletResponse; @@ -51,11 +53,19 @@ class StreamProcessor extends AbstractProcessor { private static final Log log = LogFactory.getLog(StreamProcessor.class); private static final StringManager sm = StringManager.getManager(StreamProcessor.class); + private static final Set<String> H2_PSEUDO_HEADERS_REQUEST = new HashSet<>(); + private final Http2UpgradeHandler handler; private final Stream stream; private SendfileData sendfileData = null; private SendfileState sendfileState = null; + static { + H2_PSEUDO_HEADERS_REQUEST.add(":method"); + H2_PSEUDO_HEADERS_REQUEST.add(":scheme"); + H2_PSEUDO_HEADERS_REQUEST.add(":authority"); + H2_PSEUDO_HEADERS_REQUEST.add(":path"); + } StreamProcessor(Http2UpgradeHandler handler, Stream stream, Adapter adapter, SocketWrapperBase<?> socketWrapper) { @@ -494,9 +504,16 @@ class StreamProcessor extends AbstractProcessor { // HTTP header names must be tokens. MimeHeaders headers = request.getMimeHeaders(); + boolean previousHeaderWasPseudoHeader = true; Enumeration<String> names = headers.names(); while (names.hasMoreElements()) { - if (!HttpParser.isToken(names.nextElement())) { + String name = names.nextElement(); + if (H2_PSEUDO_HEADERS_REQUEST.contains(name)) { + if (!previousHeaderWasPseudoHeader) { + return false; + } + } else if (!HttpParser.isToken(name)) { + previousHeaderWasPseudoHeader = false; return false; } } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 0266d6f..dfdbf37 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -105,6 +105,14 @@ issues do not "pop up" wrt. others). --> <section name="Tomcat 10.1.0-M10 (markt)" rtext="in development"> + <subsection name="Coyote"> + <changelog> + <fix> + Correct a regression in the fix for <bug>65785</bug> that broke HTTP/2 + server push. (markt) + </fix> + </changelog> + </subsection> </section> <section name="Tomcat 10.1.0-M9 (markt)" rtext="release in progress"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org