/
request_handler.py
208 lines (151 loc) · 6.06 KB
/
request_handler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
from http.server import BaseHTTPRequestHandler, HTTPServer
from categories import get_all_categories, delete_category, update_category, create_category, get_single_category
from comments import get_all_comments, update_comment, delete_comment, create_comment, get_comment_by_id
from posts import get_all_posts, update_post, delete_post, get_posts_by_user, create_post, get_single_post
from users import get_all_users, get_single_user, create_user, get_user_by_email_and_password
from tags import get_all_tags, delete_tag, update_tag, create_tag, get_single_tag
import json
class HandleRequests(BaseHTTPRequestHandler):
def _set_headers(self, status):
self.send_response(status)
self.send_header('Content-type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
def do_OPTIONS(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
self.send_header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept')
self.end_headers()
def parse_url(self, path):
path_params = path.split("/")
resource = path_params[1]
if "?" in resource:
param = resource.split("?")[1]
resource = resource.split("?")[0]
pair = param.split("=")
key = pair[0]
value = pair[1]
return ( resource, key, value )
else:
id = None
try:
id = int(path_params[2])
except IndexError:
pass
except ValueError:
pass
return (resource, id)
def do_GET(self):
self._set_headers(200)
response = {}
parsed = self.parse_url(self.path)
if len(parsed) == 2:
( resource, id ) = parsed
if resource == "posts":
if id is not None:
response = f"{get_single_post(id)}"
else:
response = f"{get_all_posts()}"
if resource == "comments":
if id is not None:
response = f"{get_comment_by_id(id)}"
else:
response =f"{get_all_comments()}"
# print(response)
# print(type(response))
if resource == "users":
if id is not None:
response = f"{get_single_user(id)}"
else:
response = f"{get_all_users()}"
if resource == "categories":
if id is not None:
response = f"{get_single_category(id)}"
else:
response = f"{get_all_categories()}"
if resource == "tags":
if id is not None:
response = f"{get_single_tag(id)}"
else:
response = f"{get_all_tags()}"
elif len(parsed) == 3:
( resource, key, value ) = parsed
# resource?key=value
if key == "user_id" and resource == "posts":
response = f"{get_posts_by_user(value)}"
self.wfile.write(response.encode())
def do_POST(self):
self._set_headers(201)
content_len = int(self.headers.get('content-length', 0))
post_body = self.rfile.read(content_len)
post_body = json.loads(post_body)
(resource, id) = self.parse_url(self.path)
new_comment = None
new_category = None
new_post = None
new_tag = None
new_user = None
new_login = None
if resource == "comments":
new_comment = create_comment(post_body)
self.wfile.write(f"{new_comment}".encode())
if resource == "categories":
new_category = create_category(post_body)
self.wfile.write(f"{new_category}".encode())
if resource == "posts":
new_post = create_post(post_body)
self.wfile.write(f"{new_post}".encode())
if resource == "tags":
new_tag = create_tag(post_body)
self.wfile.write(f"{new_tag}".encode())
if resource == "register":
new_user = create_user(post_body)
self.wfile.write(new_user.encode())
if resource == "login":
new_login = get_user_by_email_and_password(post_body)
self.wfile.write(f"{new_login}".encode())
def do_DELETE(self):
# Set a 204 response code
self._set_headers(204)
# Parse the URL
(resource, id) = self.parse_url(self.path)
# Delete a single object from the list
if resource == "categories":
delete_category(id)
self.wfile.write("".encode())
if resource == "comments":
delete_comment(id)
self.wfile.write("".encode())
if resource == "posts":
delete_post(id)
self.wfile.write("".encode())
if resource == "tags":
delete_tag(id)
self.wfile.write("".encode())
def do_PUT(self):
self._set_headers(204)
content_len = int(self.headers.get('content-length', 0))
post_body = self.rfile.read(content_len)
post_body = json.loads(post_body)
(resource, id) = self.parse_url(self.path)
success = False
if resource == "categories":
success = update_category(id, post_body)
if resource == "comments":
success = update_comment(id, post_body)
if resource == "posts":
success = update_post(id, post_body)
if resource == "tags":
success = update_tag(id, post_body)
if success:
self._set_headers(204)
else:
self._set_headers(404)
# self.wfile.write("".encode())
def main():
host = ''
port = 8088
HTTPServer((host, port), HandleRequests).serve_forever()
if __name__ == "__main__":
main()