taverntesting/tavern

RestRequestException when using custom headers

methsib opened this issue · 3 comments

Our tests started failing today with following exception and further investigations found that latest version of requests is causing the issue.

requests.exceptions.InvalidHeader: Header part ('application/x-www-form-urlencoded') from {'content-type': 'application/x-www-form-urlencoded'} must be of type str or bytes, not <class 'tavern.util.formatted_str.FormattedString'>

Steps to reproduce

---
test_name: Test
stages:
  - name: Test requests issue
    request:
      url: "http://www.example.com/get_info"
      method: GET
      headers:
        content-type: application/x-www-form-urlencoded 

Error message

Errors:
E   tavern.util.exceptions.RestRequestException
---------------------------------------------------------------------------------------------------------------------------------------- Captured log call ----------------------------------------------------------------------------------------------------------------------------------------- 
ERROR    tavern._plugins.rest.request:request.py:552 Error running prepared request
Traceback (most recent call last):
  File "C:\myenv\lib\site-packages\tavern\_plugins\rest\request.py", line 550, in run
    return self._prepared()
  File "C:\myenv\lib\site-packages\tavern\_plugins\rest\request.py", line 530, in prepared_request
    return session.request(**self._request_args)
  File "C:\myenv\lib\site-packages\requests\sessions.py", line 573, in request
    prep = self.prepare_request(req)
  File "C:\myenv\lib\site-packages\requests\sessions.py", line 484, in prepare_request
    p.prepare(
  File "C:\myenv\lib\site-packages\requests\models.py", line 369, in prepare
    self.prepare_headers(headers)
  File "C:\myenv\lib\site-packages\requests\models.py", line 491, in prepare_headers
    check_header_validity(header)
  File "C:\myenv\lib\site-packages\requests\utils.py", line 1037, in check_header_validity
    raise InvalidHeader(
requests.exceptions.InvalidHeader: Header part ('application/x-www-form-urlencoded') from {'content-type': 'application/x-www-form-urlencoded'} must be of type str or bytes, not <class 'tavern.util.formatted_str.FormattedString'>

Notes

It seems the headers are being turned into FormattedString objects and called in the rest module here.
And the headers specifically are added to the request args here.

quick fix:

during installation force dependency

pip install requests==2.27.1 tavern

Also here, and worked.

Should be fixed in 1.23.2.