diff --git a/httpie/client.py b/httpie/client.py index dbb0c7cf..6eef07b7 100644 --- a/httpie/client.py +++ b/httpie/client.py @@ -83,8 +83,8 @@ def get_requests_kwargs(args): # This allows for unicode headers which is non-standard but practical. # See: https://github.com/jkbr/httpie/issues/212 headers = dict( - (k.encode('utf8'), v.encode('utf8') if isinstance(v, str) else v) - for k, v in args.headers.items() + (name, value.encode('utf8') if isinstance(value, str) else value) + for name, value in args.headers.items() ) kwargs = { diff --git a/httpie/models.py b/httpie/models.py index 4327f81d..a91fd696 100644 --- a/httpie/models.py +++ b/httpie/models.py @@ -104,7 +104,10 @@ class HTTPMessage(object): @property def content_type(self): """Return the message content type.""" - return self._orig.headers.get('Content-Type', '') + ct = self._orig.headers.get('Content-Type', '') + if not isinstance(ct, str): + ct = ct.decode('utf8') + return ct class HTTPResponse(HTTPMessage): diff --git a/httpie/plugins/builtin.py b/httpie/plugins/builtin.py index 6e17ed1c..12038aea 100644 --- a/httpie/plugins/builtin.py +++ b/httpie/plugins/builtin.py @@ -20,7 +20,7 @@ class HTTPBasicAuth(requests.auth.HTTPBasicAuth): """ credentials = u'%s:%s' % (self.username, self.password) - token = b64encode(credentials.encode('utf8')).strip() + token = b64encode(credentials.encode('utf8')).strip().decode('latin1') r.headers['Authorization'] = 'Basic %s' % token return r diff --git a/httpie/sessions.py b/httpie/sessions.py index f2002671..7aa370dc 100644 --- a/httpie/sessions.py +++ b/httpie/sessions.py @@ -105,7 +105,7 @@ class Session(BaseConfigDict): """ for name, value in request_headers.items(): - + value = value.decode('utf8') if name == 'User-Agent' and value.startswith('HTTPie/'): continue diff --git a/tests/test_defaults.py b/tests/test_defaults.py index 5922502c..2e64097e 100644 --- a/tests/test_defaults.py +++ b/tests/test_defaults.py @@ -65,7 +65,7 @@ class TestAutoContentTypeAndAcceptHeaders: # JSON headers should automatically be set also for GET with data. r = http('POST', httpbin('/post'), 'a=b') assert HTTP_OK in r - assert '"Accept": "application/json"' in r + assert '"Accept": "application/json"' in r, r assert '"Content-Type": "application/json; charset=utf-8' in r def test_POST_explicit_JSON_auto_JSON_accept(self): diff --git a/tests/test_httpie.py b/tests/test_httpie.py index 299f2d19..c8b1ec89 100644 --- a/tests/test_httpie.py +++ b/tests/test_httpie.py @@ -61,5 +61,5 @@ class TestHTTPie: def test_headers(self): r = http('GET', httpbin('/headers'), 'Foo:bar') assert HTTP_OK in r - assert '"User-Agent": "HTTPie' in r + assert '"User-Agent": "HTTPie' in r, r assert '"Foo": "bar"' in r diff --git a/tests/test_unicode.py b/tests/test_unicode.py index f88a0db9..283b432a 100644 --- a/tests/test_unicode.py +++ b/tests/test_unicode.py @@ -6,40 +6,40 @@ Various unicode handling related tests. from tests import http, httpbin -JP_SUN = u'太陽' +UNICODE = u'太陽' class TestUnicode: def test_unicode_headers(self): - r = http('GET', httpbin('/headers'), u'Test:%s' % JP_SUN) - assert r.json['headers']['Test'] == JP_SUN + r = http('GET', httpbin('/headers'), u'Test:%s' % UNICODE) + assert r.json['headers']['Test'] == UNICODE def test_unicode_form_item(self): - r = http('--form', 'POST', httpbin('/post'), u'test=%s' % JP_SUN) - assert r.json['form']['test'] == JP_SUN + r = http('--form', 'POST', httpbin('/post'), u'test=%s' % UNICODE) + assert r.json['form']['test'] == UNICODE def test_unicode_json_item(self): - r = http('--json', 'POST', httpbin('/post'), u'test=%s' % JP_SUN) - assert r.json['json']['test'] == JP_SUN + r = http('--json', 'POST', httpbin('/post'), u'test=%s' % UNICODE) + assert r.json['json']['test'] == UNICODE def test_unicode_raw_json_item(self): - r = http('--json', 'POST', httpbin('/post'), u'test:=["%s"]' % JP_SUN) - assert r.json['json']['test'] == [JP_SUN] + r = http('--json', 'POST', httpbin('/post'), u'test:=["%s"]' % UNICODE) + assert r.json['json']['test'] == [UNICODE] def test_unicode_url(self): - r = http(httpbin(u'/get?test=' + JP_SUN)) - assert r.json['args']['test'] == JP_SUN + r = http(httpbin(u'/get?test=' + UNICODE)) + assert r.json['args']['test'] == UNICODE def test_unicode_basic_auth(self): # it doesn't really authenticate us because httpbin # doesn't interpret the utf8-encoded auth - http('--verbose', '--auth', u'test:%s' % JP_SUN, - httpbin(u'/basic-auth/test/' + JP_SUN)) + http('--verbose', '--auth', u'test:%s' % UNICODE, + httpbin(u'/basic-auth/test/' + UNICODE)) def test_unicode_digest_auth(self): # it doesn't really authenticate us because httpbin # doesn't interpret the utf8-encoded auth http('--auth-type=digest', - '--auth', u'test:%s' % JP_SUN, - httpbin(u'/digest-auth/auth/test/' + JP_SUN)) + '--auth', u'test:%s' % UNICODE, + httpbin(u'/digest-auth/auth/test/' + UNICODE))