*) mod_proxy_http2: fix X-Forward-Host header to carry the correct value.

Fixed PR66752.



git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1912180 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stefan Eissing
2023-09-08 07:39:50 +00:00
parent 18b8e6c4ab
commit a2dabc2122
4 changed files with 54 additions and 23 deletions

View File

@ -1,20 +1,25 @@
#!/usr/bin/env python3
import os
import json
resp = {
'https': os.getenv('HTTPS', ''),
'host': os.getenv('X_HOST', '') if 'X_HOST' in os.environ else os.getenv('SERVER_NAME', ''),
'server': os.getenv('SERVER_NAME', ''),
'h2_original_host': os.getenv('H2_ORIGINAL_HOST', ''),
'port': os.getenv('SERVER_PORT', ''),
'protocol': os.getenv('SERVER_PROTOCOL', ''),
'ssl_protocol': os.getenv('SSL_PROTOCOL', ''),
'h2': os.getenv('HTTP2', ''),
'h2push': os.getenv('H2PUSH', ''),
'h2_stream_id': os.getenv('H2_STREAM_ID', ''),
'x-forwarded-for': os.getenv('HTTP_X_FORWARDED_FOR', ''),
'x-forwarded-host': os.getenv('HTTP_X_FORWARDED_HOST', ''),
'x-forwarded-server': os.getenv('HTTP_X_FORWARDED_SERVER', ''),
}
print("Content-Type: application/json")
print()
print("{")
print(" \"https\" : \"%s\"," % (os.getenv('HTTPS', '')))
print(" \"host\" : \"%s\"," % (os.getenv('X_HOST', '') \
if 'X_HOST' in os.environ else os.getenv('SERVER_NAME', '')))
print(" \"server\" : \"%s\"," % (os.getenv('SERVER_NAME', '')))
print(" \"h2_original_host\" : \"%s\"," % (os.getenv('H2_ORIGINAL_HOST', '')))
print(" \"port\" : \"%s\"," % (os.getenv('SERVER_PORT', '')))
print(" \"protocol\" : \"%s\"," % (os.getenv('SERVER_PROTOCOL', '')))
print(" \"ssl_protocol\" : \"%s\"," % (os.getenv('SSL_PROTOCOL', '')))
print(" \"h2\" : \"%s\"," % (os.getenv('HTTP2', '')))
print(" \"h2push\" : \"%s\"," % (os.getenv('H2PUSH', '')))
print(" \"h2_stream_id\" : \"%s\"" % (os.getenv('H2_STREAM_ID', '')))
print("}")
print(json.JSONEncoder(indent=2).encode(resp))

View File

@ -136,6 +136,28 @@ class TestH2Proxy:
else env.http_port2
assert int(r.json[1]["port"]) == exp_port
# test X-Forwarded-* headers
def test_h2_600_06(self, env):
conf = H2Conf(env, extras={
f'cgi.{env.http_tld}': [
"SetEnvIf Host (.+) X_HOST=$1",
f"ProxyPreserveHost on",
f"ProxyPass /h2c/ h2c://127.0.0.1:{env.http_port}/",
f"ProxyPass /h1c/ http://127.0.0.1:{env.http_port}/",
]
})
conf.add_vhost_cgi(proxy_self=True)
conf.install()
assert env.apache_restart() == 0
url = env.mkurl("https", "cgi", "/h1c/hello.py")
r1 = env.curl_get(url, 5)
assert r1.response["status"] == 200
url = env.mkurl("https", "cgi", "/h2c/hello.py")
r2 = env.curl_get(url, 5)
assert r2.response["status"] == 200
for key in ['x-forwarded-for', 'x-forwarded-host','x-forwarded-server']:
assert r1.json[key] == r2.json[key], f'{key} differs proxy_http != proxy_http2'
# lets do some error tests
def test_h2_600_30(self, env):
conf = H2Conf(env)