def __call__()

in api/handler.py [0:0]


    def __call__(self, environ, start_response, session):
        """Run the function, return response OR return stacktrace"""
        response = None
        try:
            # Read JSON client data if any
            try:
                request_size = int(environ.get('CONTENT_LENGTH', 0))
            except (ValueError):
                request_size = 0
            requestBody = environ['wsgi.input'].read(request_size)
            formdata = {}
            if requestBody and len(requestBody) > 0:
                try:
                    formdata = json.loads(requestBody.decode('utf-8'))
                except json.JSONDecodeError as err:
                    start_response('400 Invalid request', [
                               ('Content-Type', 'application/json')])
                    yield json.dumps({
                        "code": 400,
                        "reason": "Invalid JSON: %s" % err,
                        'server': "Apache Warble/%s" % WARBLE_VERSION
                    })
                    return

            # Validate URL against OpenAPI specs
            try:
                self.API.validate(environ['REQUEST_METHOD'], self.path, formdata)
            except plugins.openapi.OpenAPIException as err:
                session.headers.append(('Content-Type', 'application/json'))
                start_response('400 Invalid request', 
                            session.headers)
                yield json.dumps({
                    "code": 400,
                    "reason": err.message,
                    'server': "Apache Warble/%s" % WARBLE_VERSION
                })
                return

            # Call page with env, SR and form data
            try:
                response = self.func(self, environ, formdata, session)
                if response:
                    for bucket in response:
                        yield bucket
            except WarbleHTTPError as err:
                errHeaders = {
                    403: '403 Authentication failed',
                    404: '404 Resource not found',
                    444: '444 Empty response',
                    499: '499 Required Token Missing',
                    500: '500 Internal Server Error',
                    501: '501 Gateway error'
                }
                errHeader = errHeaders[err.code] if err.code in errHeaders else "400 Bad request"
                session.headers.append(('Content-Type', 'application/json'))
                start_response(errHeader, session.headers)
                yield json.dumps({
                    "code": err.code,
                    "reason": err.message,
                    'server': "Apache Warble/%s" % WARBLE_VERSION
                }, indent = 4) + "\n"
                return

        except:
            err_type, err_value, tb = sys.exc_info()
            traceback_output = ['API traceback:']
            traceback_output += traceback.format_tb(tb)
            traceback_output.append('%s: %s' % (err_type.__name__, err_value))
            # We don't know if response has been given yet, try giving one, fail gracefully.
            try:
                session.headers.append(('Content-Type', 'application/json'))
                start_response('500 Internal Server Error',
                               session.headers)
            except:
                pass
            yield json.dumps({
                "code": "500",
                "reason": '\n'.join(traceback_output),
                'server': "Apache Warble/%s" % WARBLE_VERSION
            })