diff --git a/resources/session02/homework/http_server.py b/resources/session02/homework/http_server.py index 84ceffe1..b037ad77 100644 --- a/resources/session02/homework/http_server.py +++ b/resources/session02/homework/http_server.py @@ -1,14 +1,18 @@ import socket import sys +import mimetypes +from pathlib import Path def response_ok(body=b"this is a pretty minimal response", mimetype=b"text/plain"): """returns a basic HTTP response""" + + body, mimetype = resolve_uri(body) resp = [] resp.append(b"HTTP/1.1 200 OK") - resp.append(b"Content-Type: text/plain") + resp.append(b"Content-Type: " + mimetype) resp.append(b"") - resp.append(b"this is a pretty minimal response") + resp.append(body) return b"\r\n".join(resp) @@ -22,7 +26,10 @@ def response_method_not_allowed(): def response_not_found(): """returns a 404 Not Found response""" - return b"" + resp = [] + resp.append("HTTP/1.1 404 Not Found") + resp.append("") + return "\r\n".join(resp).encode('utf8') def parse_request(request): @@ -35,7 +42,37 @@ def parse_request(request): def resolve_uri(uri): """This method should return appropriate content and a mime type""" - return b"still broken", b"text/plain" + contents = b'' + mimetype = b'' + directory = './webroot' + + if isinstance(uri, bytes): + directory += str(uri.decode('utf8')) + else: + directory += str(uri) + + try: + pathreq = Path(directory).resolve() # Attempt to resolve the requested directory + + if pathreq.exists(): + if pathreq.is_dir(): + # The requested path maps to a directory. The content should be a + # plain-text listing of the directory contents with a mimetype of text/plain. + filelist = [str(files) for files in pathreq.iterdir() if files.is_file()] + contents = '\n'.join(filelist).encode('utf8') + mimetype = b'text/plain' + else: + # The requested path maps to a file + contents = pathreq.read_bytes() + mimetype = mimetypes.guess_type(str(pathreq))[0].encode('utf8') + else: + raise NameError("{} does not exist\n".format(pathreq)) + except FileNotFoundError: + raise NameError("{} could not be resolved\n".format(directory)) + except: + print("Unexpected error:{}\n".format(sys.exc_info()[0])) + + return contents, mimetype def server(log_buffer=sys.stderr):