Changeset 5

Show
Ignore:
Timestamp:
04/02/06 20:44:57 (3 years ago)
Author:
Jan-Klaas Kollhof
Message:

rewrite of handlePartialData, ServiceProxy? impelementd for HTTP and sockets

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jsonrpc/__init__.py

    r3 r5  
    6666         
    6767class SimpleConnectionHandler: 
    68     def __init__(self,  DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder): 
     68    def __init__(self,  DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder, messageDelimiter=""): 
    6969        self.decoder = DecoderClass() 
    7070        self.encoder = EncoderClass() 
     
    7272        self.respEvents={} 
    7373        self.respLock = Lock() 
    74         self.messageDelimiter = "\0" 
    75      
     74        self.messageDelimiter=messageDelimiter 
     75         
    7676    def close(self): 
    7777        pass 
     
    8484     
    8585    def handlePartialData(self, data): 
    86         data = self.partialData + data.replace("\r","").replace("\n", "\0") 
     86        data = self.partialData + data.replace("\r","").replace("\n", "") 
    8787        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:] 
    9592                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)     
    9896                except: 
    99                     self.sendResponse(None, None, InvalidJSONMessage()) 
    100                     self.close() 
    101              
     97                    break 
     98            else: 
     99                break 
     100        self.partialData = data 
     101         
    102102        self.handleMessages(msgs) 
    103          
     103 
    104104    def sendNotify(self, name, args): 
    105105        """sends a notification object to the peer""" 
     
    122122        respEvt = ResponseEvent() 
    123123        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 
    130126        self.respLock.release() 
    131         return (respEvt,id) 
     127        return (respEvt,eid) 
    132128         
    133129    def handleMessages(self, msgs): 
     
    193189 
    194190class SimpleServiceHandler(SimpleConnectionHandler): 
    195     def __init__(self, service, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder): 
     191    def __init__(self, service, DecoderClass=JSONDecoder, EncoderClass=JSONRPCEncoder, messageDelimiter=""): 
    196192        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 
    198204         
    199205    def handleRequest(self, req): 
  • trunk/jsonrpc/apacheServiceHandler.py

    r4 r5  
    2929    def handle(self, req): 
    3030        self.req = req 
    31         self.messageDelimiter = "\n" 
    3231        req.content_type = "text/plain" 
    33         self.handlePartialData(req.read() + "\n"
     32        self.handlePartialData(req.read()
    3433 
    3534from mod_python import apache 
     
    4039    (moduleName, ext) = os.path.splitext(fileName) 
    4140     
    42     if not os.path.exists(os.path.join(modulePath,moduleName + ".py")): 
     41    if not os.path.exists(os.path.join(modulePath, moduleName + ".py")): 
    4342        return apache.HTTP_NOT_FOUND 
    4443         
  • trunk/jsonrpc/cgihandler.py

    r3 r5  
    2525class CGIHandler(SimpleServiceHandler): 
    2626    def __init__(self, service): 
     27        self.sendData =[] 
    2728        SimpleServiceHandler.__init__(self, service) 
    28         self.sendData ="" 
    29         self.messageDelimiter="\n" 
    30          
     29 
     30     
    3131    def send(self, data): 
    32         self.sendData += data 
     32        self.sendData.append(data) 
    3333         
    3434    def handle(self): 
     
    4444     
    4545    def sendReply(self): 
    46         data = self.sendData 
     46        data = "\n".join(self.sendData) 
    4747        response = "Content-Type: text/plain\n" 
    4848        response += "Content-Length: %d\n\n" % len(data) 
  • trunk/jsonrpc/proxy.py

    r3 r5  
    5050 
    5151class ServiceProxy(PeerProxy): 
    52     def __init__(self, url, localService): 
     52    def __init__(self, url, localService=None, messageDelimiter=""): 
    5353        m = re.match(r"^jsonrpc:\/\/(.*):(\d*)$", url) 
    5454        if m: 
     
    6161            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    6262            s.connect((host, port)) 
    63             conn = SocketConnectionHandler(s, localService) 
    64             self._conn=conn 
     63            conn = SocketConnectionHandler(s, localService,messageDelimiter=messageDelimiter) 
    6564            PeerProxy.__init__(self, conn) 
    6665             
    6766            t=Thread(target=conn.receiveForever) 
    68             t.setDaemon(False) 
     67            t.setDaemon(True) 
    6968            t.start() 
    7069        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) 
    7273     
    7374    def disconnect(self): 
    7475        import socket 
    7576        self._conn.close() 
    76          
     77     
     78 
     79 
  • trunk/jsonrpc/socketserver.py

    r3 r5  
    1919""" 
    2020from jsonrpc import SimpleServiceHandler 
    21 import socket,sys 
     21import socket 
    2222 
    2323from threading import Thread 
    2424     
    2525class SocketConnectionHandler(SimpleServiceHandler): 
    26     def __init__(self, socket, service): 
     26    def __init__(self, socket, service, messageDelimiter=""): 
    2727        self.socket = socket 
    28         SimpleServiceHandler.__init__(self, service
    29      
     28        SimpleServiceHandler.__init__(self, service, messageDelimiter=messageDelimiter
     29         
    3030    def receiveForever(self): 
    3131        while 1: 
     
    4242                self.handlePartialData(data) 
    4343             
    44          
    4544    def send(self, data): 
    4645        self.socket.send(data) 
    4746     
    4847    def close(self): 
     48        SimpleServiceHandler.close(self) 
    4949        if self.socket: 
    5050            try: 
     
    5555             
    5656 
     57 
    5758class TCPServiceServer: 
    58     def __init__(self, service, ConnectionHandler = SocketConnectionHandler): 
     59    def __init__(self, service, ConnectionHandler = SocketConnectionHandler, messageDelimiter=""): 
    5960        self.service = service 
    6061        self.ConnectionHandler = ConnectionHandler 
     62        self.messageDelimiter=messageDelimiter 
    6163         
    6264    def serve(self, address): 
     
    6466        self.socket.bind(address)         
    6567        self.socket.listen(5) 
     68        print "serving", self.socket 
    6669        while 1: 
    6770            (conn,addr) = self.socket.accept() 
     
    7275     
    7376    def handleConnection(self, conn): 
    74         self.ConnectionHandler(conn, self.service).receiveForever() 
     77        self.ConnectionHandler(conn, self.service, messageDelimiter=self.messageDelimiter).receiveForever() 
    7578     
    7679 
     
    7982    def acceptConnection(self, conn): 
    8083        t = Thread(target=self.handleConnection, args=(conn,)) 
    81         t.setDaemon(0
     84        t.setDaemon(True
    8285        t.start() 
    8386 
     
    8588    pass 
    8689         
    87      
     90