From 3e54431184481abd4dbe789e0cc43cf65d459d1e Mon Sep 17 00:00:00 2001
From: Pooria
Date: Sun, 2 Feb 2020 19:55:41 -0800
Subject: [PATCH] http_server.py
---
http_server.py | 85 +++++++++++++++++++++++++++++---------------------
1 file changed, 49 insertions(+), 36 deletions(-)
diff --git a/http_server.py b/http_server.py
index 58d7386..dfff789 100644
--- a/http_server.py
+++ b/http_server.py
@@ -1,6 +1,8 @@
import socket
import sys
import traceback
+import os
+import mimetypes
def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"):
"""
@@ -19,21 +21,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",
+ b""
+ ])
def parse_request(request):
@@ -44,8 +55,11 @@ def parse_request(request):
NotImplementedError if the method of the request is not GET.
"""
- # 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):
"""
@@ -75,25 +89,29 @@ def response_path(path):
"""
- # TODO: Raise a NameError if the requested content is not present
- # under webroot.
-
- # TODO: Fill in the appropriate content and mime_type give the path.
- # See the assignment guidelines for help on "mapping mime-types", though
- # you might need to create a special case for handling make_time.py
- #
- # 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`.
-
- content = b"not implemented"
- mime_type = b"not implemented"
-
+ abs_path = 'webroot' + path
+ if not os.path.exists(abs_path):
+ raise NameError
+
+ elif os.path.isfile(abs_path):
+ with open(abs_path, 'rb') as file:
+ content = file.read()
+ content = bytearray(content)
+ mime_type = mimetypes.guess_type(path)[0].encode()
+
+ elif os.path.isdir(abs_path):
+ files = os.listdir(abs_path)
+ content = b""
+ for f in files:
+ content += f.encode() + b"\r\n"
+ mime_type = b"text/plain"
+ else:
+ raise NameError
return content, mime_type
def server(log_buffer=sys.stderr):
- address = ('127.0.0.1', 10000)
+ address = ('127.0.0.1', 10002)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print("making a server on {0}:{1}".format(*address), file=log_buffer)
@@ -118,20 +136,15 @@ 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.
+ try :
+ path = parse_request(request)
+ content, mimetype = response_path(path)
+ response = response_ok(content, mimetype)
- # 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"
- )
+ except NameError:
+ response = response_not_found()
+ except NotImplementedError:
+ response = response_method_not_allowed()
conn.sendall(response)
except: