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()