| """ | |
| Tests for mod_proxy_uwsgi fix. | |
| Per PEP 3333, WSGI applications must not generate hop-by-hop | |
| headers. Remove any such headers received from the backend. | |
| """ | |
| import re | |
| import pytest | |
| from pyhttpd.conf import HttpdConf | |
| from .uwsgi_faker import UwsgiFaker | |
| UWSGI_PORT = 5200 | |
| @pytest.fixture(autouse=True, scope="class") | |
| def _proxy_uwsgi_setup(env): | |
| faker = UwsgiFaker(port=UWSGI_PORT) | |
| faker.start() | |
| conf = HttpdConf(env) | |
| conf.start_vhost( | |
| domains=[env.d_reverse], | |
| port=env.http_port, | |
| with_ssl=False, | |
| ) | |
| conf.add([ | |
| "LogLevel proxy_uwsgi:debug", | |
| f"ProxyPass / uwsgi://127.0.0.1:{UWSGI_PORT}/", | |
| "LogLevel trace4", | |
| ]) | |
| conf.end_vhost() | |
| conf.install() | |
| assert env.apache_restart() == 0 | |
| yield | |
| faker.stop() | |
| class TestProxyUwsgi: | |
| def test_proxy_03_001(self, env): | |
| """uWSGI backend response is forwarded correctly.""" | |
| r = env.curl_get( | |
| f"http://{env.d_reverse}:{env.http_port}/", | |
| 5, | |
| ) | |
| assert r.response["status"] == 200 | |
| assert r.json["host"] == "uwsgi-faker" | |
| def test_proxy_03_002(self, env): | |
| """No Transfer-Encoding header reaches the client.""" | |
| r = env.curl_get( | |
| f"http://{env.d_reverse}:{env.http_port}/", | |
| 5, | |
| ) | |
| assert r.response["status"] == 200 | |
| assert "transfer-encoding" not in r.response["header"] | |
| def test_proxy_03_003(self, env): | |
| """Transfer-Encoding is stripped by mod_proxy_uwsgi.""" | |
| r = env.curl_get( | |
| f"http://{env.d_reverse}:{env.http_port}/?te=1", | |
| 5, | |
| ) | |
| print("response =", r.response) | |
| print("stderr =", getattr(r, "stderr", None)) | |
| print("stdout =", getattr(r, "stdout", None)) | |
| print("exitcode =", getattr(r, "exit_code", None)) | |
| print("json =", getattr(r, "json", None)) | |
| assert r.response is not None | |
| assert r.response["status"] == 200 | |
| assert "transfer-encoding" not in r.response["header"] | |
| assert r.json["host"] == "uwsgi-faker" | |
| assert env.httpd_error_log.scan_recent( | |
| re.compile( | |
| r".*uwsgi: removing hop-by-hop header 'Transfer-Encoding'" | |
| ) | |
| ) |