Tests: add helper for form-data and multipart.

This commit is contained in:
Tiago Natel de Moura
2020-02-05 13:13:04 +00:00
parent 29d8b34244
commit d3e218a8c3
2 changed files with 90 additions and 22 deletions

View File

@@ -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