@@ -35,7 +35,7 @@ def tail_handler(ctx):
3535 ctx .send_response_and_end (500 )
3636 return
3737
38- offset = int (ctx .request .get ("offset" , 0 ))
38+ offset = int (ctx .query .get ("offset" , 0 ))
3939 reader = LogReader (ctx .log_path )
4040 reader .set_offset (offset )
4141 content = encode (reader .tail ())
@@ -58,7 +58,7 @@ def favicon_handler(ctx):
5858 shutil .copyfileobj (f , ctx .wfile )
5959
6060
61- class ServerHandler (BaseHTTPRequestHandler ):
61+ class HTTPRequestHandler (BaseHTTPRequestHandler , object ):
6262 protocol_version = "HTTP/1.1"
6363 log_path = log_location (False )
6464
@@ -68,23 +68,29 @@ class ServerHandler(BaseHTTPRequestHandler):
6868 "/favicon.ico" : favicon_handler ,
6969 }
7070
71- # noinspection PyPep8Naming
71+ # noinspection PyPep8Naming, PyAttributeOutsideInit
7272 def do_GET (self ):
73+ self ._response_started = False
7374 try :
74- # noinspection PyAttributeOutsideInit
7575 self .url = urlparse .urlsplit (self .path )
76- self .request = dict (urlparse .parse_qsl (self .url .query ))
77- if self .url .path in self .get_routes :
78- self .get_routes [self .url .path ](self )
76+ self .query = dict (urlparse .parse_qsl (self .url .query ))
77+
78+ handler = self .get_routes .get (self .url .path )
79+ if handler is None :
80+ self .send_response_and_end (404 )
7981 else :
80- self .send_response (404 )
81- self .end_headers ()
82- except BrokenPipeError as e :
83- raise e
82+ handler (self )
8483 except Exception as e :
85- logging .error (e )
86- self .send_response (500 )
87- self .end_headers ()
84+ if self ._response_started :
85+ raise e
86+ else :
87+ logging .error (e , exc_info = True )
88+ self .send_response_and_end (500 )
89+
90+ def send_response (self , * args , ** kwargs ):
91+ # noinspection PyAttributeOutsideInit
92+ self ._response_started = True
93+ super (HTTPRequestHandler , self ).send_response (* args , ** kwargs )
8894
8995 def send_response_and_end (self , code , message = None ):
9096 self .send_response (code , message = message )
0 commit comments