ソースを参照

server: parse URL with query params

Helge Jung 9 年 前
コミット
42d578be87
1 ファイル変更24 行追加10 行削除
  1. 24 10
      ffstatus/server.py

+ 24 - 10
ffstatus/server.py

@@ -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')