initialization
This commit is contained in:
commit
095fccc37c
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.idea
|
85
myhttpserver.py
Normal file
85
myhttpserver.py
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
from http.server import BaseHTTPRequestHandler, HTTPServer, SimpleHTTPRequestHandler
|
||||||
|
import os
|
||||||
|
import urllib.parse
|
||||||
|
import html
|
||||||
|
from http import HTTPStatus
|
||||||
|
import io
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def is_picture(filename):
|
||||||
|
file_ext=os.path.splitext(filename)[1]
|
||||||
|
if file_ext in ['.bmp','.png','.jpg','.jpeg','.gif']:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class MyHTTPRequestHandler(SimpleHTTPRequestHandler):
|
||||||
|
def list_directory(self, path):
|
||||||
|
"""Helper to produce a directory listing (absent index.html).
|
||||||
|
|
||||||
|
Return value is either a file object, or None (indicating an
|
||||||
|
error). In either case, the headers are sent, making the
|
||||||
|
interface the same as for send_head().
|
||||||
|
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
list = os.listdir(path)
|
||||||
|
except OSError:
|
||||||
|
self.send_error(
|
||||||
|
HTTPStatus.NOT_FOUND,
|
||||||
|
"No permission to list directory")
|
||||||
|
return None
|
||||||
|
list.sort(key=lambda a: a.lower())
|
||||||
|
r = []
|
||||||
|
try:
|
||||||
|
displaypath = urllib.parse.unquote(self.path,
|
||||||
|
errors='surrogatepass')
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
displaypath = urllib.parse.unquote(path)
|
||||||
|
displaypath = html.escape(displaypath, quote=False)
|
||||||
|
enc = sys.getfilesystemencoding()
|
||||||
|
title = 'Directory listing for %s' % displaypath
|
||||||
|
r.append('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" '
|
||||||
|
'"http://www.w3.org/TR/html4/strict.dtd">')
|
||||||
|
r.append('<html>\n<head>')
|
||||||
|
r.append('<meta http-equiv="Content-Type" '
|
||||||
|
'content="text/html; charset=%s">' % enc)
|
||||||
|
r.append('<title>%s</title>\n</head>' % title)
|
||||||
|
r.append('<body>\n<h1>%s</h1>' % title)
|
||||||
|
r.append('<hr>\n<ul>')
|
||||||
|
for name in list:
|
||||||
|
fullname = os.path.join(path, name)
|
||||||
|
displayname = linkname = name
|
||||||
|
# Append / for directories or @ for symbolic links
|
||||||
|
if os.path.isdir(fullname):
|
||||||
|
displayname = name + "/"
|
||||||
|
linkname = name + "/"
|
||||||
|
if os.path.islink(fullname):
|
||||||
|
displayname = name + "@"
|
||||||
|
# Note: a link to a directory displays with @ and links with /
|
||||||
|
if is_picture(displayname):
|
||||||
|
r.append('<li><img src="%s" style="width:100px"/><a href="%s">%s</a></li>'
|
||||||
|
% (urllib.parse.quote(linkname,
|
||||||
|
errors='surrogatepass'), urllib.parse.quote(linkname,
|
||||||
|
errors='surrogatepass'),
|
||||||
|
html.escape(displayname, quote=False)))
|
||||||
|
else:
|
||||||
|
r.append('<li><a href="%s">%s</a></li>'
|
||||||
|
% (urllib.parse.quote(linkname,
|
||||||
|
errors='surrogatepass'),
|
||||||
|
html.escape(displayname, quote=False)))
|
||||||
|
r.append('</ul>\n<hr>\n</body>\n</html>\n')
|
||||||
|
encoded = '\n'.join(r).encode(enc, 'surrogateescape')
|
||||||
|
f = io.BytesIO()
|
||||||
|
f.write(encoded)
|
||||||
|
f.seek(0)
|
||||||
|
self.send_response(HTTPStatus.OK)
|
||||||
|
self.send_header("Content-type", "text/html; charset=%s" % enc)
|
||||||
|
self.send_header("Content-Length", str(len(encoded)))
|
||||||
|
self.end_headers()
|
||||||
|
return f
|
||||||
|
|
||||||
|
|
||||||
|
with HTTPServer(('', 8000), MyHTTPRequestHandler) as server:
|
||||||
|
server.serve_forever()
|
Loading…
Reference in New Issue
Block a user