Source code for gemstone.discovery.default
import random
import string
from tornado.httpclient import HTTPClient, HTTPRequest
import simplejson as json
from gemstone.discovery.base import BaseDiscoveryStrategy
[docs]class HttpDiscoveryStrategy(BaseDiscoveryStrategy):
"""
A discovery strategy that uses the HTTP protocol as transport. Each ``ping`` and ``locate``
calls translate to HTTP requests.
"""
def __init__(self, registry_location):
self.registry = registry_location
def make_jsonrpc_call(self, url, method, params):
client = HTTPClient()
body = json.dumps({
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": "".join([random.choice(string.ascii_letters) for _ in range(10)])
})
request = HTTPRequest(url, method="POST", headers={"content-type": "application/json"},
body=body)
result = client.fetch(request)
return result
def ping(self, name, location, **kwargs):
self.make_jsonrpc_call(self.registry, "ping",
{"name": name, "url": location})
def locate(self, name):
response = self.make_jsonrpc_call(self.registry, "locate_service", {"name": name})
resp_as_dict = json.loads(response.body.decode())
return resp_as_dict["result"]