From b49f6bd2716dfde8e31035cf89e248fb65f0016a Mon Sep 17 00:00:00 2001 From: Andrey Bodosov Date: Sat, 17 Dec 2022 13:37:03 +0300 Subject: [PATCH 1/4] Move to Python 3.X --- httpserver.py | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/httpserver.py b/httpserver.py index db9d1e0..9d09bc0 100755 --- a/httpserver.py +++ b/httpserver.py @@ -13,13 +13,8 @@ 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 def parse_date(ims): """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ @@ -193,7 +188,7 @@ def send_head(self): #if encoding: # self.send_header("Content-Encoding", encoding) self.end_headers() - result = StringIO() + result = BytesIO() result.write(f) result.seek(0) return result @@ -201,7 +196,7 @@ def send_head(self): def translate_path(self, 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 +210,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() From 21fec26d295227d4ea989dbede08db0e3d6f7316 Mon Sep 17 00:00:00 2001 From: Andrey Bodosov Date: Sat, 17 Dec 2022 18:07:59 +0300 Subject: [PATCH 2/4] Fix status line order error --- httpserver.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/httpserver.py b/httpserver.py index 9d09bc0..0397cfd 100755 --- a/httpserver.py +++ b/httpserver.py @@ -15,6 +15,9 @@ import time 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. """ @@ -99,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) @@ -106,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() @@ -154,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) @@ -187,6 +179,20 @@ 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 = BytesIO() result.write(f) From 230eee83324d157d74ff9c9e5fa5d4cb65b21674 Mon Sep 17 00:00:00 2001 From: Andrey Bodosov Date: Sat, 17 Dec 2022 18:42:20 +0300 Subject: [PATCH 3/4] Added the ability to handle an absolute path --- httpserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/httpserver.py b/httpserver.py index 0397cfd..d547f58 100755 --- a/httpserver.py +++ b/httpserver.py @@ -200,6 +200,7 @@ def send_head(self): 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.parse.unquote(path)) From cca7044a4b445b61515ea7687c89ccdd2fcd30e5 Mon Sep 17 00:00:00 2001 From: Andrey Bodosov Date: Sat, 24 Dec 2022 18:10:58 +0300 Subject: [PATCH 4/4] Add example of html --- index.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 index.html 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 + + Who is on duti today? +

+ Простой текст с наличием матерных слов. Пипка. +

+ + \ No newline at end of file