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