Example #1
0
def monkeypatch_wsgiref_on_windows():
    """
    On windows Django live test cases have the bad habbit of spewing Error 10045 into the console.
    This monkeypatch makes wsgiref's server (used in live test cases) handle 10045 properly.
    """
    if platform.system() != "Windows":
        return

    import socket
    from wsgiref.simple_server import ServerHandler, WSGIRequestHandler

    def monkeypatch_handle(self):
        """Handle a single HTTP request"""

        try:
            self.raw_requestline = self.rfile.readline()
        except socket.error, err:
            if err.errno == 10054:
                return
            else:
                raise

        if not self.parse_request():  # An error code has been sent, just exit
            return

        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(),
                                self.get_environ())
        handler.request_handler = self  # backpointer for logging
        handler.run(self.server.get_app())
def monkeypatch_wsgiref_on_windows():
    """
    On windows Django live test cases have the bad habbit of spewing Error 10045 into the console.
    This monkeypatch makes wsgiref's server (used in live test cases) handle 10045 properly.
    """
    if platform.system() != "Windows":
        return

    import socket
    from wsgiref.simple_server import ServerHandler, WSGIRequestHandler

    def monkeypatch_handle(self):
        """Handle a single HTTP request"""

        try:
            self.raw_requestline = self.rfile.readline()
        except socket.error, err:
            if err.errno == 10054:
                return
            else:
                raise

        if not self.parse_request():  # An error code has been sent, just exit
            return

        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(), self.get_environ())
        handler.request_handler = self  # backpointer for logging
        handler.run(self.server.get_app())
Example #3
0
    def handle(self):
        """Handle a single HTTP request"""

        self.raw_requestline = self.rfile.readline(65537)
        if len(self.raw_requestline) > 65536:
            self.requestline = ''
            self.request_version = ''
            self.command = ''
            self.send_error(414)
            return

        if not self.parse_request():  # An error code has been sent, just exit
            return

        handler = ServerHandler(
            self.rfile,
            self.wfile,
            self.get_stderr(),
            self.get_environ(),
            multithread=False,
            multiprocess=False,
        )

        handler.request_handler = self  # backpointer for logging
        handler.run(self.server.get_app())
Example #4
0
 def run(self, application):
     """ServerHandler.run, then log the request when broken pipe"""
     try:
         ServerHandler.run(self, application)
     finally:
         if self.status:  # when broken pipe
             self.request_handler.log_request(
                 self.status.split(' ', 1)[0], self.bytes_sent)
Example #5
0
 def finish_response(self):
     try:
         ServerHandler.finish_response(self)
     except IOError as ex:
         if ex.errno == 32:
             print('client disconnected.')
         else:
             raise ex
Example #6
0
    def handle_error(self):
        """Catch errors that occur when serializing the return value to HTTP response and report fault"""

        # There is a bug in some versions of wsgi where code here fails because status is None or environ is None
        self.environ = self.environ or {'SERVER_PROTOCOL': 'HTTP/1.0'}
        self.status = self.status or "500 Internal server error"
        exc_type, exc_value, exc_traceback = sys.exc_info()
        trace = traceback.format_list(traceback.extract_tb(exc_traceback))
        self.fault = FaultData("Unable to convert result into http response",
                               exc_value, trace)
        ServerHandler.handle_error(self)
Example #7
0
    def finish_response(self):
        # If the browser closes the connection while we still want to sen stuff back,
        # we want to fail silently and give up. This often happens in tests where the
        # browser may want to request embedded links (like stylesheets) too, yet the
        # test has already clicked on the next link.
        ssl_eof_error = ssl.SSLEOFError
        broken_pipe_error = BrokenPipeError

        try:
            ServerHandler.finish_response(self)
        except (ssl_eof_error, broken_pipe_error):
            # Silently ignore it if it looks like the client browser closed the connection.
            pass
Example #8
0
    def handle(self):
        self.raw_requestline = self.rfile.readline()
        if not self.parse_request(): # An error code has been sent, just exit
            return

        if SimpleXMLRPCRequestHandler.is_rpc_path_valid(self):
            # @CTB hack hack hack, I should be ashamed of myself.
            global client_ip
            client_ip = self.client_address[0]
            return SimpleXMLRPCRequestHandler.do_POST(self)

        handler = ServerHandler(
            self.rfile, self.wfile, self.get_stderr(), self.get_environ(),
            multithread=False, multiprocess=False
        )
        handler.request_handler = self      # backpointer for logging
        handler.run(self.server.get_app())
Example #9
0
    def _handle(self):
        """
        Handle:
          /xmlrpc => SimpleXMLRPCServer
          /upload => self._handle_upload
          all else => WSGI app for Web UI
        """
        self.raw_requestline = self.rfile.readline()
        if not self.parse_request(): # An error code has been sent, just exit
            return

        print "SERVER HANDLE: path is '%s'" % self.path
        
        content_length = self.headers.getheader('content-length')
        if not content_length:
            content_length = 0
        content_length = int(content_length)

        print 'content length is:', content_length

        if content_length > self.MAX_CONTENT_LENGTH:
            message = "403 FORBIDDEN: You're trying to upload %d bytes; we only allow %d per request." % (content_length, self.MAX_CONTENT_LENGTH)
            self._send_html_response(403, message)
            return

        if SimpleXMLRPCRequestHandler.is_rpc_path_valid(self):
            # @CTB hack hack hack, I should be ashamed of myself.
            global client_ip
            client_ip = self.client_address[0]
            return SimpleXMLRPCRequestHandler.do_POST(self)
        
        elif self.path.startswith('/upload?'):
            return self._handle_upload()

        elif self.path.startswith('/notify'):
            return self._handle_notify()

        ## else:

        handler = ServerHandler(
            self.rfile, self.wfile, self.get_stderr(), self.get_environ(),
            multithread=False, multiprocess=False
        )
        handler.request_handler = self      # backpointer for logging
        handler.run(self.server.get_app())
