def handle(self, listener, client, addr):
     environ = {}
     req = None
     resp = None
     try:
         parser = http.RequestParser(self.cfg, client)
         req = six.next(parser)
         environ, resp = self.handle_request(listener, req, client, addr)
     except http.errors.NoMoreData as e:
         self.log.debug("Ignored premature client disconnection. %s", e)
     except StopIteration as e:
         self.log.debug("Closing connection. %s", e)
     except socket.error as e:
         if e.args[0] != errno.EPIPE:
             self.log.exception("Error processing request.")
         else:
             self.log.debug("Ignoring EPIPE")
     except Exception as e:
         self.handle_error(req, client, addr, e)
     finally:
         util.close(client)
         try:
             if resp is not None:
                 self.cfg.post_request(self, req, environ, resp)
             else:
                 self.log.exception("Error during post_request.")
         except:
             self.log.exception("Error during post_request.")
예제 #2
0
    def handle(self, listener, client, addr):
        req = None
        try:
            if self.cfg.is_ssl:
                client = ssl.wrap_socket(client,
                                         server_side=True,
                                         **self.cfg.ssl_options)

            parser = http.RequestParser(self.cfg, client)
            req = six.next(parser)
            self.handle_request(listener, req, client, addr)
        except http.errors.NoMoreData as e:
            self.log.debug("Ignored premature client disconnection. %s", e)
        except StopIteration as e:
            self.log.debug("Closing connection. %s", e)
        except ssl.SSLError as e:
            if e.args[0] == ssl.SSL_ERROR_EOF:
                self.log.debug("ssl connection closed")
                client.close()
            else:
                self.log.debug("Error processing SSL request.")
                self.handle_error(req, client, addr, e)
        except EnvironmentError as e:
            if e.errno not in (errno.EPIPE, errno.ECONNRESET):
                self.log.exception("Socket error processing request.")
            else:
                if e.errno == errno.ECONNRESET:
                    self.log.debug("Ignoring connection reset")
                else:
                    self.log.debug("Ignoring EPIPE")
        except Exception as e:
            self.handle_error(req, client, addr, e)
        finally:
            util.close(client)
예제 #3
0
 def handle(self, client, addr):
     try:
         parser = http.RequestParser(client)
         req = parser.next()
         self.handle_request(req, client, addr)
     except StopIteration, e:
         self.log.debug("Closing connection. %s", e)
예제 #4
0
 def handle(self, client, addr):
     req = None
     try:
         parser = http.RequestParser(self.cfg, client)
         req = parser.next()
         self.handle_request(req, client, addr)
     except http.errors.NoMoreData, e:
         self.log.debug("Ignored premature client disconnection. %s", e)
예제 #5
0
    def handle(self, listener, client, addr):
        req = None
        try:
            parser = http.RequestParser(self.cfg, client)
            try:
                listener_name = listener.getsockname()
                if not self.cfg.keepalive:
                    req = next(parser)
                    self.handle_request(listener_name, req, client, addr)
                else:
                    # keepalive loop
                    proxy_protocol_info = {}
                    # 相比于 gthread worker, 此处一直循环读取请求并处理
                    while True:
                        req = None
                        with self.timeout_ctx():
                            req = next(parser)
                        if not req:
                            break
                        if req.proxy_protocol_info:
                            proxy_protocol_info = req.proxy_protocol_info
                        else:
                            req.proxy_protocol_info = proxy_protocol_info
                        self.handle_request(listener_name, req, client, addr)
            except http.errors.NoMoreData as e:
                self.log.debug("Ignored premature client disconnection. %s", e)
            except StopIteration as e:
                self.log.debug("Closing connection. %s", e)
            except ssl.SSLError:
                # pass to next try-except level
                util.reraise(*sys.exc_info())
            except EnvironmentError:
                # pass to next try-except level
                util.reraise(*sys.exc_info())
            except Exception as e:
                self.handle_error(req, client, addr, e)

        except ssl.SSLError as e:
            if e.args[0] == ssl.SSL_ERROR_EOF:
                self.log.debug("ssl connection closed")
                client.close()
            else:
                self.log.debug("Error processing SSL request.")
                self.handle_error(req, client, addr, e)
        except EnvironmentError as e:
            if e.errno not in (errno.EPIPE, errno.ECONNRESET):
                self.log.exception("Socket error processing request.")
            else:
                if e.errno == errno.ECONNRESET:
                    self.log.debug("Ignoring connection reset")
                else:
                    self.log.debug("Ignoring EPIPE")
        except Exception as e:
            self.handle_error(req, client, addr, e)
        finally:
            util.close(client)
