|
@@ -8,6 +8,7 @@ gevent.monkey.patch_all(thread=False)
|
|
|
import copy
|
|
import copy
|
|
|
import datetime
|
|
import datetime
|
|
|
import errno
|
|
import errno
|
|
|
|
|
+import httplib
|
|
|
import json
|
|
import json
|
|
|
import os
|
|
import os
|
|
|
from os import path
|
|
from os import path
|
|
@@ -32,6 +33,11 @@ def main():
|
|
|
reloader.init(server)
|
|
reloader.init(server)
|
|
|
server.serve_forever()
|
|
server.serve_forever()
|
|
|
|
|
|
|
|
|
|
+class HTTPException(Exception):
|
|
|
|
|
+ def __init__(self, code, body):
|
|
|
|
|
+ self.code = code
|
|
|
|
|
+ self.body = body
|
|
|
|
|
+
|
|
|
def application(environ, start_response):
|
|
def application(environ, start_response):
|
|
|
try:
|
|
try:
|
|
|
split = environ['PATH_INFO'][1:].split('/')
|
|
split = environ['PATH_INFO'][1:].split('/')
|
|
@@ -40,8 +46,7 @@ def application(environ, start_response):
|
|
|
query = urlparse.parse_qs(qs, True, True)
|
|
query = urlparse.parse_qs(qs, True, True)
|
|
|
for k, v in query.items():
|
|
for k, v in query.items():
|
|
|
if len(v) > 1:
|
|
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]
|
|
query[k] = v[0]
|
|
|
else:
|
|
else:
|
|
|
query = {}
|
|
query = {}
|
|
@@ -55,18 +60,24 @@ def application(environ, start_response):
|
|
|
print 'no handler for', split
|
|
print 'no handler for', split
|
|
|
else:
|
|
else:
|
|
|
print 'split was', split
|
|
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:
|
|
except:
|
|
|
traceback.print_exc()
|
|
traceback.print_exc()
|
|
|
start_response('500 Internal Server Error', [('Content-type', 'text/plain')])
|
|
start_response('500 Internal Server Error', [('Content-type', 'text/plain')])
|
|
|
return ['ruh roh']
|
|
return ['ruh roh']
|
|
|
|
|
|
|
|
def get_data(split, query, environ):
|
|
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))
|
|
server_dir = path.join(DATA_DIR, str(group), str(server_id))
|
|
|
rval = {}
|
|
rval = {}
|
|
@@ -80,9 +91,20 @@ def get_data(split, query, environ):
|
|
|
return rval
|
|
return rval
|
|
|
|
|
|
|
|
def post_datum(split, query, environ):
|
|
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))
|
|
server_dir = path.join(DATA_DIR, str(group), str(server_id))
|
|
|
try:
|
|
try:
|