[ create a new paste ] login | about

Link: http://codepad.org/AEPZmJJP    [ raw code | fork ]

Python, pasted on Mar 30:
diff --git a/circuits/web/http.py b/circuits/web/http.py
--- a/circuits/web/http.py
+++ b/circuits/web/http.py
@@ -10,7 +10,9 @@
 
 
 from io import BytesIO
+from sys import exc_info
 from posixpath import realpath
+from traceback import format_tb
 
 try:
     from urllib.parse import unquote
@@ -20,9 +22,9 @@
     from urlparse import urlparse, urlunparse  # NOQA
 
 
+from circuits.six import text_type
 from circuits.net.sockets import Close, Write
 from circuits.core import handler, BaseComponent, Value
-from circuits.six import b
 
 from . import wrappers
 from .utils import is_ssl_handshake
@@ -147,8 +149,17 @@
         headers = response.headers
         sock = request.sock
 
-        self.fire(Write(sock, bytes(response)))
-        self.fire(Write(sock, bytes(headers)))
+        try:
+            bresponse = bytes(response)
+            bheaders = bytes(headers)
+        except:
+            etype, evalue, etraceback = exc_info()
+            traceback = format_tb(etraceback)
+            error = (etype, evalue, traceback)
+            return self.fire(HTTPError(request, response, 500, error=error))
+
+        self.fire(Write(sock, bresponse))
+        self.fire(Write(sock, bheaders))
 
         # process body
         if response.stream and response.body:
@@ -160,7 +171,7 @@
         else:
             if isinstance(response.body, bytes):
                 body = response.body
-            elif isinstance(response.body, unicode):
+            elif isinstance(response.body, text_type):
                 body = response.body.encode(self._encoding)
             else:
                 parts = (
@@ -172,19 +183,25 @@
 
             if body:
                 if response.chunked:
-                    buf = [hex(len(body))[2:].encode(), b"\r\n", body, b"\r\n"]
+                    buf = [
+                        hex(len(body))[2:].encode(self._encoding),
+                        b"\r\n",
+                        body,
+                        b"\r\n"
+                    ]
                     body = b"".join(buf)
-                self.fire(Write(response.request.sock, body))
+
+                self.fire(Write(sock, body))
 
                 if response.chunked:
-                    self.fire(Write(response.request.sock, b"0\r\n\r\n"))
+                    self.fire(Write(sock, b"0\r\n\r\n"))
 
             if not response.stream:
                 if response.close:
-                    self.fire(Close(response.request.sock))
+                    self.fire(Close(sock))
                 # Delete the request/response objects if present
-                if response.request.sock in self._clients:
-                    del self._clients[response.request.sock]
+                if sock in self._clients:
+                    del self._clients[sock]
                 response.done = True
 
     @handler("disconnect")
@@ -261,7 +278,7 @@
             sp = self.protocol
 
             if rp[0] != sp[0]:
-                # the mayor HTTP version differs
+                # the major HTTP version differs
                 return self.fire(HTTPError(request, response, 505))
 
             request.headers = parser.get_headers()


Create a new paste based on this one


Comments: