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
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
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 }