blob: 797181bfca91f51cab8700b0803e3ca61334dcaa [file] [log] [blame]
#!/usr/bin/env python3
'''
'''
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import subprocess
import sys
import os
import shlex
import h2_early_decode
import argparse
def main():
parser = argparse.ArgumentParser(description='Process some args.')
parser.add_argument('-p', '--ats-port', type=int, dest='ats_port', required=True, help='ATS port number')
parser.add_argument('-v', '--http-version', type=str, dest='http_ver', choices=['h1', 'h2'], required=True, help='HTTP version')
parser.add_argument('-t', '--test-name', type=str, dest='test_name', required=True, help='Name of the test to run')
parser.add_argument('-r', '--run-dir', type=str, dest='run_dir', required=True, help='Path to the autest run directory')
parser.add_argument('-s', '--server-name', type=str, dest='sni', required=False, help='Server Name')
args = parser.parse_args()
sess_file_path = os.path.join(args.run_dir, 'sess.dat')
early_data_file_path = os.path.join(args.run_dir, 'early_{0}_{1}.txt'.format(args.http_ver, args.test_name))
if args.sni != '':
sni_str = '-servername {0}'.format(args.sni)
else:
sni_str = ''
s_client_cmd_1 = shlex.split(
f'openssl s_client -connect 127.0.0.1:{args.ats_port} -tls1_3 -quiet -sess_out {sess_file_path} {sni_str}')
s_client_cmd_2 = shlex.split(
f'openssl s_client -connect 127.0.0.1:{args.ats_port} -tls1_3 -quiet -sess_in {sess_file_path} -early_data {early_data_file_path} {sni_str}')
create_sess_proc = subprocess.Popen(s_client_cmd_1, env=os.environ.copy(
), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
try:
output = create_sess_proc.communicate(input=bytes(b'GET / HTTP/1.0\r\n\r\n'), timeout=1)[0]
except subprocess.TimeoutExpired:
create_sess_proc.kill()
output = create_sess_proc.communicate()[0]
reuse_sess_proc = subprocess.Popen(s_client_cmd_2, env=os.environ.copy(
), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
try:
output = reuse_sess_proc.communicate(timeout=1)[0]
except subprocess.TimeoutExpired:
reuse_sess_proc.kill()
output = reuse_sess_proc.communicate()[0]
if args.http_ver == 'h2':
lines = output.split(bytes('\n', 'utf-8'))
data = b''
for line in lines:
line += b'\n'
if line.startswith(bytes('SSL_connect:', 'utf-8')) or \
line.startswith(bytes('SSL3 alert', 'utf-8')) or \
bytes('Can\'t use SSL_get_servername', 'utf-8') in line:
continue
data += line
d = h2_early_decode.Decoder()
frames = d.decode(data)
for frame in frames:
print(frame)
else:
print(output.decode('utf-8'))
exit(0)
if __name__ == '__main__':
main()