electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit d315a413c7b175ecc597a8c83327660f4e0d11fb
parent b1a1736116c18fe9970d8787bf1a49748b834b60
Author: ThomasV <thomasv@gitorious>
Date:   Wed,  9 Nov 2011 21:42:13 +0100

handle http

Diffstat:
Mclient/electrum.py | 39+++++++++++++++++++++------------------
Mserver/server.py | 41+++++++++++++++++++++++++++--------------
2 files changed, 48 insertions(+), 32 deletions(-)

diff --git a/client/electrum.py b/client/electrum.py @@ -17,7 +17,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -import sys, base64, os, re, hashlib, socket, getpass, copy, operator, urllib2, ast +import sys, base64, os, re, hashlib, socket, getpass, copy, operator, ast try: import ecdsa @@ -396,24 +396,27 @@ class Wallet: return conf, unconf def request(self, request ): + import urllib if self.port == 80: - try: - out = urllib2.urlopen('http://'+self.host+'/q/tw', request, timeout=5).read() - except: - out = '' + request2 = urllib.urlencode({'q':request}) + request = "GET /electrum.php?" + request2 + " HTTP/1.0\r\n\r\n" else: - s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) - s.connect(( self.host, self.port)) - s.send(request) - out = '' - while 1: - msg = s.recv(1024) - if msg: out += msg - else: break - s.close() - - if re.match('[^:]\s*\(', out): out = '' + request += "#" + + s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) + s.connect(( self.host, self.port)) + s.send( request ) + out = '' + while 1: + msg = s.recv(1024) + if msg: out += msg + else: break + s.close() + + if self.port == 80: + out = out.split('\r\n')[-1] + return out def retrieve_message(self): @@ -427,10 +430,10 @@ class Wallet: return ast.literal_eval( self.request( repr ( ('h', address ))) ) def poll(self): - return ast.literal_eval( self.request( repr ( ('poll', '' )))) + return ast.literal_eval( self.request( repr ( ('poll', self.session_id )))) def new_session(self): - self.message = self.request( repr ( ('watch', repr(self.addresses) ))) + self.session_id, self.message = ast.literal_eval( self.request( repr ( ('session', repr(self.addresses) )))) def update(self): blocks, changed_addresses = self.poll() diff --git a/server/server.py b/server/server.py @@ -289,31 +289,42 @@ def listen_thread(store): def client_thread(ipaddr,conn): + print "client thread", ipaddr try: ipaddr = ipaddr[0] msg = '' while 1: d = conn.recv(1024) - if d: msg+=d - try: - cmd, data = ast.literal_eval(msg) + msg += d + if d[-1]=='#': break - except: - continue - + + print msg + + try: + cmd, data = ast.literal_eval(msg[:-1]) + except: + print "syntax error", repr(msg) + conn.close() + return if cmd=='b': out = "%d"%store.get_block_number(1) - elif cmd=='watch': + elif cmd=='session': + import random, string + session_id = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10)) + print "new session", ipaddr, session_id + addresses = ast.literal_eval(data) - sessions[ipaddr] = {} + sessions[session_id] = {} for a in addresses: - sessions[ipaddr][a] = '' - out = SERVER_MESSAGE + sessions[session_id][a] = '' + out = repr( (session_id, SERVER_MESSAGE) ) elif cmd=='poll': - addresses = sessions.get(ipaddr) + session_id = data + addresses = sessions.get(session_id) if not addresses: print "session not found", ipaddr out = repr( (-1, {})) @@ -321,9 +332,9 @@ def client_thread(ipaddr,conn): ret = {} for addr in addresses: status = store.get_status( addr ) - last_status = sessions[ipaddr].get( addr ) + last_status = sessions[session_id].get( addr ) if last_status != status: - sessions[ipaddr][addr] = status + sessions[session_id][addr] = status ret[addr] = status out = repr( (store.get_block_number(1), ret ) ) @@ -386,7 +397,9 @@ if __name__ == '__main__': args.connect_args = {"database":"abe"} store = MyStore(args) - thread.start_new_thread(listen_thread, (store,)) + #thread.start_new_thread(listen_thread, (store,)) + listen_thread(store) + exit(0) while True: try: