فهرست منبع

error handling

raylu 11 سال پیش
والد
کامیت
ee3c6c6f2c
1فایلهای تغییر یافته به همراه33 افزوده شده و 11 حذف شده
  1. 33 11
      api/server.py

+ 33 - 11
api/server.py

@@ -8,6 +8,7 @@ gevent.monkey.patch_all(thread=False)
 import copy
 import datetime
 import errno
+import httplib
 import json
 import os
 from os import path
@@ -32,6 +33,11 @@ def main():
 	reloader.init(server)
 	server.serve_forever()
 
+class HTTPException(Exception):
+	def __init__(self, code, body):
+		self.code = code
+		self.body = body
+
 def application(environ, start_response):
 	try:
 		split = environ['PATH_INFO'][1:].split('/')
@@ -40,8 +46,7 @@ def application(environ, start_response):
 			query = urlparse.parse_qs(qs, True, True)
 			for k, v in query.items():
 				if len(v) > 1:
-					start_response('400 Bad Request', [('Content-type', 'text/plain')])
-					return ['duplicate query parameter: ' + k]
+					raise HTTPException(400, 'duplicate query parameter: ' + k)
 				query[k] = v[0]
 		else:
 			query = {}
@@ -55,18 +60,24 @@ def application(environ, start_response):
 				print 'no handler for', split
 		else:
 			print 'split was', split
-		start_response('404 Not Found', [('Content-type', 'text/plain')])
-		return ['404 Not Found']
+		raise HTTPException(404, 'unhandled path: ' + environ['PATH_INFO'])
+	except HTTPException as e:
+		response = '%d %s' % (e.code, httplib.responses[e.code])
+		start_response(response, [('Content-type', 'text/plain')])
+		return [e.body]
 	except:
 		traceback.print_exc()
 		start_response('500 Internal Server Error', [('Content-type', 'text/plain')])
 		return ['ruh roh']
 
 def get_data(split, query, environ):
-	group = int(split[1])
-	server_id = int(split[3])
-	start = datetime.datetime.strptime(query['start'], '%Y-%m-%d').date()
-	end = datetime.datetime.strptime(query['end'], '%Y-%m-%d').date()
+	try:
+		group = int(split[1])
+		server_id = int(split[3])
+		start = datetime.datetime.strptime(query['start'], '%Y-%m-%d').date()
+		end = datetime.datetime.strptime(query['end'], '%Y-%m-%d').date()
+	except (IndexError, KeyError, ValueError):
+		raise HTTPException(400, '')
 
 	server_dir = path.join(DATA_DIR, str(group), str(server_id))
 	rval = {}
@@ -80,9 +91,20 @@ def get_data(split, query, environ):
 	return rval
 
 def post_datum(split, query, environ):
-	group = int(split[1])
-	server_id = int(split[3])
-	body = json.load(environ['wsgi.input'])
+	try:
+		group = int(split[1])
+		server_id = int(split[3])
+	except (IndexError, ValueError):
+		raise HTTPException(400, '')
+	try:
+		body = json.load(environ['wsgi.input'])
+	except ValueError:
+		raise HTTPException(400, 'post body was not valid JSON')
+	if not isinstance(body, dict):
+		raise HTTPException(400, 'post body was not a JSON dictionary')
+	if body.keys() != fileio.TEMPLATE.keys():
+		diff = set(body.keys()).symmetric_difference(set(fileio.TEMPLATE.keys()))
+		raise HTTPException(400, 'post body had missing or extra keys: ' + ','.join(diff))
 
 	server_dir = path.join(DATA_DIR, str(group), str(server_id))
 	try: