summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRainer Jung <rjung@apache.org>2023-03-09 23:02:32 +0000
committerRainer Jung <rjung@apache.org>2023-03-09 23:02:32 +0000
commitdd662003f66960df5ddfb3b89439df5f88db76e1 (patch)
tree1f0b15414ed6e37977cb8884e3a9f7c5b6020493 /test
parent959bd494525598d9bd7670e211df6b771a2d4bbb (diff)
downloadhttpd-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.py2
-rw-r--r--test/pyhttpd/env.py33
-rw-r--r--test/pyhttpd/result.py9
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