| # |
| # mod-h2 test suite |
| # check HTTP/2 timeout behaviour |
| # |
| import time |
| from threading import Thread |
| |
| import pytest |
| |
| from .env import H2Conf, H2TestEnv |
| from pyhttpd.result import ExecResult |
| |
| |
| @pytest.mark.skipif(condition=H2TestEnv.is_unsupported, reason="mod_http2 not supported here") |
| class TestShutdown: |
| |
| @pytest.fixture(autouse=True, scope='class') |
| def _class_scope(self, env): |
| conf = H2Conf(env) |
| conf.add_vhost_cgi() |
| conf.install() |
| assert env.apache_restart() == 0 |
| |
| def test_h2_106_01(self, env): |
| url = env.mkurl("https", "cgi", "/necho.py") |
| lines = 100000 |
| text = "123456789" |
| wait2 = 1.0 |
| self.r = None |
| def long_request(): |
| args = ["-vvv", |
| "-F", f"count={lines}", |
| "-F", f"text={text}", |
| "-F", f"wait2={wait2}", |
| ] |
| self.r = env.curl_get(url, 5, options=args) |
| |
| t = Thread(target=long_request) |
| t.start() |
| time.sleep(0.5) |
| assert env.apache_reload() == 0 |
| t.join() |
| # noinspection PyTypeChecker |
| time.sleep(1) |
| r: ExecResult = self.r |
| assert r.exit_code == 0 |
| assert r.response, f"no response via {r.args} in {r.stderr}\nstdout: {len(r.stdout)} bytes" |
| assert r.response["status"] == 200, f"{r}" |
| assert len(r.response["body"]) == (lines * (len(text)+1)), f"{r}" |
| |
| def test_h2_106_02(self, env): |
| # PR65731: invalid GOAWAY frame at session start when |
| # MaxRequestsPerChild is reached |
| # Create a low limit and only 2 children, so we'll encounter this easily |
| conf = H2Conf(env, extras={ |
| 'base': [ |
| "ServerLimit 2", |
| "MaxRequestsPerChild 3" |
| ] |
| }) |
| conf.add_vhost_test1() |
| conf.install() |
| assert env.apache_restart() == 0 |
| url = env.mkurl("https", "test1", "/index.html") |
| for i in range(7): |
| r = env.curl_get(url, options=['-v']) |
| # requests should succeed, but rarely connections get closed |
| # before the response is received |
| if r.exit_code in [16, 55]: |
| # curl send error |
| assert r.response is None |
| else: |
| assert r.exit_code == 0, f"failed on {i}. request: {r.stdout} {r.stderr}" |
| assert r.response["status"] == 200 |
| assert "HTTP/2" == r.response["protocol"] |
| # |
| env.httpd_error_log.ignore_recent( |
| lognos = [ |
| "AH03490" # scoreboard is full, not at MaxRequestWorkers |
| ] |
| ) |