import socket
import time
import pytest
from .env
import H2Conf
from pyhttpd.curl
import CurlPiper
class TestTimeout:
# Check that base servers 'Timeout' setting is observed on SSL handshake
def test_h2_105_01(self, env):
conf = H2Conf(env)
conf.add(
"""
AcceptFilter http
none
Timeout 1.5
""")
conf.add_vhost_cgi()
conf.install()
assert env.apache_restart() == 0
host =
'localhost'
# read with a longer timeout than the server
sock = socket.create_connection((host, int(env.https_port)))
try:
# on some OS, the server does not see our connection until there is
# something incoming
sock.send(b
'0')
sock.settimeout(4)
buff = sock.recv(1024)
assert buff == b
''
except Exception
as ex:
print(f
"server did not close in time: {ex}")
assert False
sock.close()
# read with a shorter timeout than the server
sock = socket.create_connection((host, int(env.https_port)))
try:
sock.settimeout(0.5)
sock.recv(1024)
assert False
except Exception
as ex:
print(f
"as expected: {ex}")
sock.close()
#
time.sleep(1)
# let the log flush
env.httpd_error_log.ignore_recent(
lognos = [
"AH10373" # SSL handshake was not completed
]
)
# Check that mod_reqtimeout handshake setting takes effect
def test_h2_105_02(self, env):
conf = H2Conf(env)
conf.add(
"""
AcceptFilter http
none
Timeout 10
RequestReadTimeout handshake=1 header=5 body=10
""")
conf.add_vhost_cgi()
conf.install()
assert env.apache_restart() == 0
host =
'localhost'
# read with a longer timeout than the server
sock = socket.create_connection((host, int(env.https_port)))
try:
# on some OS, the server does not see our connection until there is
# something incoming
sock.send(b
'0')
sock.settimeout(4)
buff = sock.recv(1024)
assert buff == b
''
except Exception
as ex:
print(f
"server did not close in time: {ex}")
assert False
sock.close()
# read with a shorter timeout than the server
sock = socket.create_connection((host, int(env.https_port)))
try:
sock.settimeout(0.5)
sock.recv(1024)
assert False
except Exception
as ex:
print(f
"as expected: {ex}")
sock.close()
#
time.sleep(1)
# let the log flush
env.httpd_error_log.ignore_recent(
lognos = [
"AH10373" # SSL handshake was not completed
]
)
# Check that mod_reqtimeout handshake setting do no longer apply to handshaked
# connections. See <https://github.com/icing/mod_h2/issues/196>.
def test_h2_105_03(self, env):
conf = H2Conf(env)
conf.add(
"""
Timeout 10
RequestReadTimeout handshake=1 header=5 body=10
""")
conf.add_vhost_cgi()
conf.install()
assert env.apache_restart() == 0
url = env.mkurl(
"https",
"cgi",
"/necho.py")
r = env.curl_get(url, 5, options=[
"-vvv",
"-F", (
"count=%d" % 100),
"-F", (
"text=%s" %
"abcdefghijklmnopqrstuvwxyz"),
"-F", (
"wait1=%f" % 1.5),
])
assert r.response[
"status"] == 200
def test_h2_105_10(self, env):
# just a check without delays if all is fine
conf = H2Conf(env)
conf.add_vhost_cgi()
conf.install()
assert env.apache_restart() == 0
url = env.mkurl(
"https",
"cgi",
"/h2test/delay")
piper = CurlPiper(env=env, url=url)
piper.start()
stdout, stderr = piper.close()
assert piper.exitcode == 0
assert len(
"".join(stdout)) == 3 * 8192
def test_h2_105_11(self, env):
# short connection timeout, longer stream delay
# connection timeout must not abort ongoing streams
conf = H2Conf(env)
conf.add_vhost_cgi()
conf.add(
"Timeout 1")
conf.install()
assert env.apache_restart() == 0
url = env.mkurl(
"https",
"cgi",
"/h2test/delay?1200ms")
piper = CurlPiper(env=env, url=url)
piper.start()
stdout, stderr = piper.close()
assert len(
"".join(stdout)) == 3 * 8192
def test_h2_105_12(self, env):
# long connection timeout, short stream timeout
# sending a slow POST
if not env.curl_is_at_least(
'8.0.0'):
pytest.skip(f
'need at least curl v8.0.0 for this')
if not env.httpd_is_at_least(
"2.5.0"):
pytest.skip(f
'need at least httpd 2.5.0 for this')
conf = H2Conf(env)
conf.add_vhost_cgi()
conf.add(
"Timeout 10")
conf.add(
"H2StreamTimeout 1")
conf.install()
assert env.apache_restart() == 0
url = env.mkurl(
"https",
"cgi",
"/h2test/delay?5")
piper = CurlPiper(env=env, url=url)
piper.start()
for _
in range(3):
time.sleep(2)
try:
piper.send(
"0123456789\n")
except BrokenPipeError:
break
piper.close()
assert piper.response, f
'{piper}'
assert piper.response[
'status'] == 408, f
"{piper.response}"