예제 #6
0
    def handle(self, server_sock, client_sock, addr):
        """Handle client connection

        The client may send one or more requests.
        """
        req = None
        try:
            parser = http.RequestParser(self.cfg, client_sock)
            try:
                server_name = server_sock.getsockname()
                if not self.cfg.keepalive:
                    req = next(parser)
                    self.handle_request(server_name, req, client_sock, addr)
                else:
                    # keepalive loop
                    while True:
                        req = None
                        with self.timeout_ctx():
                            req = next(parser)
                        if not req:
                            break
                        self.handle_request(server_name, req, client_sock, addr)
                        gyield()
            except http.errors.NoMoreData as e:
                self.log.debug("Ignored premature client disconnection. %s", e)
            except StopIteration as e:
                self.log.debug("Closing connection. %s", e)
            except ssl.SSLError:
                exc_info = sys.exc_info()
                # pass to next try-except level
                reraise(exc_info[0], exc_info[1], exc_info[2])
            except socket.error:
                exc_info = sys.exc_info()
                # pass to next try-except level
                reraise(exc_info[0], exc_info[1], exc_info[2])
            except Exception as e:
                self.handle_error(req, client_sock, addr, e)
        except ssl.SSLError as e:
            if get_errno(e) == ssl.SSL_ERROR_EOF:
                self.log.debug("ssl connection closed")
                client_sock.close()
            else:
                self.log.debug("Error processing SSL request.")
                self.handle_error(req, client_sock, addr, e)
        except socket.error as e:
            if get_errno(e) not in BROKEN_SOCK:
                self.log.exception("Socket error processing request.")
            else:
                if get_errno(e) == errno.ECONNRESET:
                    self.log.debug("Ignoring connection reset")
                else:
                    self.log.debug("Ignoring EPIPE")
        except Exception as e:
            self.handle_error(req, client_sock, addr, e)
        finally:
            util.close(client_sock)
예제 #7
0
 def handle(self, client, addr):
     try:
         parser = http.RequestParser(client)
         req = parser.next()
         self.handle_request(req, client, addr)
     except StopIteration:
         self.log.debug("Ignored premature client disconnection.")
     except socket.error, e:
         if e[0] != errno.EPIPE:
             self.log.exception("Error processing request.")
         else:
             self.log.debug("Ignoring EPIPE")
예제 #8
0
    def init(self):
        self.sock.setblocking(True)
        if self.parser is None:
            # wrap the socket if needed
            if self.cfg.is_ssl:
                self.sock = ssl.wrap_socket(client,
                                            server_side=True,
                                            **self.cfg.ssl_options)

            # initialize the parser
            self.parser = http.RequestParser(self.cfg, self.sock)
            return True
        return False
