Skip to content

TypeError: expected string or bytes-like object #48

@neilfloow

Description

@neilfloow

Hi,

I'm trying to use the match function with the following...

import osrm
OSRM_AUTH=('user', 'pass')
OSRM_VERSION = 'v1'
OSRM_PROFILE = 'driving'
OSRM_HOST = 'http://router.project-osrm.org'
osrm.RequestConfig.host = OSRM_HOST
osrm.RequestConfig.version = OSRM_VERSION
osrm.RequestConfig.profile = OSRM_PROFILE
# osrm.RequestConfig.auth = OSRM_AUTH
points = [(-33.45017046193167,-70.65281867980957),
          (-33.45239047269638,-70.65300107002258),
          (-33.453867464504555,-70.65277576446533)]
result = osrm.match(points, steps=False, overview='simplified', url_config=osrm.RequestConfig)

This fails with when calling request.py with HTTPError: HTTP Error 400: Bad Request...

---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
<ipython-input-21-94dd1c9583c0> in <module>
----> 1 result = osrm.match(points, steps=False, overview='simplified', url_config=osrm.RequestConfig)

~/work/mapping/python-osrm/osrm/core.py in match(points, steps, overview, geometry, timestamps, radius, annotations, gaps, tidy, waypoints, url_config)
    102     print(f'type(REQUEST)   : {type(req.get_full_url())}')
    103 
--> 104     r = urlopen(req)
    105     r_json = json.loads(r.read().decode('utf-8'))
    106     if "code" not in r_json or "Ok" not in r_json["code"]:

~/.miniconda3/lib/python3.8/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220     else:
    221         opener = _opener
--> 222     return opener.open(url, data, timeout)
    223 
    224 def install_opener(opener):

~/.miniconda3/lib/python3.8/urllib/request.py in open(self, fullurl, data, timeout)
    529         for processor in self.process_response.get(protocol, []):
    530             meth = getattr(processor, meth_name)
--> 531             response = meth(req, response)
    532 
    533         return response

~/.miniconda3/lib/python3.8/urllib/request.py in http_response(self, request, response)
    638         # request was successfully received, understood, and accepted.
    639         if not (200 <= code < 300):
--> 640             response = self.parent.error(
    641                 'http', request, response, code, msg, hdrs)
    642 

~/.miniconda3/lib/python3.8/urllib/request.py in error(self, proto, *args)
    567         if http_err:
    568             args = (dict, 'default', 'http_error_default') + orig_args
--> 569             return self._call_chain(*args)
    570 
    571 # XXX probably also want an abstract factory that knows when it makes

~/.miniconda3/lib/python3.8/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    500         for handler in handlers:
    501             func = getattr(handler, meth_name)
--> 502             result = func(*args)
    503             if result is not None:
    504                 return result

~/.miniconda3/lib/python3.8/urllib/request.py in http_error_default(self, req, fp, code, msg, hdrs)
    647 class HTTPDefaultErrorHandler(BaseHandler):
    648     def http_error_default(self, req, fp, code, msg, hdrs):
--> 649         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    650 
    651 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 400: Bad Request

If I enable authorisation it gets round this but still fails, this time with a TypeError: expected string or bytes-like object...

OSRM_AUTH=('user', 'pass')
OSRM_VERSION = 'v1'
OSRM_PROFILE = 'driving'
OSRM_HOST = 'http://router.project-osrm.org'
osrm.RequestConfig.host = OSRM_HOST
osrm.RequestConfig.version = OSRM_VERSION
osrm.RequestConfig.profile = OSRM_PROFILE
osrm.RequestConfig.auth = OSRM_AUTH
points = [(-33.45017046193167,-70.65281867980957),
          (-33.45239047269638,-70.65300107002258),
          (-33.453867464504555,-70.65277576446533)]
result = osrm.match(points, steps=False, overview='simplified', url_config=osrm.RequestConfig)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-94dd1c9583c0> in <module>
----> 1 result = osrm.match(points, steps=False, overview='simplified', url_config=osrm.RequestConfig)

~/work/mapping/python-osrm/osrm/core.py in match(points, steps, overview, geometry, timestamps, radius, annotations, gaps, tidy, waypoints, url_config)
    102     print(f'type(REQUEST)   : {type(req.get_full_url())}')
    103 
--> 104     r = urlopen(req)
    105     r_json = json.loads(r.read().decode('utf-8'))
    106     if "code" not in r_json or "Ok" not in r_json["code"]:

~/.miniconda3/lib/python3.8/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220     else:
    221         opener = _opener
--> 222     return opener.open(url, data, timeout)
    223 
    224 def install_opener(opener):

~/.miniconda3/lib/python3.8/urllib/request.py in open(self, fullurl, data, timeout)
    523 
    524         sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method())
--> 525         response = self._open(req, data)
    526 
    527         # post-process response

~/.miniconda3/lib/python3.8/urllib/request.py in _open(self, req, data)
    540 
    541         protocol = req.type
--> 542         result = self._call_chain(self.handle_open, protocol, protocol +
    543                                   '_open', req)
    544         if result:

