-
Notifications
You must be signed in to change notification settings - Fork 34
Open
Labels
Milestone
Description
Describe the bug
Base64 encoding requires proper Python3 string handling
To Reproduce
Steps to reproduce the behavior, e.g.:
- Configure a
stetl.inputs.HttpInput
with Basic Auth - Running it
- Expected to see successful
- Seeing error : something like TypeError: expected bytes-like object, not str
Expected Behavior
No error.
Screenshots or Logfiles
This is a left-over from the Python2 to Python3 migration: need to use Unicode Strings in Python3.
Many examples like https://stackoverflow.com/questions/53340627/typeerror-expected-bytes-like-object-not-str
Context (please complete one or more from the following information):
- OS: any
- Python Version: 3.7
- Stetl Version 2.1
- Stetl Input/Output/Filter Component:
stetl.inputs.HttpInput
andstetl.outputs.HttpOutput
(maybe more) - Stetl Config file NA
If running with Docker:
- Docker installed version
- Stetl Docker Image version: 2.1
Additional context
Current version stetl.inputs.HttpInput
.
def add_authorization(self, request):
"""
Add authorization from config data. Authorization scheme-specific.
May be extended or overloaded for additional schemes.
:param request: the HTTP Request
:return:
"""
auth_creds = self.auth
auth_type = auth_creds['type']
auth_val = None
if auth_type == 'basic':
# Basic auth: http://mozgovipc.blogspot.nl/2012/06/python-http-basic-authentication-with.html
# base64 encode username and password
# write the Authorization header like: 'Basic base64encode(username + ':' + password)
auth_val = base64.encodestring('%s:%s' % (auth_creds['user'], auth_creds['password']))
auth_val = "Basic %s" % auth_val
elif auth_type == 'token':
# Bearer Type, see eg. https://tools.ietf.org/html/rfc6750
auth_val = "%s %s" % (auth_creds['keyword'], auth_creds['token'])
request.add_header("Authorization", auth_val.replace('\n', ''))
must become something like:
def add_authorization(self, request):
"""
Add authorization from config data. Authorization scheme-specific.
May be extended or overloaded for additional schemes.
:param request: the HTTP Request
:return:
"""
auth_creds = self.auth
auth_type = auth_creds['type']
auth_val = None
if auth_type == 'basic':
# Basic auth: http://mozgovipc.blogspot.nl/2012/06/python-http-basic-authentication-with.html
# base64 encode username and password
# write the Authorization header like: 'Basic base64encode(username + ':' + password)
auth_val = base64.encodebytes(
'{}:{}'.format(auth_creds['user'], auth_creds['password']).encode())
auth_val = 'Basic {}'.format(auth_val.decode())
elif auth_type == 'token':
# Bearer Type, see eg. https://tools.ietf.org/html/rfc6750
auth_val = "%s %s" % (auth_creds['keyword'], auth_creds['token'])
request.add_header("Authorization", auth_val.replace('\n', ''))