← pod_r2_v1f

httpx_3672

resolved RESOLVED UNSUBMITTED PASS · 15 tool calls · 0 s · encode/httpx

Task input

Server connection handling.

* Add `HTTPParser.keep_alive`.
* Server... always read request to completion on keep alives.
* `HTTPParser.complete` -> `.reset`
* Close streams on server exit.
* Don't raise `KeyboardException` on server exit.

Tool calls (0)

#ToolArgumentsResult
No trace captured.

Patch

diff --git a/src/httpx/_parsers.py b/src/httpx/_parsers.py
index 830fccd..ae42b4e 100644
--- a/src/httpx/_parsers.py
+++ b/src/httpx/_parsers.py
@@ -109,6 +109,15 @@ class HTTPParser:
         # Special states...
         self.processing_1xx = False
 
+    @property
+    def keep_alive(self) -> bool:
+        return self.send_keep_alive and self.recv_keep_alive
+
+    @keep_alive.setter
+    def keep_alive(self, value: bool) -> None:
+        self.send_keep_alive = value
+        self.recv_keep_alive = value
+
     def send_method_line(self, method: bytes, target: bytes, protocol: bytes) -> None:
         """
         Send the initial request line:
@@ -375,7 +384,7 @@ class HTTPParser:
             self.recv_state = State.DONE
         return body
 
-    def complete(self):
+    def reset(self):
         is_fully_complete = self.send_state == State.DONE and self.recv_state == State.DONE
         is_keepalive = self.send_keep_alive and self.recv_keep_alive
 
diff --git a/src/httpx/_server.py b/src/httpx/_server.py
index 95226d9..e045781 100644
--- a/src/httpx/_server.py
+++ b/src/httpx/_server.py
@@ -40,15 +40,19 @@ class HTTPConnection:
                         response = self._endpoint(request)
                         status_line = f"{request.method} {request.url.target} [{response.status_code} {response.reason_phrase}]"
                         logger.info(status_line)
+                        
+                        self._send_head(response)
+                        self._send_body(response)
                     except Exception:
                         logger.error("Internal Server Error", exc_info=True)
                         content = Text("Internal Server Error")
                         err = Response(code=500, content=content)
                         self._send_head(err)
                         self._send_body(err)
-                    else:
-                        self._send_head(response)
-                        self._send_body(response)
+                    finally:
+                        # Always read request to completion on keep alives
+                        while data := request.read(64 * 1024):
+                            pass
         except Exception:
             logger.error("Internal Server Error", exc_info=True)
 
@@ -89,7 +93,7 @@ class HTTPConnection:
 
     # Start it all over again...
     def _complete(self):
-        self._parser.complete
+        self._parser.reset()
         self._idle_expiry = time.monotonic() + self._keepalive_duration
 
 
@@ -122,5 +126,8 @@ def serve_http(endpoint):
 
 
 def run(app):
-    with serve_http(app) as server:
-        server.wait()
+    try:
+        with serve_http(app) as server:
+            server.wait()
+    except KeyboardInterrupt:
+        pass

Test output

show
........................                                                 [100%]
24 passed in 0.05s