Fix server push. Validation will see pseudo headers so should allow them
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 @@
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 @@
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 @@
// 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">