urequests: Add ability to parse response headers.

This is controlled by parse_headers param to request(), which defaults to
True for compatibility with upstream requests. In this case, headers are
available as .headers of Response objects. They are however normal (not
case-insensitive) dict.

If parse_headers=False, old behavior of ignore response headers is used,
which saves memory on the dict.

Finally, parse_headers can be a custom function which can e.g. parse only
subset of headers (again, to save memory).
pull/500/head
Paul Sokolovsky 2018-08-05 13:27:18 +03:00 zatwierdzone przez Andrew Leech
rodzic db4c739863
commit 5854ae1286
1 zmienionych plików z 15 dodań i 1 usunięć

Wyświetl plik

@ -33,7 +33,7 @@ class Response:
return ujson.loads(self.content)
def request(method, url, data=None, json=None, headers={}, stream=None):
def request(method, url, data=None, json=None, headers={}, stream=None, parse_headers=True):
try:
proto, dummy, host, path = url.split("/", 3)
except ValueError:
@ -55,6 +55,10 @@ def request(method, url, data=None, json=None, headers={}, stream=None):
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
ai = ai[0]
resp_d = None
if parse_headers is not False:
resp_d = {}
s = usocket.socket(ai[0], ai[1], ai[2])
try:
s.connect(ai[-1])
@ -98,6 +102,14 @@ def request(method, url, data=None, json=None, headers={}, stream=None):
raise ValueError("Unsupported " + l)
elif l.startswith(b"Location:") and not 200 <= status <= 299:
raise NotImplementedError("Redirects not yet supported")
if parse_headers is False:
pass
elif parse_headers is True:
l = str(l, "utf-8")
k, v = l.split(":", 1)
resp_d[k] = v.strip()
else:
parse_headers(l, resp_d)
except OSError:
s.close()
raise
@ -105,6 +117,8 @@ def request(method, url, data=None, json=None, headers={}, stream=None):
resp = Response(s)
resp.status_code = status
resp.reason = reason
if resp_d is not None:
resp.headers = resp_d
return resp