~/.miniconda3/lib/python3.8/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    500         for handler in handlers:
    501             func = getattr(handler, meth_name)
--> 502             result = func(*args)
    503             if result is not None:
    504                 return result

~/.miniconda3/lib/python3.8/urllib/request.py in http_open(self, req)
   1377 
   1378     def http_open(self, req):
-> 1379         return self.do_open(http.client.HTTPConnection, req)
   1380 
   1381     http_request = AbstractHTTPHandler.do_request_

~/.miniconda3/lib/python3.8/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1348         try:
   1349             try:
-> 1350                 h.request(req.get_method(), req.selector, req.data, headers,
   1351                           encode_chunked=req.has_header('Transfer-encoding'))
   1352             except OSError as err: # timeout error

~/.miniconda3/lib/python3.8/http/client.py in request(self, method, url, body, headers, encode_chunked)
   1253                 encode_chunked=False):
   1254         """Send a complete request to the server."""
-> 1255         self._send_request(method, url, body, headers, encode_chunked)
   1256 
   1257     def _send_request(self, method, url, body, headers, encode_chunked):

~/.miniconda3/lib/python3.8/http/client.py in _send_request(self, method, url, body, headers, encode_chunked)
   1294 
   1295         for hdr, value in headers.items():
-> 1296             self.putheader(hdr, value)
   1297         if isinstance(body, str):
   1298             # RFC 2616 Section 3.7.1 says that text default has a

~/.miniconda3/lib/python3.8/http/client.py in putheader(self, header, *values)
   1230                 values[i] = str(one_value).encode('ascii')
   1231 
-> 1232             if _is_illegal_header_value(values[i]):
   1233                 raise ValueError('Invalid header value %r' % (values[i],))
   1234 

TypeError: expected string or bytes-like object

I've checked type(req) that is passed to urlopen(req) and its reported as a string so I'm stumped as to whats going wrong here.

If I try defining a custom RequestConfig() I get an HTTPError: HTTP Erro 400: Bad Request again...

OSRM_AUTH=('user', 'pass')
OSRM_VERSION = 'v1'
OSRM_PROFILE = 'driving'
OSRM_HOST = 'http://router.project-osrm.org'
custom_conf = osrm.RequestConfig(OSRM_HOST, basic_auth=OSRM_AUTH)
custom_conf.profile = OSRM_PROFILE
custom_conf.version = OSRM_VERSION
points = [(-33.45017046193167,-70.65281867980957),
          (-33.45239047269638,-70.65300107002258),
          (-33.453867464504555,-70.65277576446533)]
result = osrm.match(points, steps=False, overview='simplified', url_config=custom_conf)
---------------------------------------------------------------------------
HTTPError                                 Traceback (most recent call last)
<ipython-input-66-216cc65d42b9> in <module>
----> 1 result = osrm.match(points, steps=False, overview='simplified', url_config=custom_conf)

~/work/mapping/python-osrm/osrm/core.py in match(points, steps, overview, geometry, timestamps, radius, annotations, gaps, tidy, waypoints, url_config)
    104 #    print(f'REQUEST.headers  : {req.get_headers()}')
    105 
--> 106     r = urlopen(req)
    107     r_json = json.loads(r.read().decode('utf-8'))
    108     if "code" not in r_json or "Ok" not in r_json["code"]:

~/.miniconda3/lib/python3.8/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220     else:
    221         opener = _opener
--> 222     return opener.open(url, data, timeout)
    223 
    224 def install_opener(opener):

~/.miniconda3/lib/python3.8/urllib/request.py in open(self, fullurl, data, timeout)
    529         for processor in self.process_response.get(protocol, []):
    530             meth = getattr(processor, meth_name)
--> 531             response = meth(req, response)
    532 
    533         return response

~/.miniconda3/lib/python3.8/urllib/request.py in http_response(self, request, response)
    638         # request was successfully received, understood, and accepted.
    639         if not (200 <= code < 300):
--> 640             response = self.parent.error(
    641                 'http', request, response, code, msg, hdrs)
    642 

~/.miniconda3/lib/python3.8/urllib/request.py in error(self, proto, *args)
    567         if http_err:
    568             args = (dict, 'default', 'http_error_default') + orig_args
--> 569             return self._call_chain(*args)
    570 
    571 # XXX probably also want an abstract factory that knows when it makes

~/.miniconda3/lib/python3.8/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    500         for handler in handlers:
    501             func = getattr(handler, meth_name)
--> 502             result = func(*args)
    503             if result is not None:
    504                 return result

~/.miniconda3/lib/python3.8/urllib/request.py in http_error_default(self, req, fp, code, msg, hdrs)
    647 class HTTPDefaultErrorHandler(BaseHandler):
    648     def http_error_default(self, req, fp, code, msg, hdrs):
--> 649         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    650 
    651 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 400: Bad Request

I'm doing this all under a Conda Virtual Environment that is based on Python 3.8.

Any advice/insight would be very much appreciated as I'm stumped as to how to work out where things are going wrong.

Thanks in advance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions