From ae525eac87f80882f24e0c5cc94f2bae815990a5 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Mon, 7 Mar 2016 14:30:54 +0700 Subject: [PATCH] urequests: Initial version of micro-requests. The idea is to provide some subset of interface of Requests (python-requests.org). --- urequests/urequests.py | 92 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 urequests/urequests.py diff --git a/urequests/urequests.py b/urequests/urequests.py new file mode 100644 index 00000000..ecd0b46b --- /dev/null +++ b/urequests/urequests.py @@ -0,0 +1,92 @@ +import usocket + +class Response: + + def __init__(self, f): + self.raw = f + self.encoding = "utf-8" + self._cached = None + + def close(self): + if self.raw: + self.raw.close() + self.raw = None + self._cached = None + + @property + def content(self): + if self._cached is None: + self._cached = self.raw.read() + self.raw.close() + self.raw = None + return self._cached + + @property + def text(self): + return str(self.content, self.encoding) + + def json(self): + import ujson + return ujson.loads(self.content) + + +def request(method, url, data=None, headers={}, stream=None): + try: + proto, dummy, host, path = url.split("/", 3) + except ValueError: + proto, dummy, host = url.split("/", 2) + path = "" + if proto != "http:": + raise ValueError("Unsupported protocol: " + proto) + + ai = usocket.getaddrinfo(host, 80) + addr = ai[0][4] + s = usocket.socket() + s.connect(addr) + s.send(b"%s /%s HTTP/1.0\r\n" % (method, path)) + if not "Host" in headers: + s.send(b"Host: %s\r\n" % host) + if data: + s.send(b"Content-Length: %d\r\n" % len(data)) + s.send(b"\r\n") + if data: + s.send(data) + + l = s.readline() + protover, status, msg = l.split(None, 2) + status = int(status) + #print(protover, status, msg) + while True: + l = s.readline() + if not l or l == b"\r\n": + break + #print(line) + if l.startswith(b"Transfer-Encoding:"): + if b"chunked" in line: + raise ValueError("Unsupported " + l) + elif l.startswith(b"Location:"): + raise NotImplementedError("Redirects not yet supported") + + resp = Response(s) + resp.status_code = status + resp.reason = msg.rstrip() + return resp + + +def head(url, **kw): + return request("HEAD", url, **kw) + +def get(url, **kw): + return request("GET", url, **kw) + +def post(url, **kw): + return request("POST", url, **kw) + +def put(url, **kw): + return request("PUT", url, **kw) + +def patch(url, **kw): + return request("PATCH", url, **kw) + +def delete(url, **kw): + return request("DELETE", url, **kw)