(original) (raw)

changeset: 100184:9896ead3cc1d parent: 100182:a9c9e4054f3f parent: 100183:966bd147ccb5 user: Martin Panter vadmium+py@gmail.com date: Tue Feb 09 11:57:11 2016 +0000 files: Lib/http/client.py Misc/NEWS description: Issue #26045: Merge http.client error addition from 3.5 diff -r a9c9e4054f3f -r 9896ead3cc1d Lib/http/client.py --- a/Lib/http/client.py Mon Feb 08 09:26:57 2016 +0200 +++ b/Lib/http/client.py Tue Feb 09 11:57:11 2016 +0000 @@ -146,6 +146,21 @@ _METHODS_EXPECTING_BODY = {'PATCH', 'POST', 'PUT'} +def _encode(data, name='data'): + """Call data.encode("latin-1") but show a better error message.""" + try: + return data.encode("latin-1") + except UnicodeEncodeError as err: + raise UnicodeEncodeError( + err.encoding, + err.object, + err.start, + err.end, + "%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') " + "if you want to send it encoded in UTF-8." % + (name.title(), data[err.start:err.end], name)) from None + + class HTTPMessage(email.message.Message): # XXX The only usage of this method is in # http.server.CGIHTTPRequestHandler. Maybe move the code there so @@ -1173,7 +1188,7 @@ if isinstance(body, str): # RFC 2616 Section 3.7.1 says that text default has a # default charset of iso-8859-1. - body = body.encode('iso-8859-1') + body = _encode(body, 'body') self.endheaders(body) def getresponse(self): diff -r a9c9e4054f3f -r 9896ead3cc1d Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py Mon Feb 08 09:26:57 2016 +0200 +++ b/Lib/test/test_httplib.py Tue Feb 09 11:57:11 2016 +0000 @@ -1042,7 +1042,7 @@ # intentionally omitted for simplicity blacklist = {"HTTPMessage", "parse_headers"} for name in dir(client): - if name in blacklist: + if name.startswith("_") or name in blacklist: continue module_object = getattr(client, name) if getattr(module_object, "__module__", None) == "http.client": diff -r a9c9e4054f3f -r 9896ead3cc1d Misc/NEWS --- a/Misc/NEWS Mon Feb 08 09:26:57 2016 +0200 +++ b/Misc/NEWS Tue Feb 09 11:57:11 2016 +0000 @@ -170,6 +170,9 @@ Library ------- +- Issue #26045: Add UTF-8 suggestion to error message when posting a + non-Latin-1 string with http.client. + - Issue #26039: Added zipfile.ZipInfo.from_file() and zipinfo.ZipInfo.is_dir(). Patch by Thomas Kluyver. /vadmium+py@gmail.com