Пример #1
0
 def write_error(self, exception):
     try:
         response = self.error_handler.response(self.request, exception)
         version = self.request.version if self.request else '1.1'
         self.transport.write(response.output(version))
     except RuntimeError:
         log.error('Connection lost before error written @ {}'.format(
             self.request.ip if self.request else 'Unknown'))
     except Exception as e:
         self.bail_out("Writing error failed, connection closed {}".format(
             repr(e)),
                       from_error=True)
     finally:
         if self.has_log:
             extra = {
                 'status': response.status,
                 'host': '',
                 'request': str(self.request) + str(self.url)
             }
             if response and isinstance(response, HTTPResponse):
                 extra['byte'] = len(response.body)
             else:
                 extra['byte'] = -1
             if self.request:
                 extra['host'] = '%s:%d' % self.request.ip,
                 extra['request'] = '%s %s' % (self.request.method,
                                               self.url)
             netlog.info('', extra=extra)
         self.transport.close()
Пример #2
0
 def write_error(self, exception):
     response = None
     try:
         response = self.error_handler.response(self.request, exception)
         version = self.request.version if self.request else '1.1'
         self.transport.write(response.output(version))
     except RuntimeError:
         log.error(
             'Connection lost before error written @ {}'.format(
                 self.request.ip if self.request else 'Unknown'))
     except Exception as e:
         self.bail_out(
             "Writing error failed, connection closed {}".format(repr(e)),
             from_error=True)
     finally:
         if self.has_log:
             extra = dict()
             if isinstance(response, HTTPResponse):
                 extra['status'] = response.status
                 extra['byte'] = len(response.body)
             else:
                 extra['status'] = 0
                 extra['byte'] = -1
             if self.request:
                 extra['host'] = '%s:%d' % self.request.ip,
                 extra['request'] = '%s %s' % (self.request.method,
                                               self.url)
             else:
                 extra['host'] = 'UNKNOWN'
                 extra['request'] = 'nil'
             if self.parser and not (self.keep_alive
                                     and extra['status'] == 408):
                 netlog.info('', extra=extra)
         self.transport.close()
Пример #3
0
 def write_error(self, exception):
     try:
         response = self.error_handler.response(self.request, exception)
         version = self.request.version if self.request else '1.1'
         self.transport.write(response.output(version))
     except RuntimeError:
         log.error(
             'Connection lost before error written @ {}'.format(
                 self.request.ip if self.request else 'Unknown'))
     except Exception as e:
         self.bail_out(
             "Writing error failed, connection closed {}".format(repr(e)),
             from_error=True)
     finally:
         if self.has_log:
             extra = {
                 'status': response.status,
                 'host': '',
                 'request': str(self.request) + str(self.url)
             }
             if response and isinstance(response, HTTPResponse):
                 extra['byte'] = len(response.body)
             else:
                 extra['byte'] = -1
             if self.request:
                 extra['host'] = '%s:%d' % self.request.ip,
                 extra['request'] = '%s %s' % (self.request.method,
                                               self.url)
             netlog.info('', extra=extra)
         self.transport.close()
 async def stream_response(self, response):
     """
     Streams a response to the client asynchronously. Attaches
     the transport to the response so the response consumer can
     write to the response as needed.
     """
     if self._response_timeout_handler:
         self._response_timeout_handler.cancel()
         self._response_timeout_handler = None
     try:
         keep_alive = self.keep_alive
         response.transport = self.transport
         await response.stream(self.request.version, keep_alive,
                               self.keep_alive_timeout)
         if self.has_log:
             netlog.info('',
                         extra={
                             'status':
                             response.status,
                             'byte':
                             -1,
                             'host':
                             '{0}:{1}'.format(self.request.ip[0],
                                              self.request.ip[1]),
                             'request':
                             '{0} {1}'.format(self.request.method,
                                              self.request.url)
                         })
     except AttributeError:
         log.error(('Invalid response object for url {}, '
                    'Expected Type: HTTPResponse, Actual Type: {}').format(
                        self.url, type(response)))
         self.write_error(ServerError('Invalid response type'))
     except RuntimeError:
         log.error('Connection lost before response written @ {}'.format(
             self.request.ip))
     except Exception as e:
         self.bail_out(
             "Writing response failed, connection closed {}".format(
                 repr(e)))
     finally:
         if not keep_alive:
             self.transport.close()
         else:
             self._keep_alive_timeout_handler = self.loop.call_later(
                 self.keep_alive_timeout, self.keep_alive_timeout_callback)
             self._last_response_time = current_time
             self.cleanup()
Пример #5
0
 def write_response(self, response):
     """
     Writes response content synchronously to the transport.
     """
     try:
         keep_alive = self.keep_alive
         self.transport.write(
             response.output(self.request.version, keep_alive,
                             self.request_timeout))
         if self.has_log:
             netlog.info('',
                         extra={
                             'status':
                             response.status,
                             'byte':
                             len(response.body),
                             'host':
                             '{0}:{1}'.format(self.request.ip[0],
                                              self.request.ip[1]),
                             'request':
                             '{0} {1}'.format(self.request.method,
                                              self.request.url)
                         })
     except AttributeError:
         log.error(('Invalid response object for url {}, '
                    'Expected Type: HTTPResponse, Actual Type: {}').format(
                        self.url, type(response)))
         self.write_error(ServerError('Invalid response type'))
     except RuntimeError:
         log.error('Connection lost before response written @ {}'.format(
             self.request.ip))
     except Exception as e:
         self.bail_out(
             "Writing response failed, connection closed {}".format(
                 repr(e)))
     finally:
         if not keep_alive:
             self.transport.close()
         else:
             self._last_request_time = current_time
             self.cleanup()
Пример #6
0
    async def stream_response(self, response):
        """
        Streams a response to the client asynchronously. Attaches
        the transport to the response so the response consumer can
        write to the response as needed.
        """

        try:
            keep_alive = self.keep_alive
            response.transport = self.transport
            await response.stream(
                self.request.version, keep_alive, self.request_timeout)
            if self.has_log:
                netlog.info('', extra={
                    'status': response.status,
                    'byte': -1,
                    'host': '{0}:{1}'.format(self.request.ip[0],
                                             self.request.ip[1]),
                    'request': '{0} {1}'.format(self.request.method,
                                                self.request.url)
                })
        except AttributeError:
            log.error(
                ('Invalid response object for url {}, '
                 'Expected Type: HTTPResponse, Actual Type: {}').format(
                    self.url, type(response)))
            self.write_error(ServerError('Invalid response type'))
        except RuntimeError:
            log.error(
                'Connection lost before response written @ {}'.format(
                    self.request.ip))
        except Exception as e:
            self.bail_out(
                "Writing response failed, connection closed {}".format(
                    repr(e)))
        finally:
            if not keep_alive:
                self.transport.close()
            else:
                self._last_request_time = current_time
                self.cleanup()