diff --git a/http_server.py b/http_server.py
index 58d7386..62fba60 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"):
     """
@@ -18,22 +20,30 @@ def response_ok(body=b"This is a minimal response", mimetype=b"text/plain"):
         
Welcome:
\r\n
         '''
     """
+    return b"\r\n".join([
+            b"HTTP/1.1 200 OK",
+            b"Content-Type: " + mimetype,
+            b"",
+            body,
+            ])
 
-    # TODO: Implement response_ok
-    return b""
 
 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"",
+            b"File not found!"
+            ])
 
 
 def parse_request(request):
@@ -43,9 +53,13 @@ def parse_request(request):
     This server only handles GET requests, so this method shall raise a
     NotImplementedError if the method of the request is not GET.
     """
-
-    # TODO: implement parse_request
-    return ""
+    method, uri, version = request.split("\r\n")[0].split(" ")
+    
+    if method != "GET":
+        raise NotImplementedError
+        
+    return uri
+    
 
 def response_path(path):
     """
@@ -74,20 +88,29 @@ def response_path(path):
         response_path('/a_page_that_doesnt_exist.html') -> Raises a NameError
 
     """
-
-    # TODO: Raise a NameError if the requested content is not present
-    # under webroot.
+    path = os.path.join("webroot", path[1:])
+    if not os.path.exists(path):
+        raise NameError
 
     # 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 os.path.isdir(path):
+        mime_type = b"text/plain"
+        content = b""
+        for file in os.listdir(path):
+            content = content + file.encode() + b"\n"
+    else:
+        mime_type = mimetypes.guess_type(path)[0].encode()
+        track = open(path, "rb")
+        content = track.read()
+            
+    
     # 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"
 
     return content, mime_type
 
@@ -119,19 +142,26 @@ 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)
+                
+                    # TODO: Use response_path to retrieve the content and the mimetype,
+                    # based on the request path.
+                    content, mimetype =response_path(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=content,
+                        mimetype=mimetype
+                    )
+                except NotImplementedError:
+                    response = response_method_not_allowed()
+                except NameError:
+                    response = response_not_found() 
 
                 conn.sendall(response)
             except: