def _fetchUrl(self, url, headers, htl): doHttp = False if htl <= 0: doHttp = True # if random, doHttp = True if not doHttp: addr = kenosis.randomNodeAddress() nodes = self.node_.findNearestNodes(nodeAddress=addr, serviceName="kweb") for nodeAddr, netAddr in nodes: if nodeAddr == self.node_.nodeAddress(): continue sys.stderr.write("forwarding request to nodeAddress %s, netAddr %s\n" % (nodeAddr, netAddr)) return self.node_.rpc(nodeAddress=nodeAddr).kweb.fetchUrl(url, headers, htl-1) doHttp = True if doHttp: sys.stderr.write("making HTTP request for %s\n" % url) request = urllib2.Request(url) for k,v in headers.items(): k = k.capitalize() request.add_header(k,v) opener = urllib2.build_opener() try: urlHandle = opener.open(request) except urllib2.HTTPError, e: response = e.code urlHandle = e else: response = 200 urlHandle.headers["connection"] = "close" headersReturn = dict(urlHandle.headers.items()) return response, headersReturn, xmlrpclib.Binary(urlHandle.read())
def do_GET(self): host = self.headers["Host"] realHost = host.replace(kwebSuffix, "") # fixme: remove once we're running as *.kweb.kenosisp2p.org if hostOverride: realHost = hostOverride self.headers["Host"] = realHost self.headers["Connection"] = "close" realUrl = "http://%s" % (realHost + self.path) addr = kenosis.randomNodeAddress() nodes = self.node_.findNearestNodes(nodeAddress=addr, serviceName="kweb") if not nodes: nodes = [(self.node_.nodeAddress(), "")] headersToSend = dict(self.headers.items()) for nodeAddr, netAddr in nodes: try: response_code, headers, data = self.node_.rpc(nodeAddress=nodeAddr).kweb.fetchUrl(realUrl, headersToSend, 0) except kenosis.KenosisError, e: dsunittest.traceException("error with nodeAddress %s, netAddress %s" % (nodeAddr, netAddr)) lastError = e else: break
def testFindNearestOnRealNetwork(self): import kenosis n = kenosis.Node() # findNearestNodes is slow because it wants to find 20 working # nodes but most of the time our network does not have that # many nodes so it has to try to contact every on the network # before giving up. nodeAddress = kenosis.randomNodeAddress() for x in range(2): nodeInfos = n.findNearestNodes( nodeAddress=nodeAddress, serviceName="kenosis") print("Found nodes: %s" % nodeInfos) n.stopEvent_.set()
def testJunk(self): import kenosis n = kenosis.Node(useUpnp=False, useZeroconf=False) print("node %s on port %s" % (n.nodeAddress(), n.port())) print("found: %s" % n.findNearestNodes(nodeAddress=kenosis.randomNodeAddress(), serviceName="kenosis"))