diff --git a/urequests/urequests.py b/urequests/urequests.py index cdd5b5ff..29c2f24d 100644 --- a/urequests/urequests.py +++ b/urequests/urequests.py @@ -50,43 +50,48 @@ def request(method, url, data=None, json=None, headers={}, stream=None): ai = usocket.getaddrinfo(host, port) addr = ai[0][-1] - s = usocket.socket() - s.connect(addr) - if proto == "https:": - s = ussl.wrap_socket(s, server_hostname=host) - s.write(b"%s /%s HTTP/1.0\r\n" % (method, path)) - if not "Host" in headers: - s.write(b"Host: %s\r\n" % host) - # Iterate over keys to avoid tuple alloc - for k in headers: - s.write(k) - s.write(b": ") - s.write(headers[k]) - s.write(b"\r\n") - if json is not None: - assert data is None - import ujson - data = ujson.dumps(json) - if data: - s.write(b"Content-Length: %d\r\n" % len(data)) - s.write(b"\r\n") - if data: - s.write(data) - l = s.readline() - protover, status, msg = l.split(None, 2) - status = int(status) - #print(protover, status, msg) - while True: + s = usocket.socket() + try: + s.connect(addr) + if proto == "https:": + s = ussl.wrap_socket(s, server_hostname=host) + s.write(b"%s /%s HTTP/1.0\r\n" % (method, path)) + if not "Host" in headers: + s.write(b"Host: %s\r\n" % host) + # Iterate over keys to avoid tuple alloc + for k in headers: + s.write(k) + s.write(b": ") + s.write(headers[k]) + s.write(b"\r\n") + if json is not None: + assert data is None + import ujson + data = ujson.dumps(json) + if data: + s.write(b"Content-Length: %d\r\n" % len(data)) + s.write(b"\r\n") + if data: + s.write(data) + l = s.readline() - if not l or l == b"\r\n": - break - #print(l) - if l.startswith(b"Transfer-Encoding:"): - if b"chunked" in l: - raise ValueError("Unsupported " + l) - elif l.startswith(b"Location:") and not 200 <= status <= 299: - raise NotImplementedError("Redirects not yet supported") + 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(l) + if l.startswith(b"Transfer-Encoding:"): + if b"chunked" in l: + raise ValueError("Unsupported " + l) + elif l.startswith(b"Location:") and not 200 <= status <= 299: + raise NotImplementedError("Redirects not yet supported") + except OSError: + s.close() + raise resp = Response(s) resp.status_code = status