diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-12-06 10:22:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-06 10:22:12 (GMT) |
commit | 3b81c13ac3e0acfdbfb0d916a4ea627c9a546049 (patch) | |
tree | 369596c79082c9e4fa7b2e5c2ea7a97e3880a181 /Lib/http/server.py | |
parent | 7b98207aa46bd637d07a7c4a84e998726b74acde (diff) | |
download | cpython-3b81c13ac3e0acfdbfb0d916a4ea627c9a546049.zip cpython-3b81c13ac3e0acfdbfb0d916a4ea627c9a546049.tar.gz cpython-3b81c13ac3e0acfdbfb0d916a4ea627c9a546049.tar.bz2 |
[3.9] gh-100001: Omit control characters in http.server stderr logs. (GH-100002) (#100032)
* gh-100001: Omit control characters in http.server stderr logs. (GH-100002)
Replace control characters in http.server.BaseHTTPRequestHandler.log_message with an escaped \xHH sequence to avoid causing problems for the terminal the output is printed to.
(cherry picked from commit d8ab0a4dfa48f881b4ac9ab857d2e9de42f72828)
Co-authored-by: Gregory P. Smith <greg@krypto.org>
* also escape \s (backport of PR #100038).
* add versionadded and remove extra 'to'
Co-authored-by: Gregory P. Smith <greg@krypto.org>
Diffstat (limited to 'Lib/http/server.py')
-rw-r--r-- | Lib/http/server.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/Lib/http/server.py b/Lib/http/server.py index 6bf9084..cf8933c 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -93,6 +93,7 @@ import email.utils import html import http.client import io +import itertools import mimetypes import os import posixpath @@ -563,6 +564,11 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): self.log_message(format, *args) + # https://en.wikipedia.org/wiki/List_of_Unicode_characters#Control_codes + _control_char_table = str.maketrans( + {c: fr'\x{c:02x}' for c in itertools.chain(range(0x20), range(0x7f,0xa0))}) + _control_char_table[ord('\\')] = r'\\' + def log_message(self, format, *args): """Log an arbitrary message. @@ -578,12 +584,16 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): The client ip and current date/time are prefixed to every message. + Unicode control characters are replaced with escaped hex + before writing the output to stderr. + """ + message = format % args sys.stderr.write("%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), - format%args)) + message.translate(self._control_char_table))) def version_string(self): """Return the server software version string.""" |