Переглянути джерело

server: extract find_node() method

Helge Jung 9 роки тому
батько
коміт
2b90268d64
1 змінених файлів з 27 додано та 12 видалено
  1. 27 12
      ffstatus/server.py

+ 27 - 12
ffstatus/server.py

@@ -144,12 +144,28 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 		self.wfile.write('</tbody>\n')
 		self.wfile.write('</table>\n')
 
-	def respond_node(self, rawid):
-		"""Display node data."""
+	def find_node(self, rawid):
+		"""Fetch node data from storage by given id, if necessary looking thorugh node aliases."""
 
 		storage = self.server.storage
+
+		# if we have a direct hit, return it immediately
+		if rawid in storage.data:
+			return storage.data[rawid]
+
+		# no direct hit -> search via aliases
 		nodeid = rawid
+		for n in storage.data:
+			if 'aliases' in storage.data[n] and rawid in storage.data[n]['aliases']:
+				nodeid = n
+
+		# return found node
+		return storage.data[nodeid] if nodeid in storage.data else None
 
+	def respond_node(self, rawid):
+		"""Display node data."""
+
+		# handle API example linked on index page
 		if rawid == 'ff00ff00ff00':
 			self.send_headers('text/json')
 			self.wfile.write(json.dumps({
@@ -159,32 +175,31 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 			}))
 			return
 
-		if not rawid in storage.data:
-			for n in storage.data:
-				if 'aliases' in storage.data[n] and rawid in storage.data[n]['aliases']:
-					nodeid = n
+		# search node by the given id
+		node = self.find_node(rawid)
 
 		# handle unknown nodes
-		if not nodeid in storage.data:
+		if node is None:
 			self.send_error(404, 'No node with id \'' + rawid + '\' present.')
 			return
 
 		# dump node data as JSON
 		self.send_headers('text/json')
-		self.wfile.write(json.dumps(storage.data[nodeid]))
+		self.wfile.write(json.dumps(node))
 
 	def respond_nodedetail(self, nodeid, field):
-		storage = self.server.storage
+		"""Return a field from the given node - a string is returned as text, all other as JSON."""
 
-		if not nodeid in storage.data:
+		node = self.find_node(nodeid)
+		if node is None:
 			self.send_error(404, 'No node with id \'' + nodeid + '\' present.')
 			return
 
-		if not field in storage.data[nodeid]:
+		if not field in node:
 			self.send_error(404, 'The node \'' + nodeid + '\' does not have a field named \'' + str(field) + '\'.')
 			return
 
-		value = storage.data[nodeid][field]
+		value = node[field]
 
 		self.send_headers('text/plain' if isinstance(value, basestring) else 'text/json')
 		self.wfile.write(value if isinstance(value, basestring) else json.dumps(value))