|
@@ -6,35 +6,49 @@ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
|
|
|
|
|
|
from storage import Storage
|
|
|
import json
|
|
|
+import logging
|
|
|
import re
|
|
|
from SocketServer import ThreadingMixIn
|
|
|
|
|
|
class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
|
|
|
+ def parse_url_pathquery(self):
|
|
|
+ url = re.match(r'^\/(?P<path>.+?)(\?(?P<query>.+))?$', self.path)
|
|
|
+ if url is None:
|
|
|
+ logging.warn('Failed to parse URL \'' + str(self.path) + '\'.')
|
|
|
+ return ( None, None )
|
|
|
+
|
|
|
+ path = url.group('path')
|
|
|
+ query = {}
|
|
|
+ if not url.group('query') is None:
|
|
|
+ for m in re.finditer(r'(?P<key>.+?)=(?P<value>.+?)(&|$)', url.group('query')):
|
|
|
+ query[m.group('key')] = m.group('value')
|
|
|
+ return ( path, query )
|
|
|
+
|
|
|
def do_GET(self):
|
|
|
- url = self.path
|
|
|
+ path, query = self.parse_url_pathquery()
|
|
|
|
|
|
- if url == '/':
|
|
|
- self.respond_index()
|
|
|
+ if path == '':
|
|
|
+ self.respond_index(query)
|
|
|
return
|
|
|
|
|
|
- if url == '/list':
|
|
|
- self.respond_list()
|
|
|
+ if path == 'list':
|
|
|
+ self.respond_list(query)
|
|
|
return
|
|
|
|
|
|
- m = re.match(r'^/node/([a-f0-9]{12})\.json$', url)
|
|
|
+ m = re.match(r'node/([a-f0-9]{12})\.json$', path)
|
|
|
if m != None:
|
|
|
self.respond_node(m.group(1))
|
|
|
return
|
|
|
|
|
|
- self.send_error(404, 'The URL \'{0}\' was not found here.'.format(url))
|
|
|
+ self.send_error(404, 'The URL \'{0}\' was not found here.'.format(path))
|
|
|
|
|
|
def send_nocache_headers(self):
|
|
|
self.send_header('Cache-Control', 'no-cache, no-store, must-revalidate')
|
|
|
self.send_header('Pragma', 'no-cache')
|
|
|
self.send_header('Expires', '0')
|
|
|
|
|
|
- def respond_index(self):
|
|
|
- storage = self.server.storage
|
|
|
+ def respond_index(self, query):
|
|
|
+ storagy = self.server.storage
|
|
|
|
|
|
self.send_response(200)
|
|
|
self.send_header('Content-Type', 'text/html; charset=utf-8')
|
|
@@ -62,7 +76,7 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
|
|
|
self.wfile.write('</dl>\n')
|
|
|
self.wfile.write('</body></html>')
|
|
|
|
|
|
- def respond_list(self):
|
|
|
+ def respond_list(self, query):
|
|
|
storage = self.server.storage
|
|
|
self.send_response(200)
|
|
|
self.send_header('Content-Type', 'text/html')
|