This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 37ef4a8202664a7d36efb62bd8f1be0f48f314e2 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 3f26a8a..8582473 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 javax.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) { @@ -495,9 +505,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 ee09f37..ebba960 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 9.0.58 (remm)" 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 9.0.57 (remm)" rtext="2022-01-12 in progress"> <subsection name="Catalina"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org