diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 913a5bb3648..beb84c0fdc3 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -197,7 +197,7 @@ jobs:
# -------------------------------------------------------------------------
- name: HTTP/2 test suite
config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=all
- pkgs: curl python3-pytest nghttp2-client python3-cryptography python3-requests python3-multipart
+ pkgs: curl python3-pytest nghttp2-client python3-cryptography python3-requests python3-multipart python3-filelock python3-websockets
env: |
APR_VERSION=1.7.4
APU_VERSION=1.6.3
@@ -228,7 +228,7 @@ jobs:
### TODO: fix caching here.
- name: MOD_TLS test suite
config: --enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=event
- pkgs: curl python3-pytest nghttp2-client python3-cryptography python3-requests python3-multipart cargo cbindgen
+ pkgs: curl python3-pytest nghttp2-client python3-cryptography python3-requests python3-multipart python3-filelock python3-websockets cargo cbindgen
env: |
APR_VERSION=1.7.4
APU_VERSION=1.6.3
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e27d6863014..869f72173f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -497,6 +497,7 @@ SET(mod_http2_extra_sources
modules/http2/h2_request.c modules/http2/h2_session.c
modules/http2/h2_stream.c modules/http2/h2_switch.c
modules/http2/h2_util.c modules/http2/h2_workers.c
+ modules/http2/h2_ws.c
)
SET(mod_ldap_extra_defines LDAP_DECLARE_EXPORT)
SET(mod_ldap_extra_libs wldap32)
@@ -966,7 +967,7 @@ IF(OPENSSL_FOUND)
SET_TARGET_PROPERTIES(abs PROPERTIES INCLUDE_DIRECTORIES "${tmp_includes}")
DEFINE_WITH_BLANKS(define_long_name "LONG_NAME" "Apache HTTP Server ab/SSL program")
SET_TARGET_PROPERTIES(abs PROPERTIES COMPILE_FLAGS "-DAPP_FILE ${define_long_name} -DBIN_NAME=abs.exe ${EXTRA_COMPILE_FLAGS}")
- TARGET_LINK_LIBRARIES(abs ${EXTRA_LIBS} ${APR_LIBRARIES} ${OPENSSL_LIBRARIES})
+ TARGET_LINK_LIBRARIES(abs ${EXTRA_LIBS} ${APR_LIBRARIES} ${OPENSSL_LIBRARIES} Ws2_32.lib)
ENDIF()
GET_PROPERTY(tmp_includes TARGET ab PROPERTY INCLUDE_DIRECTORIES)
diff --git a/changes-entries/h2_flush_fix.txt b/changes-entries/h2_flush_fix.txt
new file mode 100644
index 00000000000..b44a3319f67
--- /dev/null
+++ b/changes-entries/h2_flush_fix.txt
@@ -0,0 +1,4 @@
+ *) mod_http2: fixed a bug in flushing pending data on an already closed
+ connection that could lead to a busy loop, preventing the HTTP/2 session
+ to close down successfully. Fixed PR 66624.
+ [Stefan Eissing]
diff --git a/changes-entries/h2_pr66646.txt b/changes-entries/h2_pr66646.txt
new file mode 100644
index 00000000000..6bf23cfe47b
--- /dev/null
+++ b/changes-entries/h2_pr66646.txt
@@ -0,0 +1,6 @@
+ *) mod_http2: fixed a bug that could lead to a crash in main connection
+ output handling. This occured only when the last request on a HTTP/2
+ connection had been processed and the session decided to shut down.
+ This could lead to an attempt to send a final GOAWAY while the previous
+ write was still in progress. See PR 66646.
+ [Stefan Eissing]
diff --git a/changes-entries/h2_proxyrequests.txt b/changes-entries/h2_proxyrequests.txt
new file mode 100644
index 00000000000..199d2c93b03
--- /dev/null
+++ b/changes-entries/h2_proxyrequests.txt
@@ -0,0 +1,6 @@
+ *) mod_http2: new directive `H2ProxyRequests on|off` to enable handling
+ of HTTP/2 requests in a forward proxy configuration.
+ General forward proxying is enabled via `ProxyRequests`. If the
+ HTTP/2 protocol is also enabled for such a server/host, this new
+ directive is needed in addition.
+ [Stefan Eissing]
diff --git a/changes-entries/h2_websockets.txt b/changes-entries/h2_websockets.txt
new file mode 100644
index 00000000000..0f2bc715da0
--- /dev/null
+++ b/changes-entries/h2_websockets.txt
@@ -0,0 +1,10 @@
+ *) mod_http2: added support for bootstrapping WebSockets via HTTP/2, as
+ described in RFC 8441. A new directive 'H2WebSockets on|off' has been
+ added. The feature is by default not enabled.
+ As also discussed in the manual, this feature should work for setups
+ using "ProxyPass backend-url upgrade=websocket" without further changes.
+ Special server modules for WebSockets will have to be adapted,
+ most likely, as the handling if IO events is different with HTTP/2.
+ HTTP/2 WebSockets are supported on platforms with native pipes. This
+ excludes Windows.
+ [Stefan Eissing]
\ No newline at end of file
diff --git a/changes-entries/pr66672.txt b/changes-entries/pr66672.txt
new file mode 100644
index 00000000000..f36897bb0d2
--- /dev/null
+++ b/changes-entries/pr66672.txt
@@ -0,0 +1,3 @@
+ *) mod_rewrite: Fix a recent regression where a rule with both a trailing
+ '?' and the [QSA] flag did not have the query appended. PR66672
+ Frank Meier Traitement des bugs
Voir aussi
@@ -622,6 +624,30 @@
provenir d'un client dont l'implémentation comporte des erreurs.
Description: | Active/Désactive les requêtes sous mandat direct via HTTP/2 |
---|---|
Syntaxe: | H2ProxyRequests on|off |
Défaut: | H2ProxyRequests off |
Contexte: | configuration globale, serveur virtuel |
Statut: | Extension |
Module: | mod_http2 |
Compatibilité: | Disponible à partir de la version 2.5.1 du serveur HTTP + Apache |
+ La directive H2ProxyRequests
permet
+ d'activer ou de désactiver la gestion des requêtes HTTP/2 dans
+ un contexte de mandat direct.
+
+ Similaire à ProxyRequests
,
+ cette directive déclenche le traitement nécessaire des requêtes
+ lorsque HTTP/2 est activé dans un contexte de mandat direct.
+
+
+H2Upgrade on
Description: | Active/désactive les WebSockets via HTTP/2 |
---|---|
Syntaxe: | H2WebSockets on|off |
Défaut: | H2WebSockets off |
Contexte: | configuration globale, serveur virtuel |
Statut: | Extension |
Module: | mod_http2 |
Compatibilité: | Disponible à partir de la version 2.5.1 du serveur HTTP + Apache |
+ La directive H2WebSockets
permet
+ d'activer ou de désactiver l'amorçage des WebSockets via le
+ protocole HTTP/2. Cette extension du protocole est définie dans
+ la RFC 8441.
+
+ Ces requêtes sont similaires à CONNECT, mais elles possèdent + l'en-tête supplémentaire ':protocol'. Elles sont transformées au + sein du module en leurs équivalents HTTP/1.1 avant d'être + soumises au traitement interne. +
+ Cela signifie que les WebSockets HTTP/2 peuvent être utilisés
+ dans le cadre d'une directive ProxyPass
avec le paramètre
+ 'upgrade=websocket' sans autres modifications.
+
+ Pour les modules tiers qui gèrent les WebSockets directement + dans le serveur, l'amorçage du protocole lui-même fonctionnera + aussi. Dans le cas de HTTP/2 cependant, le transfert de données + nécessite une prise en charge supplémentaire. Le WebSocket + négocié sera incapable d'utiliser le socket de connexion du + client pour examiner les évènements d'entrée/sortie concernés. +
+ Cette fonctionnalité étant susceptible de briser la + compatibilité ascendante pour de tels modules tiers, elle n'est + pas activée par défaut. +
+
+ Use
+ Such requests come as a CONNECT with an extra ':protocol' + header. Such requests are transformed inside the module to + their HTTP/1.1 equivalents before passing it to internal + processing. +
+ This means that HTTP/2 WebSockets can be used for a
+
+ For (3rd party) modules that handle WebSockets directly in the + server, the protocol bootstrapping itself will also work. However + the transfer of data does require extra support in case of HTTP/2. + The negotiated WebSocket will not be able to use the client connection + socket for polling IO related events. +
+ Because enabling this feature might break backward compatibility + for such 3rd party modules, it is not enabled by default. +
+
+ Use
+ Similar to
+
+