Example #10
0
    def handle(self):
        """
        Handle:
          /xmlrpc => SimpleXMLRPCServer
          /upload => self._handle_upload
          /notify => self._handle_notify
          all else => WSGI app for Web UI
        """
        self.raw_requestline = self.rfile.readline()
        if not self.parse_request(): # An error code has been sent, just exit
            return

        content_length = self.headers.getheader('content-length')
        if not content_length:
            content_length = 0
        content_length = int(content_length)

        print 'content length is:', content_length

        if content_length > self.MAX_CONTENT_LENGTH:
            message = too_big_message % (content_length,
                                         self.MAX_CONTENT_LENGTH)
            self._send_html_response(403, message)
            return

        if SimpleXMLRPCRequestHandler.is_rpc_path_valid(self):
            return SimpleXMLRPCRequestHandler.do_POST(self)
        
        elif self.path.startswith('/upload?'):
            return self._handle_upload()

        elif self.path.startswith('/notify'):
            return self._handle_notify()

        ## else:

        handler = ServerHandler(
            self.rfile, self.wfile, self.get_stderr(), self.get_environ(),
            multithread=False, multiprocess=False
        )
        handler.request_handler = self      # backpointer for logging
        handler.run(self.server.get_app())
Example #11
0
    def handle_single(self):
        """Handle a single HTTP request"""
        self.raw_requestline = self.rfile.readline(65537)
        if len(self.raw_requestline) > 65536:
            self.requestline = ''
            self.request_version = ''
            self.command = ''
            self.close_connection = 1
            self.send_error(414)
            return

        if not self.parse_request():  # An error code has been sent, just exit
            return

        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(),
                                self.get_environ())
        handler.http_version = "1.1"
        handler.request_handler = self  # backpointer for logging

        # eNodeB will sometimes close connection to enodebd.
        # The cause of this is unknown, but we can safely ignore the
        # closed connection, and continue as normal otherwise.
        #
        # While this throws a BrokenPipe exception in wsgi server,
        # it also causes an AttributeError to be raised because of a
        # bug in the wsgi server.
        # https://bugs.python.org/issue27682
        try:
            handler.run(self.server.get_app())
        except BrokenPipeError:
            self.log_error(
                "eNodeB has unexpectedly closed the TCP connection.")
Example #12
0
    def handle(self):
        """
        Handle:
          /xmlrpc => SimpleXMLRPCServer
          /upload => self._handle_upload
          all else => WSGI app for Web UI
        """
        self.raw_requestline = self.rfile.readline()
        if not self.parse_request(): # An error code has been sent, just exit
            return

        content_length = self.headers.getheader('content-length')
        if not content_length:
            content_length = 0
        content_length = int(content_length)

        print 'content length is:', content_length

        if content_length > self.MAX_CONTENT_LENGTH:
            message = too_big_message % (content_length,
                                         self.MAX_CONTENT_LENGTH)
            self._send_html_response(403, message)
            return

        if SimpleXMLRPCRequestHandler.is_rpc_path_valid(self):
            return SimpleXMLRPCRequestHandler.do_POST(self)
        
        elif self.path.startswith('/upload?'):
            return self._handle_upload()

        ## else:

        handler = ServerHandler(
            self.rfile, self.wfile, self.get_stderr(), self.get_environ(),
            multithread=False, multiprocess=False
        )
        handler.request_handler = self      # backpointer for logging
        handler.run(self.server.get_app())
Example #13
0
 def handle_write(self):
     self._can_write = False
     handler = ServerHandler(self._input_stream, self.wfile,
                             self.get_stderr(), self.get_environ())
     handler.server_software = self.server_version
     handler.http_version = self.protocol_version[5:]
     handler.request_handler = self  # backpointer for logging
     handler.wsgi_multiprocess = False
     handler.wsgi_multithread = False
     try:
         handler.run(self.server.get_app())
     except Exception:
         self.handle_error()
         return
     if self.close_connection:
         self.handle_close()
     else:
         try:
             self.wfile.flush()
         except socket.error:
             self.handle_error()
         else:
             self._can_read = True
Example #14
0
 def __init__(self, *args, **kwargs):
     ServerHandler.__init__(self, *args, **kwargs)
     self.iterator = None
Example #15
0
 def close(self):
     # There is a bug in some versions of wsgi where code here fails because status is None or environ is None
     self.environ = self.environ or {'SERVER_PROTOCOL': 'HTTP/1.0'}
     self.status = self.status or "500 Internal server error"
     ServerHandler.close(self)
Example #16
0
 def log_exception(self, exc_info):
     import errno
     if exc_info[1].args[0] == errno.EPIPE:
         return # don't log broken pipes
     ServerHandler.log_exception(self, exc_info) # log other
 def log_exception(self, exc_info):
     if not should_ignore(exc_info):
         ServerHandler.log_exception(self, exc_info)
Example #18
0
 def log_exception(self, exc_info):
     if not should_ignore(exc_info):
         ServerHandler.log_exception(self, exc_info)
Example #19
0
 def setup_environ(self):
     ServerHandler.setup_environ(self)