diff --git a/__pycache__/tests.cpython-38.pyc b/__pycache__/tests.cpython-38.pyc
new file mode 100644
index 0000000..8da0bd4
Binary files /dev/null and b/__pycache__/tests.cpython-38.pyc differ
diff --git a/calculator.py b/calculator.py
index a46affd..4e2e7b3 100644
--- a/calculator.py
+++ b/calculator.py
@@ -41,18 +41,45 @@
"""
+import traceback
+
+def home():
+ page = """
+
WSGI Calculator Paths
+
+ | Addition: add/number/number |
+ | Subtraction: subtract/number/number |
+ | Multiplication: multiply/number/number |
+ | Division: divide/number/number |
+
+ """
+ return page
def add(*args):
""" Returns a STRING with the sum of the arguments """
# TODO: Fill sum with the correct value, based on the
# args provided.
- sum = "0"
-
- return sum
+ total = str(int(args[0]) + int(args[1]))
+ return total
# TODO: Add functions for handling more arithmetic operations.
+def subtract(*args):
+ total = str(int(args[0]) - int(args[1]))
+ return total
+
+
+def multiply(*args):
+ total = str(int(args[0]) * int(args[1]))
+ return total
+
+
+def divide(*args):
+ total = str(int(args[0]) / int(args[1]))
+ return total
+
+
def resolve_path(path):
"""
Should return two values: a callable and an iterable of
@@ -63,11 +90,27 @@ def resolve_path(path):
# examples provide the correct *syntax*, but you should
# determine the actual values of func and args using the
# path.
- func = add
- args = ['25', '32']
+ funcs = {
+ '': home,
+ 'add': add,
+ 'subtract': subtract,
+ 'multiply': multiply,
+ 'divide': divide
+ }
+
+ path = path.strip('/').split('/')
+
+ func_name = path[0]
+ args = path[1:]
+
+ try:
+ func = funcs[func_name]
+ except KeyError:
+ raise NameError
return func, args
+
def application(environ, start_response):
# TODO: Your application code from the book database
# work here as well! Remember that your application must
@@ -76,9 +119,30 @@ def application(environ, start_response):
#
# TODO (bonus): Add error handling for a user attempting
# to divide by zero.
- pass
+ 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 = "Not Found
"
+ except Exception:
+ status = "500 Internal Server Error"
+ body = "Internal Server Error
"
+ print(traceback.format_exc())
+ finally:
+ headers.append(('Content-length', str(len(body))))
+ start_response(status, headers)
+ return [body.encode('utf8')]
+
if __name__ == '__main__':
# TODO: Insert the same boilerplate wsgiref simple
# server creation that you used in the book database.
- pass
+ from wsgiref.simple_server import make_server
+ srv = make_server('localhost', 8080, application)
+ srv.serve_forever()