X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=transports%2Fstratum_http.py;h=959befff6ddccd88392c847bea70828aa4b0ebaf;hb=6a3dcc17d69dfb6de16db254599d5d92ed016588;hp=25e07387de4c24a48dce7baed421eddc8858c1eb;hpb=54dbaa1d8ae01b09fb24ceb7e247024add7aab32;p=electrum-server.git diff --git a/transports/stratum_http.py b/transports/stratum_http.py index 25e0738..959beff 100644 --- a/transports/stratum_http.py +++ b/transports/stratum_http.py @@ -22,7 +22,7 @@ import SimpleXMLRPCServer import SocketServer import socket import logging -import os +import os, time import types import traceback import sys, threading @@ -47,11 +47,7 @@ from the processor point of view: """ -def random_string(N): - import random, string - return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(N)) - - +from processor import random_string def get_version(request): @@ -101,6 +97,11 @@ class StratumJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): response = fault.response() return response + session = self.dispatcher.get_session_by_address(session_id) + if not session: + return 'Error: session not found' + session.time = time.time() + responses = [] if type(request) is not types.ListType: request = [ request ] @@ -111,13 +112,12 @@ class StratumJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): responses.append(result.response()) continue - session = self.sessions.get(session_id) - self.dispatcher.process(session, req_entry) + self.dispatcher.do_dispatch(session, req_entry) if req_entry['method'] == 'server.stop': return json.dumps({'result':'ok'}) - r = self.poll_session(session_id) + r = self.poll_session(session) for item in r: responses.append(json.dumps(item)) @@ -134,7 +134,15 @@ class StratumJSONRPCDispatcher(SimpleXMLRPCServer.SimpleXMLRPCDispatcher): class StratumJSONRPCRequestHandler( SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): - + + def do_OPTIONS(self): + self.send_response(200) + self.send_header('Allow', 'GET, POST, OPTIONS') + self.send_header('Access-Control-Allow-Origin', '*') + self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With') + self.send_header('Content-Length', '0') + self.end_headers() + def do_GET(self): if not self.is_rpc_path_valid(): self.report_404() @@ -168,6 +176,7 @@ class StratumJSONRPCRequestHandler( self.send_header("Set-Cookie", "SESSION=%s"%session_id) self.send_header("Content-type", "application/json-rpc") + self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Content-length", str(len(response))) self.end_headers() self.wfile.write(response) @@ -216,6 +225,7 @@ class StratumJSONRPCRequestHandler( self.send_header("Set-Cookie", "SESSION=%s"%session_id) self.send_header("Content-type", "application/json-rpc") + self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Content-length", str(len(response))) self.end_headers() self.wfile.write(response) @@ -256,17 +266,16 @@ class StratumJSONRPCServer(SocketServer.TCPServer, StratumJSONRPCDispatcher): flags |= fcntl.FD_CLOEXEC fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags) - self.sessions = {} - def create_session(self): session_id = random_string(10) - self.sessions[session_id] = HttpSession(session_id) + session = HttpSession(session_id) + self.dispatcher.add_session(session) return session_id - def poll_session(self, session_id): - q = self.sessions[session_id].pending_responses + def poll_session(self, session): + q = session.pending_responses responses = [] while not q.empty(): r = q.get() @@ -283,12 +292,19 @@ class HttpSession(Session): def __init__(self, session_id): Session.__init__(self) self.pending_responses = Queue.Queue() - print "new http session", session_id + self.address = session_id + self.name = "HTTP" def send_response(self, response): raw_response = json.dumps(response) self.pending_responses.put(response) + def stopped(self): + with self.lock: + if time.time() - self.time > 60: + self._stopped = True + return self._stopped + class HttpServer(threading.Thread): def __init__(self, dispatcher, host, port): self.shared = dispatcher.shared @@ -307,6 +323,7 @@ class HttpServer(threading.Thread): self.server = StratumThreadedJSONRPCServer(( self.host, self.port)) self.server.dispatcher = self.dispatcher self.server.register_function(None, 'server.stop') + self.server.register_function(None, 'server.info') print "HTTP server started." self.server.serve_forever()