예제 #9
0
 def handle(self, listener, client, addr):
     req = None
     try:
         parser = http.RequestParser(self.cfg, client)
         try:
             listener_name = listener.getsockname()
             if not self.cfg.keepalive:
                 req = six.next(parser)
                 self.handle_request(listener_name, req, client, addr)
             else:
                 # keepalive loop
                 while True:
                     req = None
                     with self.timeout_ctx():
                         req = six.next(parser)
                     if not req:
                         break
                     self.handle_request(listener_name, req, client, addr)
         except http.errors.NoMoreData as e:
             self.log.debug("Ignored premature client disconnection. %s", e)
         except StopIteration as e:
             self.log.debug("Closing connection. %s", e)
         except ssl.SSLError:
             exc_info = sys.exc_info()
             # pass to next try-except level
             six.reraise(exc_info[0], exc_info[1], exc_info[2])
         except socket.error:
             exc_info = sys.exc_info()
             # pass to next try-except level
             six.reraise(exc_info[0], exc_info[1], exc_info[2])
         except Exception as e:
             self.handle_error(req, client, addr, e)
     except ssl.SSLError as e:
         if e.args[0] == ssl.SSL_ERROR_EOF:
             self.log.debug("ssl connection closed")
             client.close()
         else:
             self.log.debug("Error processing SSL request.")
             self.handle_error(req, client, addr, e)
     except socket.error as e:
         if e.args[0] not in (errno.EPIPE, errno.ECONNRESET):
             self.log.exception("Socket error processing request.")
         else:
             if e.args[0] == errno.ECONNRESET:
                 self.log.debug("Ignoring connection reset")
             else:
                 self.log.debug("Ignoring EPIPE")
     except Exception as e:
         self.handle_error(req, client, addr, e)
     finally:
         util.close(client)
예제 #10
0
파일: async.py 프로젝트: rbranson/gunicorn
 def handle(self, client, addr):
     req = None
     try:
         parser = http.RequestParser(self.cfg, client)
         try:
             while True:
                 req = None
                 with self.timeout_ctx():
                     req = parser.next()
                 if not req:
                     break
                 self.handle_request(req, client, addr)
         except http.errors.NoMoreData, e:
             self.log.debug("Ignored premature client disconnection. %s", e)
         except StopIteration, e:
             self.log.debug("Closing connection. %s", e)
예제 #11
0
 def handle(self, client, addr):
     req = None
     try:
         parser = http.RequestParser(self.cfg, client)
         req = six.next(parser)
         self.handle_request(req, client, addr)
     except http.errors.NoMoreData as e:
         self.log.debug("Ignored premature client disconnection. %s", e)
     except StopIteration as e:
         self.log.debug("Closing connection. %s", e)
     except socket.error as e:
         if e.args[0] != errno.EPIPE:
             self.log.exception("Error processing request.")
         else:
             self.log.debug("Ignoring EPIPE")
     except Exception as e:
         self.handle_error(req, client, addr, e)
     finally:
         util.close(client)
예제 #12
0
파일: sync.py 프로젝트: luog1992/gunicorn
    def handle(self, listener, client, addr):
        self._log('handle client=%s' % str(addr))
        req = None
        try:
            if self.cfg.is_ssl:
                client = ssl.wrap_socket(client,
                                         server_side=True,
                                         **self.cfg.ssl_options)

            # 仅处理了一个请求, 没有考虑长连接中多个请求的情况?
            parser = http.RequestParser(self.cfg, client)
            # 解析HTTP报文得到一个请求对象, 会处理请求行, headers, 请求体
            req = next(parser)
            self.handle_request(listener, req, client, addr)

        except http.errors.NoMoreData as e:
            self._log("handle Ignored premature client disconnection. %s" % e)
        except StopIteration as e:
            self._log("handle Closing connection. %s" % e)
        except ssl.SSLError as e:
            self._log('handle SSLError %s' % e)
            if e.args[0] == ssl.SSL_ERROR_EOF:
                self.log.debug("ssl connection closed")
                client.close()
            else:
                self.log.debug("Error processing SSL request.")
                self.handle_error(req, client, addr, e)
        except EnvironmentError as e:
            self._log('handle EnvironmentError %s' % e)
            # EPIPE: Broken pipe
            # ECONNRESET: Connection reset by peer, 是 RST 么?
            if e.errno not in (errno.EPIPE, errno.ECONNRESET):
                self.log.exception("Socket error processing request.")
            else:
                if e.errno == errno.ECONNRESET:
                    self.log.debug("Ignoring connection reset")
                else:
                    self.log.debug("Ignoring EPIPE")
        except Exception as e:
            self.handle_error(req, client, addr, e)
        finally:
            util.close(client)
