]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35292: Avoid calling mimetypes.init when http.server is imported (GH-17822)
authorAn Long <aisk@users.noreply.github.com>
Wed, 8 Jan 2020 18:28:14 +0000 (02:28 +0800)
committerSteve Dower <steve.dower@python.org>
Wed, 8 Jan 2020 18:28:14 +0000 (10:28 -0800)
Doc/library/http.server.rst
Lib/http/server.py
Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst [new file with mode: 0644]

index 5173decb2b2ef9801eba695cce573640326f2d5e..478a5b31475cfd8676b437a9c34c659c0dee1cc4 100644 (file)
@@ -335,11 +335,14 @@ provides three different variants:
 
    .. attribute:: extensions_map
 
-      A dictionary mapping suffixes into MIME types. The default is
-      signified by an empty string, and is considered to be
-      ``application/octet-stream``. The mapping is used case-insensitively,
+      A dictionary mapping suffixes into MIME types, contains custom overrides
+      for the default system mappings. The mapping is used case-insensitively,
       and so should contain only lower-cased keys.
 
+      .. versionchanged:: 3.9
+         This dictionary is no longer filled with the default system mappings,
+         but only contains overrides.
+
    .. attribute:: directory
 
       If not specified, the directory to serve is the current working directory.
index c6e5ed6ea0e0023075c25a7461ad4fb6fde1a16a..2d74b95586cff48128fc6544c7e69c18dc6599fd 100644 (file)
@@ -639,6 +639,12 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
     """
 
     server_version = "SimpleHTTP/" + __version__
+    extensions_map = _encodings_map_default = {
+        '.gz': 'application/gzip',
+        '.Z': 'application/octet-stream',
+        '.bz2': 'application/x-bzip2',
+        '.xz': 'application/x-xz',
+    }
 
     def __init__(self, *args, directory=None, **kwargs):
         if directory is None:
@@ -866,25 +872,16 @@ class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
         slow) to look inside the data to make a better guess.
 
         """
-
         base, ext = posixpath.splitext(path)
         if ext in self.extensions_map:
             return self.extensions_map[ext]
         ext = ext.lower()
         if ext in self.extensions_map:
             return self.extensions_map[ext]
-        else:
-            return self.extensions_map['']
-
-    if not mimetypes.inited:
-        mimetypes.init() # try to read system mime.types
-    extensions_map = mimetypes.types_map.copy()
-    extensions_map.update({
-        '': 'application/octet-stream', # Default
-        '.py': 'text/plain',
-        '.c': 'text/plain',
-        '.h': 'text/plain',
-        })
+        guess, _ = mimetypes.guess_type(path)
+        if guess:
+            return guess
+        return 'application/octet-stream'
 
 
 # Utilities for CGIHTTPRequestHandler
diff --git a/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst b/Misc/NEWS.d/next/Library/2020-01-08-14-39-19.bpo-35292.ihRT1z.rst
new file mode 100644 (file)
index 0000000..ae52f97
--- /dev/null
@@ -0,0 +1 @@
+Proxy the `SimpleHTTPRequestHandler.guess_type` to `mimetypes.guess_type` so the `mimetypes.init` is called lazily to avoid unnecessary costs when :mod:`http.server` module is imported.
\ No newline at end of file