diff options
author | Rainer Jung <rjung@apache.org> | 2023-03-09 23:02:32 +0000 |
---|---|---|
committer | Rainer Jung <rjung@apache.org> | 2023-03-09 23:02:32 +0000 |
commit | dd662003f66960df5ddfb3b89439df5f88db76e1 (patch) | |
tree | 1f0b15414ed6e37977cb8884e3a9f7c5b6020493 /test | |
parent | 959bd494525598d9bd7670e211df6b771a2d4bbb (diff) | |
download | httpd-dd662003f66960df5ddfb3b89439df5f88db76e1.tar.gz |
Support splitting mutiple outputs when using curl with
multiple URLs. E.g. provide a JSON array with the
individual JSON responses as items.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1908229 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test')
-rw-r--r-- | test/pyhttpd/curl.py | 2 | ||||
-rw-r--r-- | test/pyhttpd/env.py | 33 | ||||
-rw-r--r-- | test/pyhttpd/result.py | 9 |
3 files changed, 35 insertions, 9 deletions
diff --git a/test/pyhttpd/curl.py b/test/pyhttpd/curl.py index 338e82ce44..2b6840b161 100644 --- a/test/pyhttpd/curl.py +++ b/test/pyhttpd/curl.py @@ -32,7 +32,7 @@ class CurlPiper: return self._r.response if self._r else None def start(self): - self.args, self.headerfile = self.env.curl_complete_args(self.url, timeout=5, options=[ + self.args, self.headerfile = self.env.curl_complete_args([self.url], timeout=5, options=[ "-T", "-", "-X", "POST", "--trace-ascii", "%", "--trace-time"]) sys.stderr.write("starting: {0}\n".format(self.args)) self.proc = subprocess.Popen(self.args, stdin=subprocess.PIPE, diff --git a/test/pyhttpd/env.py b/test/pyhttpd/env.py index 67d32b7b38..db20275f43 100644 --- a/test/pyhttpd/env.py +++ b/test/pyhttpd/env.py @@ -65,6 +65,8 @@ class HttpdTestSetup: "proxy_http", ] + CURL_STDOUT_SEPARATOR = "===CURL_STDOUT_SEPARATOR===" + def __init__(self, env: 'HttpdTestEnv'): self.env = env self._source_dirs = [os.path.dirname(inspect.getfile(HttpdTestSetup))] @@ -497,14 +499,26 @@ class HttpdTestEnv: if not os.path.exists(path): return os.makedirs(path) - def run(self, args, intext=None, debug_log=True): + def run(self, args, stdout_list=False, intext=None, debug_log=True): if debug_log: log.debug(f"run: {args}") start = datetime.now() p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE, input=intext.encode() if intext else None) + stdout_as_list = None + if stdout_list: + try: + out = p.stdout.decode() + if HttpdTestSetup.CURL_STDOUT_SEPARATOR in out: + stdout_as_list = out.split(HttpdTestSetup.CURL_STDOUT_SEPARATOR) + if not stdout_as_list[len(stdout_as_list) - 1]: + stdout_as_list.pop() + p.stdout.replace(HttpdTestSetup.CURL_STDOUT_SEPARATOR.encode(), b'') + except: + pass return ExecResult(args=args, exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, + stdout_as_list=stdout_as_list, duration=datetime.now() - start) def mkurl(self, scheme, hostname, path='/'): @@ -637,10 +651,9 @@ class HttpdTestEnv: os.remove(os.path.join(self.gen_dir, fname)) self._curl_headerfiles_n = 0 - def curl_complete_args(self, urls, timeout=None, options=None, + def curl_complete_args(self, urls, stdout_list=False, + timeout=None, options=None, insecure=False, force_resolve=True): - if not isinstance(urls, list): - urls = [urls] u = urlparse(urls[0]) #assert u.hostname, f"hostname not in url: {urls[0]}" headerfile = f"{self.gen_dir}/curl.headers.{self._curl_headerfiles_n}" @@ -649,6 +662,8 @@ class HttpdTestEnv: args = [ self._curl, "-s", "--path-as-is", "-D", headerfile, ] + if stdout_list: + args.extend(['-w', '%{stdout}' + HttpdTestSetup.CURL_STDOUT_SEPARATOR]) if u.scheme == 'http': pass elif insecure: @@ -731,10 +746,16 @@ class HttpdTestEnv: def curl_raw(self, urls, timeout=10, options=None, insecure=False, force_resolve=True): + if not isinstance(urls, list): + urls = [urls] + stdout_list = False + if len(urls) > 1: + stdout_list = True args, headerfile = self.curl_complete_args( - urls=urls, timeout=timeout, options=options, insecure=insecure, + urls=urls, stdout_list=stdout_list, + timeout=timeout, options=options, insecure=insecure, force_resolve=force_resolve) - r = self.run(args) + r = self.run(args, stdout_list=stdout_list) if r.exit_code == 0: self.curl_parse_headerfile(headerfile, r=r) if r.json: diff --git a/test/pyhttpd/result.py b/test/pyhttpd/result.py index 04ea825a31..3789461be4 100644 --- a/test/pyhttpd/result.py +++ b/test/pyhttpd/result.py @@ -6,7 +6,9 @@ from typing import Optional, Dict, List class ExecResult: def __init__(self, args: List[str], exit_code: int, - stdout: bytes, stderr: bytes = None, duration: timedelta = None): + stdout: bytes, stderr: bytes = None, + stdout_as_list: List[bytes] = None, + duration: timedelta = None): self._args = args self._exit_code = exit_code self._stdout = stdout if stdout is not None else b'' @@ -17,7 +19,10 @@ class ExecResult: self._assets = [] # noinspection PyBroadException try: - out = self._stdout.decode() + if stdout_as_list is None: + out = self._stdout.decode() + else: + out = "[" + ','.join(stdout_as_list) + "]" self._json_out = json.loads(out) except: self._json_out = None |