From 75cb2366966782e54ca440fe0f7afca91807a0de Mon Sep 17 00:00:00 2001 From: Tasaki Date: Sun, 14 Jul 2019 16:16:50 -0700 Subject: [PATCH 1/4] initial commit --- http_server.py | 106 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 86 insertions(+), 20 deletions(-) diff --git a/http_server.py b/http_server.py index 58d7386..74e9494 100644 --- a/http_server.py +++ b/http_server.py @@ -1,6 +1,8 @@ import socket import sys import traceback +import mimetypes +import os def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"): """ @@ -20,20 +22,30 @@ def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"): """ # TODO: Implement response_ok - return b"" + return b"\r\n".join([ + b"HTTP/1.1 200 OK", + b"Content-Type: " + mimetype, + b"", + body]) def response_method_not_allowed(): """Returns a 405 Method Not Allowed response""" # TODO: Implement response_method_not_allowed - return b"" + return b"\r\n".join([ + b"HTTP/1.1 405 Method Not Allowed", + b"", + b"You can't do that on this server!" + ]) def response_not_found(): """Returns a 404 Not Found response""" # TODO: Implement response_not_found - return b"" + return b"\r\n".join([ + b"HTTP/1.1 404 Not Found" + ]) def parse_request(request): @@ -45,7 +57,12 @@ def parse_request(request): """ # TODO: implement parse_request - return "" + method, path, version = request.split("\r\n")[0].split(" ") + + if method != "GET": + raise NotImplementedError + + return path def response_path(path): """ @@ -85,10 +102,50 @@ def response_path(path): # If the path is "make_time.py", then you may OPTIONALLY return the # result of executing `make_time.py`. But you need only return the # CONTENTS of `make_time.py`. + + paths = [ + '/a_web_page.html', + '/images/sample_1.png', + '/images/JPEG_example.jpg', + '/images/Sample_Scene_Balls.jpg', + '/favicon.ico' + ] + root_dir= 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot' + + if path == '/' or path =='/images': + + content, mime_type = dir_contents(root_dir + path) + return content, mime_type + + if path not in paths: + raise NameError + + path.replace("/", "\\") + #'C:\\Users\\stasaki\\Desktop\\Sean\'s stuff\\python\\socket-http-server\\webroot\\' + p = 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot/' + p.replace("/", "\\") + + + if path != '/a_web_page.html': + with open(p + path, 'rb') as f: + content = f.read() + else: + with open(p + path, 'r') as f: + content = f.read() - content = b"not implemented" - mime_type = b"not implemented" + mime_type = mimetypes.guess_type(path)[0] + + return content, mime_type +def dir_contents(root): + content = "" + for root, dirs, files in os.walk(root): + for dir in dirs: + content += dir + ", " + for file in files: + content += file + ", " + content = content[:-1].encode() + mime_type = "text/plain" return content, mime_type @@ -118,22 +175,31 @@ def server(log_buffer=sys.stderr): print("Request received:\n{}\n\n".format(request)) - # TODO: Use parse_request to retrieve the path from the request. - - # TODO: Use response_path to retrieve the content and the mimetype, - # based on the request path. - - # TODO; If parse_request raised a NotImplementedError, then let - # response be a method_not_allowed response. If response_path raised - # a NameError, then let response be a not_found response. Else, - # use the content and mimetype from response_path to build a - # response_ok. - response = response_ok( - body=b"Welcome to my web server", - mimetype=b"text/plain" - ) + try: + path = parse_request(request) + + content, mime_type = response_path(path) + # TODO: Use parse_request to retrieve the path from the request. + + # TODO: Use response_path to retrieve the content and the mimetype, + # based on the request path. + + # TODO; If parse_request raised a NotImplementedError, then let + # response be a method_not_allowed response. If response_path raised + # a NameError, then let response be a not_found response. Else, + # use the content and mimetype from response_path to build a + # response_ok. + if path == '/a_web_page.html': + content = content.encode() + response = response_ok( + body= content, + mimetype= mime_type.encode() + ) + except NotImplementedError: + response = response_method_not_allowed() conn.sendall(response) + except: traceback.print_exc() finally: From c415f273013641feee4d49ae3324c4cf7c5ff966 Mon Sep 17 00:00:00 2001 From: Tasaki Date: Sun, 14 Jul 2019 17:35:24 -0700 Subject: [PATCH 2/4] recent --- http_server.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/http_server.py b/http_server.py index 74e9494..7c5f253 100644 --- a/http_server.py +++ b/http_server.py @@ -3,6 +3,7 @@ import traceback import mimetypes import os +import urllib.request def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"): """ @@ -105,6 +106,8 @@ def response_path(path): paths = [ '/a_web_page.html', + '/sample.txt', + '/make_time.py', '/images/sample_1.png', '/images/JPEG_example.jpg', '/images/Sample_Scene_Balls.jpg', @@ -115,13 +118,21 @@ def response_path(path): if path == '/' or path =='/images': content, mime_type = dir_contents(root_dir + path) + content = content.encode() + mime_type = mime_type return content, mime_type if path not in paths: raise NameError + if 'txt' in path: + txt = urllib.request.urlopen(path).read() + print(txt) + txt = txt.encode() + mime_type = mimetypes.guess_type(path)[0] + return txt, mime_type + path.replace("/", "\\") - #'C:\\Users\\stasaki\\Desktop\\Sean\'s stuff\\python\\socket-http-server\\webroot\\' p = 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot/' p.replace("/", "\\") @@ -144,7 +155,7 @@ def dir_contents(root): content += dir + ", " for file in files: content += file + ", " - content = content[:-1].encode() + content = content[:-2].encode() mime_type = "text/plain" return content, mime_type @@ -195,9 +206,13 @@ def server(log_buffer=sys.stderr): body= content, mimetype= mime_type.encode() ) + except NotImplementedError: response = response_method_not_allowed() + except NameError: + response = response_not_found() + conn.sendall(response) except: From ffcbef82b7f93581423284c3738218917f52f62c Mon Sep 17 00:00:00 2001 From: Tasaki Date: Sun, 14 Jul 2019 17:43:37 -0700 Subject: [PATCH 3/4] fixed sample.txt --- http_server.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/http_server.py b/http_server.py index 7c5f253..980a4a4 100644 --- a/http_server.py +++ b/http_server.py @@ -125,19 +125,13 @@ def response_path(path): if path not in paths: raise NameError - if 'txt' in path: - txt = urllib.request.urlopen(path).read() - print(txt) - txt = txt.encode() - mime_type = mimetypes.guess_type(path)[0] - return txt, mime_type path.replace("/", "\\") p = 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot/' p.replace("/", "\\") - if path != '/a_web_page.html': + if path != '/a_web_page.html' or '/sample.txt': with open(p + path, 'rb') as f: content = f.read() else: From 3db2d33a9adfe7445bde349445013392fd11fab6 Mon Sep 17 00:00:00 2001 From: seaneightysix Date: Sat, 20 Jul 2019 11:39:17 -0500 Subject: [PATCH 4/4] completed --- http_server.py | 87 ++++++++++++---------------- index.html | 18 ++++++ webroot/make_time.py => make_time.py | 0 3 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 index.html rename webroot/make_time.py => make_time.py (100%) diff --git a/http_server.py b/http_server.py index 980a4a4..07260cf 100644 --- a/http_server.py +++ b/http_server.py @@ -1,9 +1,9 @@ -import socket +import os import sys -import traceback +import socket import mimetypes -import os -import urllib.request +import traceback +from pathlib import Path def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"): """ @@ -104,53 +104,42 @@ def response_path(path): # result of executing `make_time.py`. But you need only return the # CONTENTS of `make_time.py`. - paths = [ - '/a_web_page.html', - '/sample.txt', - '/make_time.py', - '/images/sample_1.png', - '/images/JPEG_example.jpg', - '/images/Sample_Scene_Balls.jpg', - '/favicon.ico' - ] - root_dir= 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot' - if path == '/' or path =='/images': + #root_dir = os.path.dirname(os.path.realpath(__file__)) + "/webroot/" + root_dir = os.path.dirname(os.path.realpath(__file__)) - content, mime_type = dir_contents(root_dir + path) + if path =="" or path =="/": + with open(root_dir + "/index.html", "r") as f: + content = f.read().encode() + content += "\r\n".join(os.listdir(root_dir + "/webroot/")).encode() + elif path.endswith(".py"): + content = open(root_dir + "/make_time.py").read() + exec(content) content = content.encode() - mime_type = mime_type - return content, mime_type - - if path not in paths: - raise NameError - - - path.replace("/", "\\") - p = 'C:/Users/stasaki/Desktop/Sean\'s stuff/python/socket-http-server/webroot/' - p.replace("/", "\\") - - - if path != '/a_web_page.html' or '/sample.txt': - with open(p + path, 'rb') as f: - content = f.read() else: - with open(p + path, 'r') as f: - content = f.read() + whole_path = Path(root_dir + "/webroot/" + path) - mime_type = mimetypes.guess_type(path)[0] - - return content, mime_type - -def dir_contents(root): - content = "" - for root, dirs, files in os.walk(root): - for dir in dirs: - content += dir + ", " - for file in files: - content += file + ", " - content = content[:-2].encode() - mime_type = "text/plain" + try: + assert os.path.exists(whole_path) + except AssertionError: + raise NameError + else: + if os.path.isfile(whole_path): + with open(whole_path, "rb") as f: + content = f.read() + else: + content = "\r\n".join(os.listdir(whole_path)).encode() + + mime_type = b"text/plain" + if path.endswith(".html") or path.endswith('.htm') or path.endswith('') or path.endswith('/') or path.endswith('/') : + mime_type = b"text/html" + if path.endswith(".txt"): + mime_type = b"text/plain" + if path.endswith(".png"): + mime_type = b"image/png" + if path.endswith(".jpg"): + mime_type = b"image/jpeg" + return content, mime_type @@ -193,12 +182,10 @@ def server(log_buffer=sys.stderr): # response be a method_not_allowed response. If response_path raised # a NameError, then let response be a not_found response. Else, # use the content and mimetype from response_path to build a - # response_ok. - if path == '/a_web_page.html': - content = content.encode() + # response_ok. response = response_ok( body= content, - mimetype= mime_type.encode() + mimetype= mime_type ) except NotImplementedError: diff --git a/index.html b/index.html new file mode 100644 index 0000000..f8a60cc --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + Internet Programming in Python: CGI + + +

Internet Programming in Python

+

socket-http-server assignment

+
    +
  1. a_web_page.html
  2. +
  3. JPEG_example
  4. +
  5. sample.txt
  6. +
  7. sample_1.png
  8. +
  9. Sample_Scene_Balls.jpg
  10. +
  11. make_time.py
  12. +
+ + \ No newline at end of file diff --git a/webroot/make_time.py b/make_time.py similarity index 100% rename from webroot/make_time.py rename to make_time.py