Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support binary payloads and responses, and non-UTF8 string payloads for Python functions #217

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions template/python3/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,37 @@
# Licensed under the MIT license. See LICENSE file in the project root for full license information.

import sys
import os
import json
from cgi import parse_header
from function import handler

def get_stdin():
buf = ""
while(True):
line = sys.stdin.readline()
buf += line
if line == "":
break
return buf

if __name__ == "__main__":
st = get_stdin()
st = sys.stdin.buffer.read()
# decode text to string
content_type, type_options = parse_header(os.getenv('Http_Content_Type', ''))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't mention application/x-www-form-urlencoded in the PR description?

if not content_type or content_type.startswith('text/') or content_type == 'application/x-www-form-urlencoded':
encoding = type_options.get('charset', 'utf-8')
try:
st = st.decode(encoding)
except UnicodeDecodeError:
# if explicitly defined encoding can't decode bytes, fail
if 'charset' in type_options:
raise
# otherwise utf-8 was incorrect guess, then keep as bytes
# unknown encoding (LookupError) will fail and propagate
# decode JSON and JSON-LD to dictionary
elif content_type.endswith('json'):
st = json.load(st)
# otherwise keep bytes

ret = handler.handle(st)
if ret != None:
print(ret)

# encode response to JSON if necessary
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part seems fine in principle, but be aware that you also need to set the mime type in the function's deployment. It cannot be dynamic with the classic watchdog.

if ret is not None:
if isinstance(ret, bytes):
sys.stdout.buffer.write(ret)
elif isinstance(ret, str):
sys.stdout.write(ret)
else:
json.dump(ret, sys.stdout)