Procházet zdrojové kódy

Fix exception responding to request that has been closed (#10932)

Introduced in #10905
Erik Johnston před 2 roky
rodič
revize
37bb93d181
2 změnil soubory, kde provedl 12 přidání a 3 odebrání
  1. 1 0
      changelog.d/10932.feature
  2. 11 3
      synapse/http/server.py

+ 1 - 0
changelog.d/10932.feature

@@ -0,0 +1 @@
+Speed up responding with large JSON objects to requests.

+ 11 - 3
synapse/http/server.py

@@ -561,9 +561,17 @@ class _ByteProducer:
         self._iterator = iterator
         self._paused = False
 
-        # Register the producer and start producing data.
-        self._request.registerProducer(self, True)
-        self.resumeProducing()
+        try:
+            self._request.registerProducer(self, True)
+        except RuntimeError as e:
+            logger.info("Connection disconnected before response was written: %r", e)
+
+            # We drop our references to data we'll not use.
+            self._request = None
+            self._iterator = iter(())
+        else:
+            # Start producing if `registerProducer` was successful
+            self.resumeProducing()
 
     def _send_data(self, data: List[bytes]) -> None:
         """