diff options
| -rw-r--r-- | PubnubCoreAsync.py | 107 | ||||
| -rw-r--r-- | python-tornado/Pubnub.py | 16 | ||||
| -rw-r--r-- | python-twisted/Pubnub.py | 61 | 
3 files changed, 66 insertions, 118 deletions
| diff --git a/PubnubCoreAsync.py b/PubnubCoreAsync.py index 0ea03e9..4eb62e9 100644 --- a/PubnubCoreAsync.py +++ b/PubnubCoreAsync.py @@ -49,7 +49,8 @@ class PubnubCoreAsync(object):          secret_key = False,          cipher_key = False,          ssl_on = False, -        origin = 'pubsub.pubnub.com' +        origin = 'pubsub.pubnub.com', +        uuid = None      ) :          """          #** @@ -76,6 +77,12 @@ class PubnubCoreAsync(object):          self.ssl           = ssl_on          self.subscriptions = {}          self.timetoken     = 0 +        self.uuid          = uuid or str(self.uuid())  +        self.headers       = { +            'V' : '3.1', +            'User-Agent' : 'Python-*', +            'Accept-Encoding' : 'gzip' +        }          if self.ssl :              self.origin = 'https://' + self.origin @@ -160,7 +167,7 @@ class PubnubCoreAsync(object):              signature = '0'          ## Send Message -        return self._request([ +        return self._request({ "urlcomponents" : [              'publish',              self.publish_key,              self.subscribe_key, @@ -168,7 +175,7 @@ class PubnubCoreAsync(object):              channel,              '0',              message -        ], publish_response ) +        ] }, publish_response ) @@ -234,7 +241,6 @@ class PubnubCoreAsync(object):              return "Already Connected"          self.subscriptions[channel]['connected'] = 1 -        print self.subscriptions          ## SUBSCRIPTION RECURSION           def substabizel():              ## STOP CONNECTION? @@ -242,6 +248,7 @@ class PubnubCoreAsync(object):                  return              def sub_callback(response): +                print response                  response = json.loads(response)                  ## STOP CONNECTION?                  if not self.subscriptions[channel]['connected']: @@ -292,13 +299,13 @@ class PubnubCoreAsync(object):              ## CONNECT TO PUBNUB SUBSCRIBE SERVERS              try : -                self._request( [ +                self._request( { "urlcomponents" : [                      'subscribe',                      self.subscribe_key,                      channel,                      '0',                      str(self.timetoken) -                ], sub_callback ) +                ], "urlparams" : {"uuid":self.uuid} }, sub_callback )              except :                  self.timeout( 1, substabizel )                  return @@ -347,13 +354,13 @@ class PubnubCoreAsync(object):          ## Get History          pc = PubnubCrypto() -        return self._request( [ +        return self._request( {"urlcomponents" : [              'history',              self.subscribe_key,              channel,              '0',              str(limit) -        ], args['callback'] ) +        ]}, args['callback'] )      def time( self, args ) :          """ @@ -376,10 +383,10 @@ class PubnubCoreAsync(object):              if not response: return 0              args['callback'](response[0]) -        self._request( [ +        self._request( { "urlcomponents" : [              'time',              '0' -        ], complete ) +        ]}, complete )      def uuid(self) :          """ @@ -397,86 +404,16 @@ class PubnubCoreAsync(object):          """          return uuid.uuid1() -    def _request( self, request, callback ) : -        global pnconn_pool - +    def getUrl(self,request):          ## Build URL          url = self.origin + '/' + "/".join([              "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and                  hex(ord(ch)).replace( '0x', '%' ).upper() or                  ch for ch in list(bit) -            ]) for bit in request]) - -        requestType = request[0] -        agent       = Agent( -            reactor, -            self.ssl and None or pnconn_pool, -            connectTimeout=30 -        ) -        request     = agent.request( 'GET', url, Headers({ -            'V'               : ['3.1'], -            'User-Agent'      : ['Python-Twisted'], -            'Accept-Encoding' : ['gzip'] -        }), None ) - -        self.resulting_is = str() -        def received(response): -            headerlist = list(response.headers.getAllRawHeaders()) -            for item in headerlist: -                if( item[0] == "Content-Encoding"): -                    if type(item[1]) == type(list()): -                        for subitem in item[1]: -                            self.resulting_is = subitem -                    elif type(item[1]) == type(str()): -                        self.resulting_is = item[1] - -            finished = Deferred() -            response.deliverBody(PubNubResponse(finished)) -            return finished - -        def complete(data): -            if ( type(data) == type(str()) ): -                if self.resulting_is: -                    d = zlib.decompressobj(16+zlib.MAX_WBITS) - -            try     :   data = d.decompress(data) # try/catch here, pass through if except -            except  :   data = data - -            try    : obj = json.loads(data) -            except : obj = None - -            pc = PubnubCrypto() -            out = [] -            if self.cipher_key : -                if requestType == "history" : -                    if type(obj) == type(list()): -                        for item in obj: -                            if type(item) == type(list()): -                                for subitem in item: -                                    encryptItem = pc.decrypt(self.cipher_key, subitem ) -                                    out.append(encryptItem) -                            elif type(item) == type(dict()): -                                outdict = {} -                                for k, subitem in item.iteritems(): -                                    encryptItem = pc.decrypt(self.cipher_key, subitem ) -                                    outdict[k] = encryptItem -                                    out.append(outdict) -                            else : -                                encryptItem = pc.decrypt(self.cipher_key, item ) -                                out.append(encryptItem) -                        callback(out) -                    elif type( obj ) == type(dict()): -                        for k, item in obj.iteritems(): -                            encryptItem = pc.decrypt(self.cipher_key, item ) -                            out.append(encryptItem) -                        callback(out) -                else : -                    callback(obj) -            else : -                callback(obj) - -        request.addCallback(received) -        request.addBoth(complete) +            ]) for bit in request["urlcomponents"]]) +        if (request.has_key("urlparams")): +            url = url + '?' + "&".join([ x + "=" + y  for x,y in request["urlparams"].items()]) +        return url      def _request( self, request, callback, timeout=30 ) :          pass diff --git a/python-tornado/Pubnub.py b/python-tornado/Pubnub.py index e9251f8..a7d8a01 100644 --- a/python-tornado/Pubnub.py +++ b/python-tornado/Pubnub.py @@ -9,7 +9,6 @@  ## PubNub 3.1 Real-time Push Cloud API  ## -----------------------------------  import sys -sys.path.append('../')  from PubnubCoreAsync import PubnubCoreAsync  import json  import time @@ -55,24 +54,15 @@ class Pubnub(PubnubCoreAsync):              ssl_on,              origin,          )         +        self.headers['User-Agent'] = 'Python-Tornado'      def _request( self, request, callback ) : -        ## Build URL -        url = self.origin + '/' + "/".join([ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request]) +        url = self.getUrl(request)          print url          ## Send Request Expecting JSON Response          http = tornado.httpclient.AsyncHTTPClient(max_clients=1000) -        request = tornado.httpclient.HTTPRequest( url, 'GET', dict({ -            'V' : '3.1', -            'User-Agent' : 'Python-Tornado', -            'Accept-Encoding' : 'gzip' -        }) )  +        request = tornado.httpclient.HTTPRequest( url, 'GET', self.headers )           def responseCallback(response): -            print response._get_body()              callback(response._get_body())          http.fetch( diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index f7d5c52..10875dd 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -29,12 +29,13 @@ from twisted.web.client import getPage  from twisted.internet import reactor  from twisted.internet.defer import Deferred  from twisted.internet.protocol import Protocol -from twisted.web.client import Agent +from twisted.web.client import Agent, ContentDecoderAgent, RedirectAgent, GzipDecoder  from twisted.web.client import HTTPConnectionPool  from twisted.web.http_headers import Headers  from PubnubCrypto import PubnubCrypto  import gzip  import zlib +from twisted.internet.ssl import ClientContextFactory  pnconn_pool = HTTPConnectionPool(reactor)  pnconn_pool.maxPersistentPerHost    = 100 @@ -64,37 +65,57 @@ class Pubnub(PubnubCoreAsync):              origin,          )         -    def _request( self, request, callback, timeout=30 ) : +    def _request( self, request, callback ) :          global pnconn_pool          ## Build URL +        '''          url = self.origin + '/' + "/".join([              "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and                  hex(ord(ch)).replace( '0x', '%' ).upper() or                  ch for ch in list(bit)              ]) for bit in request]) - -        requestType = request[0] -        agent       = Agent( +        ''' +        url = self.getUrl(request) +        cf = WebClientContextFactory() +        agent       = ContentDecoderAgent(RedirectAgent(Agent(              reactor, -            self.ssl and None or pnconn_pool, -            connectTimeout=timeout -        ) +            contextFactory = cf, +            pool = self.ssl and None or pnconn_pool +        )), [('gzip', GzipDecoder)])          print url -        gp  = getPage( url, headers={ -            'V'               : ['3.4'], +        request     = agent.request( 'GET', url, Headers({ +            'V'               : ['3.1'],              'User-Agent'      : ['Python-Twisted'],              'Accept-Encoding' : ['gzip'] -        } ); -         -        gp.addCallback(callback) -        gp.addErrback(callback) +        }), None ) + +        def received(response): +            #print response +            finished = Deferred() +            response.deliverBody(PubNubResponse(finished)) +            return finished + +        def complete(data): +            #print data +            #try    : obj = json.loads(data) +            #except : obj = None + +            #print obj +            callback(data) + +        request.addCallback(received) +        request.addBoth(complete) + +class WebClientContextFactory(ClientContextFactory): +    def getContext(self, hostname, port): +        return ClientContextFactory.getContext(self) +class PubNubResponse(Protocol): +    def __init__( self, finished ): +        self.finished = finished -#class PubNubResponse(Protocol): -#    def __init__( self, finished ): -#        self.finished = finished -# -#    def dataReceived( self, bytes ): -#            self.finished.callback(bytes) +    def dataReceived( self, bytes ): +            #print bytes +            self.finished.callback(bytes) | 
