Merge branch 'master' of github.com:spesmilo/electrum-server
[electrum-server.git] / transports / stratum_http.py
index c4fe06a..51d5219 100644 (file)
@@ -153,7 +153,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', '*')
+        self.send_header('Content-Length', '0')
+        self.end_headers()
+            
     def do_GET(self):
         if not self.is_rpc_path_valid():
             self.report_404()
@@ -192,7 +200,7 @@ class StratumJSONRPCRequestHandler(
         self.end_headers()
         self.wfile.write(response)
         self.wfile.flush()
-        self.connection.shutdown(1)
+        self.shutdown_connection()
 
 
     def do_POST(self):
@@ -241,20 +249,26 @@ class StratumJSONRPCRequestHandler(
         self.end_headers()
         self.wfile.write(response)
         self.wfile.flush()
+        self.shutdown_connection()
+
+    def shutdown_connection(self):
         self.connection.shutdown(1)
 
 
+class SSLRequestHandler(StratumJSONRPCRequestHandler):
+    def setup(self):
+        self.connection = self.request
+        self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
+        self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
 
+    def shutdown_connection(self):
+        self.connection.shutdown()
 
-class SSLTCPServer(SocketServer.TCPServer):
 
+class SSLTCPServer(SocketServer.TCPServer):
     def __init__(self, server_address, certfile, keyfile, RequestHandlerClass, bind_and_activate=True):
         SocketServer.BaseServer.__init__(self, server_address, RequestHandlerClass)
         ctx = SSL.Context(SSL.SSLv3_METHOD)
-        self.certfile = certfile
-        self.keyfile = keyfile
-        #certfile = '/etc/ssl/certs/cacert.pem'
-        #keyfile = '/etc/ssl/private/cakey.pem'
         ctx.use_privatekey_file(keyfile)
         ctx.use_certificate_file(certfile)
         self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type))
@@ -263,7 +277,8 @@ class SSLTCPServer(SocketServer.TCPServer):
             self.server_activate()
 
     def shutdown_request(self,request):
-        request.shutdown()
+        #request.shutdown()
+        pass
 
 
 class StratumHTTPServer(SocketServer.TCPServer, StratumJSONRPCDispatcher):
@@ -302,7 +317,7 @@ class StratumHTTPSSLServer(SSLTCPServer, StratumJSONRPCDispatcher):
     allow_reuse_address = True
 
     def __init__(self, addr, certfile, keyfile,
-                 requestHandler=StratumJSONRPCRequestHandler,
+                 requestHandler=SSLRequestHandler,
                  logRequests=False, encoding=None, bind_and_activate=True,
                  address_family=socket.AF_INET):