diff options
author | Andrei Belov <defan@nginx.com> | 2020-02-06 18:25:25 +0300 |
---|---|---|
committer | Andrei Belov <defan@nginx.com> | 2020-02-06 18:25:25 +0300 |
commit | 2dc01938cf02cc05b41a09e618f712129c4cdf91 (patch) | |
tree | 556dd40a0ec8c194774d53eed9ff62ed1d25ee7c /test/unit/http.py | |
parent | 477a58e14010ab14d6ab453860b360cf806f5012 (diff) | |
parent | 6e19090736612b39d4c5d0836d7df0722b8955e7 (diff) | |
download | unit-2dc01938cf02cc05b41a09e618f712129c4cdf91.tar.gz unit-2dc01938cf02cc05b41a09e618f712129c4cdf91.tar.bz2 |
Merged with the default branch.1.15.0-1
Diffstat (limited to '')
-rw-r--r-- | test/unit/http.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/test/unit/http.py b/test/unit/http.py index 839e91a2..c71e8f7e 100644 --- a/test/unit/http.py +++ b/test/unit/http.py @@ -1,3 +1,6 @@ +import binascii +import io +import os import re import time import json @@ -68,6 +71,10 @@ class TestHTTP(TestUnit): if body != b'': if isinstance(body, str): body = body.encode() + elif isinstance(body, dict): + body, content_type = self.form_encode(body) + + headers['Content-Type'] = content_type if 'Content-Length' not in headers: headers['Content-Length'] = len(body) @@ -266,3 +273,69 @@ class TestHTTP(TestUnit): sock.close() self.assertTrue(ret, 'socket connected') + + def form_encode(self, fields): + is_multipart = False + + for _, value in fields.items(): + if isinstance(value, dict): + is_multipart = True + break + + if is_multipart: + body, content_type = self.multipart_encode(fields) + + else: + body, content_type = self.form_url_encode(fields) + + return body, content_type + + def form_url_encode(self, fields): + data = "&".join("%s=%s" % (name, value) + for name, value in fields.items()).encode() + return data, 'application/x-www-form-urlencoded' + + def multipart_encode(self, fields): + boundary = binascii.hexlify(os.urandom(16)).decode('ascii') + + body = '' + + for field, value in fields.items(): + filename = '' + datatype = '' + + if isinstance(value, dict): + datatype = 'text/plain' + filename = value['filename'] + + if value.get('type'): + datatype = value['type'] + + if not isinstance(value['data'], io.IOBase): + self.fail('multipart encoding of file requires a stream.') + + data = value['data'].read() + + elif isinstance(value, str): + data = value + + else: + self.fail('multipart requires a string or stream data') + + body += ( + "--%s\r\nContent-Disposition: form-data; name=\"%s\"" + ) % (boundary, field) + + if filename != '': + body += "; filename=\"%s\"" % filename + + body += "\r\n" + + if datatype != '': + body += "Content-Type: %s\r\n" % datatype + + body += "\r\n%s\r\n" % data + + body += "--%s--\r\n" % boundary + + return body.encode(), "multipart/form-data; boundary=%s" % boundary |