-
-
Save HaiyangXu/ec88cbdce3cdbac7b8d5 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*- | |
#test on python 3.4 ,python of lower version has different module organization. | |
import http.server | |
from http.server import HTTPServer, BaseHTTPRequestHandler | |
import socketserver | |
PORT = 8080 | |
Handler = http.server.SimpleHTTPRequestHandler | |
Handler.extensions_map={ | |
'.manifest': 'text/cache-manifest', | |
'.html': 'text/html', | |
'.png': 'image/png', | |
'.jpg': 'image/jpg', | |
'.svg': 'image/svg+xml', | |
'.css': 'text/css', | |
'.js': 'application/x-javascript', | |
'': 'application/octet-stream', # Default | |
} | |
httpd = socketserver.TCPServer(("", PORT), Handler) | |
print("serving at port", PORT) | |
httpd.serve_forever() |
Added
'.json': 'application/json',
'.xml': 'application/xml'
and runs perfectly for prototyping and mocking, thanks !
Thanks a lot!
Note that the code should work with any version of python >= 3.0.
I tried av variant of this approach, but it didn't work. I think I blame the python library, though. According to Chrome, the server serves imported ES6 modules (.js/.mjs) as "text/html" (causing the browser to refuse them) after updating the extensions_map (no need to replace the whole map) with entries for .js/.mjs.
saved my life
wasm support: add '.wasm': 'application/wasm',
There is a very subtle bug in this code:
Handler = http.server.SimpleHTTPRequestHandler
This creates a shallow copy, this means that it actually modifies http.server.SimpleHTTPRequestHandler
, here a demonstration:
import http.server
Handler = http.server.SimpleHTTPRequestHandler
Handler.foo = 42
print(http.server.SimpleHTTPRequestHandler.foo) # 42
The correct way to do this is to inherit from http.server.SimpleHTTPRequestHandler
:
import http.server
class Handler(http.server.SimpleHTTPRequestHandler):
pass
Handler.foo = 42
print(http.server.SimpleHTTPRequestHandler.foo) # AttributeError
The modified script with some additional tweaks:
import http.server
import socketserver
PORT = 8080
class HttpRequestHandler(http.server.SimpleHTTPRequestHandler):
extensions_map = {
'': 'application/octet-stream',
'.manifest': 'text/cache-manifest',
'.html': 'text/html',
'.png': 'image/png',
'.jpg': 'image/jpg',
'.svg': 'image/svg+xml',
'.css': 'text/css',
'.js':'application/x-javascript',
'.wasm': 'application/wasm',
'.json': 'application/json',
'.xml': 'application/xml',
}
httpd = socketserver.TCPServer(("localhost", PORT), HttpRequestHandler)
try:
print(f"serving at http://localhost:{PORT}")
httpd.serve_forever()
except KeyboardInterrupt:
pass
There is a very subtle bug in this code:
Nice updates. Thanks @asynts!
Thanks! Also, for cleanup of server i used context manager around httpd.
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
wasm support: add
'.wasm': 'application/wasm',
yessss
'.js':'application/x-javascript',
Maybe a line for '.mjs' (ES6 module) files too?
Python 3 simple HTTP server with MIME type supported