Esempio n. 1
0
 def __call__(self, request):
     """
     Handle the given request.
     """
     # Make sure this plays nice with Web.
     request.auto_finish = False
     
     response = []
     status = '200 OK'
     headers = {}
     
     def start_response(status, head):
         status = status
         headers.update(head)
         return response.append
     
     # Build an environment for the WSGI application.
     environ = {
         'REQUEST_METHOD'    : request.method,
         'SCRIPT_NAME'       : '',
         'PATH_INFO'         : request.path,
         'QUERY_STRING'      : request.query,
         'SERVER_NAME'       : request.headers.get('Host','127.0.0.1'),
         'SERVER_PORT'       : request.connection.server.local_addr[1],
         'SERVER_PROTOCOL'   : request.version,
         'wsgi.version'      : (1,0),
         'wsgi.url_scheme'   : request.protocol,
         'wsgi.input'        : cStringIO.StringIO(request.body),
         'wsgi.errors'       : sys.stderr,
         'wsgi.multithread'  : False,
         'wsgi.multiprocess' : False,
         'wsgi.run_once'     : False
     }
     
     if 'Content-Type' in request.headers:
         environ['CONTENT_TYPE'] = request.headers['Content-Type']
     if 'Content-Length' in request.headers:
         environ['CONTENT_LENGTH'] = request.headers['Content-Length']
     
     for k,v in request.headers.iteritems():
         environ['HTTP_%s' % k.replace('-','_').upper()] = v
     
     # Run the WSGI Application.
     try:
         result = self.app(environ, start_response)
     except Exception, e:
         log.exception('Exception running WSGI application for: %s %s',
             request.method, request.path)
         
         if not self.debug:
             body, status, headers = error(500, request=request, debug=False)
         else:
             resp = u''.join([
                 u"<h2>Traceback</h2>\n",
                 u"<pre>%s</pre>\n" % traceback.format_exc(),
                 u"<h2>HTTP Request</h2>\n",
                 request.__html__(),
                 ])
             body, status, headers = error(resp, 500, request=request,
                 debug=True)
         
         status = '500 Internal Server Error'
         response = [body]
         result = []
Esempio n. 2
0
File: wsgi.py Progetto: ixokai/pants
    def __call__(self, request):
        """
        Handle the given request.
        """
        # Make sure this plays nice with Web.
        request.auto_finish = False

        def start_response(status, head):
            request.send_status(status)
            if isinstance(head, list):
                head = dict(head)
            request.send_headers(head)

            return request.write

        # Build an environment for the WSGI application.
        environ = {
            'REQUEST_METHOD'    : request.method,
            'SCRIPT_NAME'       : '',
            'PATH_INFO'         : request.path,
            'QUERY_STRING'      : request.query,
            'SERVER_NAME'       : request.headers.get('Host','127.0.0.1'),
            'SERVER_PROTOCOL'   : request.version,
            'REMOTE_ADDR'       : request.remote_ip,
            'GATEWAY_INTERFACE' : 'WSGI/1.0',
            'wsgi.version'      : (1,0),
            'wsgi.url_scheme'   : request.protocol,
            'wsgi.input'        : cStringIO.StringIO(request.body),
            'wsgi.errors'       : sys.stderr,
            'wsgi.multithread'  : False,
            'wsgi.multiprocess' : False,
            'wsgi.run_once'     : False
        }

        if isinstance(request.connection.server.local_addr, tuple):
            environ['SERVER_PORT'] = request.connection.server.local_addr[1]

        if hasattr(request, 'arguments'):
            environ['wsgiorg.routing_args'] = (request.arguments, {})
        elif hasattr(request, 'match'):
            environ['wsgiorg.routing_args'] = (request.match.groups(), {})

        if 'Content-Type' in request.headers:
            environ['CONTENT_TYPE'] = request.headers['Content-Type']
        if 'Content-Length' in request.headers:
            environ['CONTENT_LENGTH'] = request.headers['Content-Length']

        for k,v in request.headers.iteritems():
            environ['HTTP_%s' % k.replace('-','_').upper()] = v

        # Run the WSGI Application.
        try:
            result = self.app(environ, start_response)
        except Exception, e:
            log.exception('Exception running WSGI application for: %s %s',
                request.method, request.path)

            if not self.debug:
                body, status, headers = error(500, request=request, debug=False)
            else:
                resp = u''.join([
                    u"<h2>Traceback</h2>\n",
                    u"<pre>%s</pre>\n" % traceback.format_exc(),
                    u"<h2>HTTP Request</h2>\n",
                    request.__html__(),
                    ])
                body, status, headers = error(resp, 500, request=request,
                    debug=True)

            request.send_status(500)

            if not 'Content-Length' in headers:
                headers['Content-Length'] = len(body)

            request.send_headers(headers)
            request.write(body)
            request.finish()
            return