]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Close redirect responses (#88)
authorTom Christie <tom@tomchristie.com>
Thu, 13 Jun 2019 13:38:56 +0000 (14:38 +0100)
committerGitHub <noreply@github.com>
Thu, 13 Jun 2019 13:38:56 +0000 (14:38 +0100)
http3/client.py

index b07d55d4dcd48e9b9acb2aff139386c30861ff12..fba9fc799255f3b079e3e1d488f1f86ab9f06caf 100644 (file)
@@ -144,32 +144,37 @@ class BaseClient:
             response = await self.dispatch.send(
                 request, verify=verify, cert=cert, timeout=timeout
             )
-            assert isinstance(response, AsyncResponse)
-            response.history = list(history)
-            self.cookies.extract_cookies(response)
-            history = [response] + history
-            if not response.is_redirect:
-                break
-
-            if allow_redirects:
-                request = self.build_redirect_request(request, response)
-            else:
+            should_close_response = True
+            try:
+                assert isinstance(response, AsyncResponse)
+                response.history = list(history)
+                self.cookies.extract_cookies(response)
+                history = [response] + history
 
-                async def send_next() -> AsyncResponse:
-                    nonlocal request, response, verify, cert, allow_redirects, timeout, history
+                if allow_redirects and response.is_redirect:
                     request = self.build_redirect_request(request, response)
-                    response = await self.send_handling_redirects(
-                        request,
-                        allow_redirects=allow_redirects,
-                        verify=verify,
-                        cert=cert,
-                        timeout=timeout,
-                        history=history,
-                    )
-                    return response
-
-                response.next = send_next  # type: ignore
-                break
+                else:
+                    should_close_response = False
+                    break
+            finally:
+                if should_close_response:
+                    await response.close()
+
+        if response.is_redirect:
+            async def send_next() -> AsyncResponse:
+                nonlocal request, response, verify, cert, allow_redirects, timeout, history
+                request = self.build_redirect_request(request, response)
+                response = await self.send_handling_redirects(
+                    request,
+                    allow_redirects=allow_redirects,
+                    verify=verify,
+                    cert=cert,
+                    timeout=timeout,
+                    history=history,
+                )
+                return response
+
+            response.next = send_next  # type: ignore
 
         return response