-
Notifications
You must be signed in to change notification settings - Fork 111
Expand file tree
/
Copy pathcalculator.py
More file actions
66 lines (56 loc) · 1.84 KB
/
calculator.py
File metadata and controls
66 lines (56 loc) · 1.84 KB
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
import re
def resolve_path(path):
urls = [(r'^$', welcome),
(r'^add/(\d+)/(\d+)$', add),
(r'^subtract/(\d+)/(\d+)$', subtract),
(r'^divide/(\d+)/(\d+)$', divide),
(r'^multiply/(\d+)/(\d+)$', multiply)]
matchpath = path.lstrip('/')
for regexp, func in urls:
match = re.match(regexp, matchpath)
if match is None:
continue
args = match.groups([])
return func, args
# we get here if no url matches
raise NameError
def welcome():
return "<h1>welcome</h1>"
def multiply(v1, v2):
r = int(v1) * int(v2)
return "<h1>result from multiplication: %d</h1>" %r
def add(v1, v2):
r = int(v1) + int(v2)
return "<h1>result from addition: %d</h1>" % r
def subtract(v1, v2):
r = int(v1) - int(v2)
return "<h1>result from subtraction: %d</h1>" % r
def divide(v1, v2):
r = int(v1) / int(v2)
return "<h1>result from division: %d</h1>" % r
def application(environ, start_response):
headers = [("Content-type", "text/html")]
try:
path = environ.get('PATH_INFO', None)
if path is None:
raise NameError
func, args = resolve_path(path)
body = func(*args)
status = "200 OK"
except NameError:
status = "404 Not Found"
body = "<h1>Not Found</h1>"
except ZeroDivisionError:
status = "400 Bad Request"
body = "<h1>Bad Request</h1>"
except Exception:
status = "500 Internal Server Error"
body = "<h1>Internal Server Error</h1>"
finally:
headers.append(('Content-length', str(len(body))))
start_response(status, headers)
return [body.encode('utf8')]
if __name__ == '__main__':
from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, application)
srv.serve_forever()