Changeset 5
- Timestamp:
- 04/02/06 20:44:57 (3 years ago)
- Files:
-
- trunk/jsonrpc/__init__.py (modified) (5 diffs)
- trunk/jsonrpc/apacheServiceHandler.py (modified) (2 diffs)
- trunk/jsonrpc/cgihandler.py (modified) (2 diffs)
- trunk/jsonrpc/http.py (added)
- trunk/jsonrpc/proxy.py (modified) (2 diffs)
- trunk/jsonrpc/socketserver.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/jsonrpc/__init__.py
r3 r5 66 66 67 67 class SimpleConnectionHandler: 68 def __init__(self, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder ):68 def __init__(self, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder, messageDelimiter=""): 69 69 self.decoder = DecoderClass() 70 70 self.encoder = EncoderClass() … … 72 72 self.respEvents={} 73 73 self.respLock = Lock() 74 self.messageDelimiter = "\0"75 74 self.messageDelimiter=messageDelimiter 75 76 76 def close(self): 77 77 pass … … 84 84 85 85 def handlePartialData(self, data): 86 data = self.partialData + data.replace("\r","").replace("\n", " \0")86 data = self.partialData + data.replace("\r","").replace("\n", "") 87 87 msgs=[] 88 srcs = data.split("\0") 89 #ignore last one as it is not terminated by \0 or \n 90 self.partialData=srcs.pop() 91 92 while len(srcs): 93 src = srcs.pop(0).replace("\0", '') 94 if src != "": 88 while data != "": 89 pos = data.find("{") 90 if(pos > -1): 91 data=data[pos:] 95 92 try: 96 obj=self.decoder.decode(src) 97 msgs.append(obj) 93 (obj, pos) = self.decoder.raw_decode(data) 94 data = data[pos:] 95 msgs.append(obj) 98 96 except: 99 self.sendResponse(None, None, InvalidJSONMessage()) 100 self.close() 101 97 break 98 else: 99 break 100 self.partialData = data 101 102 102 self.handleMessages(msgs) 103 103 104 104 def sendNotify(self, name, args): 105 105 """sends a notification object to the peer""" … … 122 122 respEvt = ResponseEvent() 123 123 self.respLock.acquire() 124 i=1 125 keys = self.respEvents.keys() 126 while "%d" % i in keys: 127 i+=1 128 id="%d" % i 129 self.respEvents[id] = respEvt 124 eid = id(respEvt) 125 self.respEvents[eid] = respEvt 130 126 self.respLock.release() 131 return (respEvt, id)127 return (respEvt,eid) 132 128 133 129 def handleMessages(self, msgs): … … 193 189 194 190 class SimpleServiceHandler(SimpleConnectionHandler): 195 def __init__(self, service, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder ):191 def __init__(self, service, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder, messageDelimiter=""): 196 192 self.service = service 197 SimpleConnectionHandler.__init__(self, DecoderClass, EncoderClass) 193 SimpleConnectionHandler.__init__(self, DecoderClass, EncoderClass, messageDelimiter) 194 try: 195 service._newConnection(self) 196 except: 197 pass 198 199 def close(self): 200 try: 201 self.service._closingConnection(self) 202 except: 203 pass 198 204 199 205 def handleRequest(self, req): trunk/jsonrpc/apacheServiceHandler.py
r4 r5 29 29 def handle(self, req): 30 30 self.req = req 31 self.messageDelimiter = "\n"32 31 req.content_type = "text/plain" 33 self.handlePartialData(req.read() + "\n")32 self.handlePartialData(req.read()) 34 33 35 34 from mod_python import apache … … 40 39 (moduleName, ext) = os.path.splitext(fileName) 41 40 42 if not os.path.exists(os.path.join(modulePath, moduleName + ".py")):41 if not os.path.exists(os.path.join(modulePath, moduleName + ".py")): 43 42 return apache.HTTP_NOT_FOUND 44 43 trunk/jsonrpc/cgihandler.py
r3 r5 25 25 class CGIHandler(SimpleServiceHandler): 26 26 def __init__(self, service): 27 self.sendData =[] 27 28 SimpleServiceHandler.__init__(self, service) 28 self.sendData ="" 29 self.messageDelimiter="\n" 30 29 30 31 31 def send(self, data): 32 self.sendData += data32 self.sendData.append(data) 33 33 34 34 def handle(self): … … 44 44 45 45 def sendReply(self): 46 data = self.sendData46 data = "\n".join(self.sendData) 47 47 response = "Content-Type: text/plain\n" 48 48 response += "Content-Length: %d\n\n" % len(data) trunk/jsonrpc/proxy.py
r3 r5 50 50 51 51 class ServiceProxy(PeerProxy): 52 def __init__(self, url, localService ):52 def __init__(self, url, localService=None, messageDelimiter=""): 53 53 m = re.match(r"^jsonrpc:\/\/(.*):(\d*)$", url) 54 54 if m: … … 61 61 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 62 62 s.connect((host, port)) 63 conn = SocketConnectionHandler(s, localService) 64 self._conn=conn 63 conn = SocketConnectionHandler(s, localService,messageDelimiter=messageDelimiter) 65 64 PeerProxy.__init__(self, conn) 66 65 67 66 t=Thread(target=conn.receiveForever) 68 t.setDaemon( False)67 t.setDaemon(True) 69 68 t.start() 70 69 else: 71 raise "HTTP Proxy not supported" 70 from jsonrpc.http import HTTPClientConnectionHandler 71 conn= HTTPClientConnectionHandler(url, localService,messageDelimiter=messageDelimiter) 72 PeerProxy.__init__(self, conn) 72 73 73 74 def disconnect(self): 74 75 import socket 75 76 self._conn.close() 76 77 78 79 trunk/jsonrpc/socketserver.py
r3 r5 19 19 """ 20 20 from jsonrpc import SimpleServiceHandler 21 import socket ,sys21 import socket 22 22 23 23 from threading import Thread 24 24 25 25 class SocketConnectionHandler(SimpleServiceHandler): 26 def __init__(self, socket, service ):26 def __init__(self, socket, service, messageDelimiter=""): 27 27 self.socket = socket 28 SimpleServiceHandler.__init__(self, service )29 28 SimpleServiceHandler.__init__(self, service, messageDelimiter=messageDelimiter) 29 30 30 def receiveForever(self): 31 31 while 1: … … 42 42 self.handlePartialData(data) 43 43 44 45 44 def send(self, data): 46 45 self.socket.send(data) 47 46 48 47 def close(self): 48 SimpleServiceHandler.close(self) 49 49 if self.socket: 50 50 try: … … 55 55 56 56 57 57 58 class TCPServiceServer: 58 def __init__(self, service, ConnectionHandler = SocketConnectionHandler ):59 def __init__(self, service, ConnectionHandler = SocketConnectionHandler, messageDelimiter=""): 59 60 self.service = service 60 61 self.ConnectionHandler = ConnectionHandler 62 self.messageDelimiter=messageDelimiter 61 63 62 64 def serve(self, address): … … 64 66 self.socket.bind(address) 65 67 self.socket.listen(5) 68 print "serving", self.socket 66 69 while 1: 67 70 (conn,addr) = self.socket.accept() … … 72 75 73 76 def handleConnection(self, conn): 74 self.ConnectionHandler(conn, self.service ).receiveForever()77 self.ConnectionHandler(conn, self.service, messageDelimiter=self.messageDelimiter).receiveForever() 75 78 76 79 … … 79 82 def acceptConnection(self, conn): 80 83 t = Thread(target=self.handleConnection, args=(conn,)) 81 t.setDaemon( 0)84 t.setDaemon(True) 82 85 t.start() 83 86 … … 85 88 pass 86 89 87 90