import json
import logging
import os
import pytest
from .env import H2Conf, H2TestEnv
log = logging.getLogger(__name__)
@pytest.mark.skipif(condition=H2TestEnv.is_unsupported, reason="mod_http2 not supported here" )
class TestH2ProxyTwisted:
@pytest.fixture(autouse=True , scope='class' )
def _class_scope(self, env):
H2Conf(env).add_vhost_cgi(proxy_self=True , h2proxy_self=True ).install()
assert env.apache_restart() == 0
@pytest.mark.parametrize("name" , [
"data-1k" , "data-10k" , "data-100k" , "data-1m" ,
])
def test_h2_601_01_echo_uploads(self, env, name):
fpath = os.path.join(env.gen_dir, name)
url = env.mkurl("https" , "cgi" , "/h2proxy/h2test/echo" )
r = env.curl_upload(url, fpath, options=[])
assert r.exit_code == 0
assert 200 <= r.response["status" ] < 300
# we POST a form, so echoed input is larger than the file itself
assert len(r.response["body" ]) > os.path.getsize(fpath)
@pytest.mark.parametrize("name" , [
"data-1k" , "data-10k" , "data-100k" , "data-1m" ,
])
def test_h2_601_02_echo_delayed(self, env, name):
fpath = os.path.join(env.gen_dir, name)
url = env.mkurl("https" , "cgi" , "/h2proxy/h2test/echo?chunk_delay=10ms" )
r = env.curl_upload(url, fpath, options=[])
assert r.exit_code == 0
assert 200 <= r.response["status" ] < 300
# we POST a form, so echoed input is larger than the file itself
assert len(r.response["body" ]) > os.path.getsize(fpath)
@pytest.mark.parametrize("name" , [
"data-1k" , "data-10k" , "data-100k" , "data-1m" ,
])
def test_h2_601_03_echo_fail_early(self, env, name):
if not env.httpd_is_at_least('2.4.58' ):
pytest.skip(f'needs httpd 2.4.58' )
fpath = os.path.join(env.gen_dir, name)
url = env.mkurl("https" , "cgi" , "/h2proxy/h2test/echo?fail_after=512" )
r = env.curl_upload(url, fpath, options=[])
# 92 is curl's CURLE_HTTP2_STREAM
assert r.exit_code == 92 or r.response["status" ] == 502
@pytest.mark.parametrize("name" , [
"data-1k" , "data-10k" , "data-100k" , "data-1m" ,
])
def test_h2_601_04_echo_fail_late(self, env, name):
if not env.httpd_is_at_least('2.4.58' ):
pytest.skip(f'needs httpd 2.4.58' )
fpath = os.path.join(env.gen_dir, name)
url = env.mkurl("https" , "cgi" , f"/h2proxy/h2test/echo?fail_after={os.path.getsize(fpath)}" )
r = env.curl_upload(url, fpath, options=[])
# 92 is curl's CURLE_HTTP2_STREAM
if r.exit_code != 0:
# H2 stream or partial file error
assert r.exit_code == 92 or r.exit_code == 18, f'{r}'
else :
assert r.response["status" ] == 502, f'{r}'
def test_h2_601_05_echo_fail_many(self, env):
if not env.httpd_is_at_least('2.4.58' ):
pytest.skip(f'needs httpd 2.4.58' )
if not env.curl_is_at_least('8.0.0' ):
pytest.skip(f'need at least curl v8.0.0 for this' )
count = 200
fpath = os.path.join(env.gen_dir, "data-100k" )
args = [env.curl, '--parallel' , '--parallel-max' , '20' ]
for i in range(count):
if i > 0:
args.append('--next' )
url = env.mkurl("https" , "cgi" , f"/h2proxy/h2test/echo?id={i}&fail_after={os.path.getsize(fpath)}" )
args.extend(env.curl_resolve_args(url=url))
args.extend([
'-o' , '/dev/null' , '-w' , '%{json}\\n' , '--form' , f'file=@{fpath}' , url
])
log.error(f'run: {args}' )
r = env.run(args)
stats = []
for line in r.stdout.splitlines():
stats.append(json.loads(line))
assert len(stats) == count
for st in stats:
if st['exitcode' ] != 0:
# H2 stream or partial file error
assert st['exitcode' ] == 92 or st['exitcode' ] == 18, f'{r}'
else :
assert st['http_code' ] == 502, f'{r}'
quality 89%
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.14Angebot
Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können
¤
*Eine klare Vorstellung vom Zielzustand