def aws_invoke(app,gateway_input,server_name='localhost',server_port='5000',http_protocol='HTTP/1.1',TLS=True,block_headers=True):
   headers = CaseInsensitiveDict(gateway_input.get('headers',{}))
   requestContext = gateway_input.get('requestContext')
   queryStringParameters = gateway_input.get('queryStringParameters',{})
   clientIp = headers.get('x-forwarded-for')
   if clientIp is None:
      clientIp = requestContext.get('identity',{}).get('sourceIp') if requestContext is not None else ''
   else:
      clientIp = clientIp.split(',')[0]
   environ = {
      'REQUEST_METHOD': gateway_input.get('httpMethod','GET').upper(),
      'SCRIPT_NAME': '',
      'PATH_INFO': gateway_input.get('path','/'),
      'QUERY_STRING': urlencode(queryStringParameters) if queryStringParameters is not None else '',
      'SERVER_NAME': headers.get('host',server_name),
      'SERVER_PORT': headers.get('x-forwarded-port',server_port),
      'SERVER_PROTOCOL': http_protocol,
      'SERVER_SOFTWARE': 'flask-serverless',
      'REMOTE_ADDR': clientIp,
      'wsgi.version': (1, 0),
      'wsgi.url_scheme': headers.get('x-forwarded-proto','https' if TLS else 'http'),
      'wsgi.input': None,
      'wsgi.errors': sys.stderr,
      'wsgi.multiprocess': True,
      'wsgi.multithread': False,
      'wsgi.run_once': True
   }

   if environ['REQUEST_METHOD']=='POST' or environ['REQUEST_METHOD']=='PUT':
      contentType = headers.get('content-type','application/octet-stream')
      parsedContentType = parse_options_header(contentType)
      raw = gateway_input.get('body')
      if raw is None or gateway_input.get('isBase64Encoded',False):
         body = b64decode(raw) if raw is not None else None
      else:
         body = raw.encode(parsedContentType[1].get('charset','utf-8'))
      add_body(environ,body,contentType)

   add_headers(environ,headers,block_headers)

   response = Response.from_app(app.wsgi_app, environ)

   gateway_output = {
      'headers' : dict(response.headers),
      'statusCode' : response.status_code,
   }

   compressed = response.headers.get('Content-Encoding')=='gzip'

   responseType = parse_options_header(response.headers.get('Content-Type','application/octet-stream'))
   if not compressed and ('charset' in responseType[1] or responseType[0] in textTypes or responseType[0][0:5]=='text/'):
      gateway_output['body'] = response.data.decode(responseType[1].get('charset','utf-8'))
      gateway_output['isBase64Encoded'] = False
   else:
      gateway_output['body'] = b64encode(response.data).decode('utf-8')
      gateway_output['isBase64Encoded'] = True

   return gateway_output
Beispiel #2
0
    def __call__(self, environ, start_response):
        # Not yet Flask world, we have to push the context first when we do from_app down below
        current_request = Request(environ)
        # wsgi -> flask world
        response = Response.from_app(self.app, environ, buffered=True)
        response = cors_handler(current_request, response)

        # and now back to wsgi
        app_iter, status, headers = response.get_wsgi_response(environ)
        start_response(status, headers)
        return app_iter
Beispiel #3
0
def invoke(app, args):
    headers = args.get('__ow_headers', {})
    environ = {
        'REQUEST_METHOD': args.get('__ow_method', 'GET').upper(),
        'SCRIPT_NAME': '',
        'PATH_INFO': args.get('__ow_path', '/'),
        'QUERY_STRING': args.get('__ow_query', None),
        'SERVER_NAME': 'localhost',
        'SERVER_PORT': '5000',
        'SERVER_PROTOCOL': 'HTTP/1.1',
        'SERVER_SOFTWARE': 'flask-openwhisk',
        'REMOTE_ADDR': headers.get('x-client-ip', '127.0.0.1'),
        'wsgi.version': (1, 0),
        'wsgi.url_scheme': headers.get('x-forwarded-proto', 'http'),
        'wsgi.input': None,
        'wsgi.errors': sys.stderr,
        'wsgi.multiprocess': True,
        'wsgi.multithread': False,
        'wsgi.run_once': True
    }

    if environ['REQUEST_METHOD'] == 'POST' or environ[
            'REQUEST_METHOD'] == 'PUT':
        contentType = headers.get('content-type', 'application/octet-stream')
        parsedContentType = parse_options_header(contentType)
        raw = args.get('__ow_body')
        if parsedContentType[0][0:5] == 'text/':
            body = raw.encode(parsedContentType[1].get('charset', 'utf-8'))
        else:
            body = b64decode(raw) if raw is not None else None
        add_body(environ, body, contentType)

    add_headers(environ, headers)

    response = Response.from_app(app.wsgi_app, environ)

    responseType = parse_options_header(
        response.headers.get('Content-Type', 'application/octet-stream'))
    if responseType[0][0:responseType[0].find('/')] == 'text':
        body = response.data.decode(responseType[1].get('charset', 'utf-8'))
    else:
        body = b64encode(response.data)

    return {
        'headers': dict(response.headers),
        'statusCode': response.status_code,
        'body': body
    }