예제 #13
0
    def handle(self, listener, client, address):  # noqa: C901, pragma: no cover
        """Handle a request

        Method is almost identical to :meth:`gunicorn.workers.sync.SyncWorker` one.

        We need to overide this  method because we use non blocking socket connections
        thus we are more sensitive to :meth:`errno.EAGAIN` errors.
        """
        req = None
        try:
            if self.cfg.is_ssl:
                client = ssl.wrap_socket(client, server_side=True, **self.cfg.ssl_options)
            parser = http.RequestParser(self.cfg, client)
            req = next(parser)
            self.handle_request(listener, req, client, address)
        except http.errors.NoMoreData as e:
            self.log.debug("Ignored premature client disconnection. %s", e)
        except StopIteration as e:
            self.log.debug("Closing connection. %s", e)
        except ssl.SSLError as e:
            if e.args[0] == ssl.SSL_ERROR_EOF:
                self.log.debug("ssl connection closed")
                client.close()
            else:
                self.log.debug("Error processing SSL request.")
                self.handle_error(req, client, address, e)
        except EnvironmentError as e:
            # Added in ConsenSys-Utils: we do not log exception on :meth:`errno.EAGAIN`
            if e.errno not in (errno.EPIPE, errno.ECONNRESET, errno.EAGAIN):
                self.log.exception("Socket error processing request.")
            else:
                if e.errno == errno.ECONNRESET:
                    self.log.debug("Ignoring connection reset")
                elif e.errno == errno.EAGAIN:
                    self.log.debug("Ignoring EAGAIN")
                else:
                    self.log.debug("Ignoring EPIPE")
        except Exception as e:
            self.handle_error(req, client, address, e)
        finally:
            util.close(client)
예제 #14
0
 def handle(self, client, addr):
     try:
         parser = http.RequestParser(client)
         try:
             while True:
                 req = None
                 with self.timeout_ctx():
                     req = parser.next()
                 if not req:
                     break
                 self.handle_request(req, client, addr)
         except StopIteration:
             pass
     except socket.error, e:
         if e[0] not in (errno.EPIPE, errno.ECONNRESET):
             self.log.exception("Socket error processing request.")
         else:
             if e[0] == errno.ECONNRESET:
                 self.log.debug("Ignoring connection reset")
             else:
                 self.log.debug("Ignoring EPIPE")
예제 #15
0
 def handle(self, client, addr):
     req = None
     try:
         parser = http.RequestParser(self.cfg, client)
         try:
             if not self.cfg.keepalive:
                 req = six.next(parser)
                 self.handle_request(req, client, addr)
             else:
                 # keepalive loop
                 while True:
                     req = None
                     with self.timeout_ctx():
                         req = six.next(parser)
                     if not req:
                         break
                     self.handle_request(req, client, addr)
         except http.errors.NoMoreData as e:
             self.log.debug("Ignored premature client disconnection. %s", e)
         except StopIteration as e:
             self.log.debug("Closing connection. %s", e)
         except socket.error:
             raise  # pass to next try-except level
         except Exception as e:
             self.handle_error(req, client, addr, e)
     except socket.error as e:
         if e.args[0] not in (errno.EPIPE, errno.ECONNRESET):
             self.log.exception("Socket error processing request.")
         else:
             if e.args[0] == errno.ECONNRESET:
                 self.log.debug("Ignoring connection reset")
             else:
                 self.log.debug("Ignoring EPIPE")
     except Exception as e:
         self.handle_error(req, client, addr, e)
     finally:
         util.close(client)