1+ # from os import path
12import socket
23import sys
4+ import os
35import traceback
6+ import mimetypes
7+
8+
9+ root_dir = '/' .join ([os .getcwd (), 'webroot' ])
410
511def response_ok (body = b"This is a minimal response" , mimetype = b"text/plain" ):
6- """
7- returns a basic HTTP response
8- Ex:
9- response_ok(
10- b"<html><h1>Welcome:</h1></html>",
11- b"text/html"
12- ) ->
13-
14- b'''
15- HTTP/1.1 200 OK\r \n
16- Content-Type: text/html\r \n
17- \r \n
18- <html><h1>Welcome:</h1></html>\r \n
19- '''
20- """
12+ """returns a basic HTTP response"""
2113
2214 # TODO: Implement response_ok
23- return b""
15+ return b"\r \n " .join ([
16+ b"HTTP/1.1 200 OK" ,
17+ b"Content-Type: " + mimetype ,
18+ b"" ,
19+ body ,
20+ ])
21+
2422
2523def response_method_not_allowed ():
2624 """Returns a 405 Method Not Allowed response"""
2725
2826 # TODO: Implement response_method_not_allowed
29- return b""
27+ return b"\r \n " .join ([
28+ b"HTTP/1.1 405 Method Not Allowed" ,
29+ b"" ,
30+ b"You can't do that on this server!" ,
31+ ])
3032
3133
3234def response_not_found ():
3335 """Returns a 404 Not Found response"""
3436
3537 # TODO: Implement response_not_found
36- return b""
38+ return b"\r \n " .join ([
39+ b"HTTP/1.1 404 Not Found" ,
40+ b"" ,
41+ b"You can't do that on this server!" ,
42+ ])
3743
3844
3945def parse_request (request ):
@@ -45,7 +51,13 @@ def parse_request(request):
4551 """
4652
4753 # TODO: implement parse_request
48- return ""
54+ method , path , version = request .split ("\r \n " )[0 ].split (" " )
55+
56+ if method != "GET" :
57+ raise NotImplementedError
58+
59+ return path
60+
4961
5062def response_path (path ):
5163 """
@@ -59,20 +71,6 @@ def response_path(path):
5971
6072 If the path does not map to a real location, it should raise an
6173 exception that the server can catch to return a 404 response.
62-
63- Ex:
64- response_path('/a_web_page.html') -> (b"<html><h1>North Carolina...",
65- b"text/html")
66-
67- response_path('/images/sample_1.png')
68- -> (b"A12BCF...", # contents of sample_1.png
69- b"image/png")
70-
71- response_path('/') -> (b"images/, a_web_page.html, make_type.py,...",
72- b"text/plain")
73-
74- response_path('/a_page_that_doesnt_exist.html') -> Raises a NameError
75-
7674 """
7775
7876 # TODO: Raise a NameError if the requested content is not present
@@ -85,11 +83,21 @@ def response_path(path):
8583 # If the path is "make_time.py", then you may OPTIONALLY return the
8684 # result of executing `make_time.py`. But you need only return the
8785 # CONTENTS of `make_time.py`.
88-
89- content = b"not implemented"
90- mime_type = b"not implemented"
9186
92- return content , mime_type
87+ mime_type = "text/plain"
88+
89+ if path == "/" :
90+ content = "\n " .join ([x for x in os .listdir (root_dir )]).encode ()
91+ elif not "." in path :
92+ content = "\n " .join ([x for x in os .listdir (root_dir + path )]).encode ()
93+ else :
94+ try :
95+ with open ("" .join ([root_dir , path ]), 'rb' ) as f :
96+ content = f .read ()
97+ mime_type = mimetypes .guess_type (path )[0 ]
98+ except FileNotFoundError :
99+ raise NameError
100+ return content , mime_type .encode ()
93101
94102
95103def server (log_buffer = sys .stderr ):
@@ -112,27 +120,39 @@ def server(log_buffer=sys.stderr):
112120 data = conn .recv (1024 )
113121 request += data .decode ('utf8' )
114122
115- if '\r \n \r \n ' in request :
123+ if len (data ) < 1024 :
124+ break
125+ if b'\r \n \r \n ' in request :
116126 break
117127
118128
119129 print ("Request received:\n {}\n \n " .format (request ))
120130
121131 # TODO: Use parse_request to retrieve the path from the request.
122-
123- # TODO: Use response_path to retrieve the content and the mimetype,
124- # based on the request path.
125-
126- # TODO; If parse_request raised a NotImplementedError, then let
127- # response be a method_not_allowed response. If response_path raised
128- # a NameError, then let response be a not_found response. Else,
129- # use the content and mimetype from response_path to build a
130- # response_ok.
131- response = response_ok (
132- body = b"Welcome to my web server" ,
133- mimetype = b"text/plain"
134- )
135-
132+ try :
133+ path = parse_request (request )
134+
135+ # TODO: Use response_path to retrieve the content and the mimetype,
136+ # based on the request path.
137+ response = response_ok (
138+ body = b"Welcome to my web server" ,
139+ mimetype = b"text/plain"
140+ )
141+
142+ # TODO; If parse_request raised a NotImplementedError, then let
143+ # response be a method_not_allowed response. If response_path raised
144+ # a NameError, then let response be a not_found response. Else,
145+ # use the content and mimetype from response_path to build a
146+ # response_ok.
147+ except NotImplementedError :
148+ response = response_method_not_allowed ()
149+ else :
150+ try :
151+ body , mimetype = response_path (path )
152+ except NameError :
153+ response = response_not_found ()
154+ else :
155+ response = response_ok (body = body , mimetype = mimetype )
136156 conn .sendall (response )
137157 except :
138158 traceback .print_exc ()
0 commit comments