diff --git a/httpserver.py b/httpserver.py index db9d1e0..d547f58 100755 --- a/httpserver.py +++ b/httpserver.py @@ -13,13 +13,11 @@ import email.utils import shutil import time -from BaseHTTPServer import HTTPServer -from SimpleHTTPServer import SimpleHTTPRequestHandler -from SocketServer import ThreadingMixIn -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO +from http.server import HTTPServer, SimpleHTTPRequestHandler, ThreadingHTTPServer +from io import BytesIO +import logging + +logging.basicConfig(level=os.environ.get("LOGLEVEL", "DEBUG")) def parse_date(ims): """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ @@ -104,6 +102,7 @@ def copyfile(self, src_data, dst): def do_GET(self): """Serve a GET request.""" + logging.debug(f'do_GET call') f = self.send_head() if f: self.copyfile(f, self.wfile) @@ -111,6 +110,7 @@ def do_GET(self): def do_HEAD(self): """Serve a HEAD request.""" + logging.debug(f'do_HEAD call') f = self.send_head() if f: f.close() @@ -159,19 +159,6 @@ def send_head(self): headers = dict(self.headers) fs = os.stat(path) - self.send_header("Content-Length", str(fs[6])) - self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) - self.send_header("Accept-Ranges", "bytes") - - if 'if-modified-since' in headers: - ims = headers['if-modified-since'] - ims = parse_date(ims.split(";")[0].strip()) - if ims >= int(fs.st_mtime): - self.send_response(304) - self.send_header('Date', time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())) - self.end_headers() - return None - if 'range' in headers: self.send_response(206) start, end = parse_range_header(headers, fs.st_size) @@ -192,16 +179,31 @@ def send_head(self): self.send_header("Content-type", mimetype) #if encoding: # self.send_header("Content-Encoding", encoding) + + if 'if-modified-since' in headers: + ims = headers['if-modified-since'] + ims = parse_date(ims.split(";")[0].strip()) + if ims >= int(fs.st_mtime): + self.send_response(304) + self.send_header('Date', time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime())) + self.end_headers() + return None + + self.send_header("Content-Length", str(fs[6])) + self.send_header("Last-Modified", self.date_time_string(fs.st_mtime)) + self.send_header("Accept-Ranges", "bytes") + self.end_headers() - result = StringIO() + result = BytesIO() result.write(f) result.seek(0) return result def translate_path(self, path): + path = urllib.parse.urlparse(path).path path = path.split('?',1)[0] path = path.split('#',1)[0] - path = posixpath.normpath(urllib.unquote(path)) + path = posixpath.normpath(urllib.parse.unquote(path)) words = path.split('/') words = filter(None, words) path = root_path @@ -215,25 +217,23 @@ def translate_path(self, path): def _test(self): headers = str(self.headers).split() - print 'Range' in self.headers + print('Range' in self.headers) for index,data in enumerate(headers): if data.strip().lower().startswith('range'):#.startswith('range:'): pass return _RerootedHTTPRequestHandler -class ThreadingServer(ThreadingMixIn, HTTPServer): - pass def run(port=8080, doc_root=os.getcwd()): - serveraddr = ('', port) - serv = ThreadingServer(serveraddr, get_handler(doc_root)) - print 'Server Started at port:', port + serveraddr = ('0.0.0.0', port) + serv = ThreadingHTTPServer(serveraddr, get_handler(doc_root)) + print(f'Server Started at port: {port}') serv.serve_forever() def test(): import doctest - print doctest.testmod() + print(doctest.testmod()) if __name__=='__main__': run() diff --git a/index.html b/index.html new file mode 100644 index 0000000..4a231fc --- /dev/null +++ b/index.html @@ -0,0 +1,10 @@ + + +
Hello from my hurt + ++ Простой текст с наличием матерных слов. Пипка. +
+ + \ No newline at end of file