Remove httpclient.py and rely on twisted-web
authorMoritz Venn <ritzmo@users.schwerkraft.elitedvb.net>
Sat, 8 Sep 2007 18:50:37 +0000 (18:50 +0000)
committerMoritz Venn <ritzmo@users.schwerkraft.elitedvb.net>
Sat, 8 Sep 2007 18:50:37 +0000 (18:50 +0000)
simplerss/CONTROL/control
simplerss/src/RSSFeed.py
simplerss/src/RSSPoller.py
simplerss/src/RSSScreens.py
simplerss/src/httpclient.py [deleted file]

index 4ce7232..bac0727 100644 (file)
@@ -1,9 +1,9 @@
 Package: enigma2-plugin-extensions-simplerss
-Version: 0.5-20070813-r0
+Version: 0.6-20070813-r0
 Description: rss viewer for the enigma2 gui
 Architecture: mipsel
 Section: extra
 Priority: optional
 Maintainer: Moritz Venn <moritz.venn@freaque.net>
-Depends: enigma2(>1.0cvs20060516)
+Depends: enigma2(>1.0cvs20070908), twisted-web
 Source: http://schwerkraft.elitedvb.net/scm/?group_id=11
index 1c2369c..d9ddc97 100644 (file)
@@ -1,7 +1,5 @@
 from sets import Set
 
-from urlparse import urlsplit
-
 class BaseFeed:
        """Base-class for all Feeds. Initializes needed Elements."""
        MAX_HISTORY_ELEMENTS = 100
@@ -10,13 +8,6 @@ class BaseFeed:
                # Set URI (used as Identifier)
                self.uri = uri
 
-               # Determine URI Elements
-               remote = urlsplit(uri)
-               self.hostname = remote.hostname
-               self.port = remote.port or 80
-               self.path = '?'.join([remote.path, remote.query])
-               print "[SimpleRSS] determined hostname:", self.hostname, ", port:", self.port, ", path:", self.path
-
                # Set Autoupdate
                self.autoupdate = autoupdate
 
@@ -206,4 +197,4 @@ class UniversalFeed(BaseFeed, RSSFeed, AtomFeed):
                        return RSSFeed.gotDom(self, dom)
                elif self.type == "atom":
                        print "[SimpleRSS] type is atom"
-                       return AtomFeed.gotDom(self, dom)
\ No newline at end of file
+                       return AtomFeed.gotDom(self, dom)
index a78274a..2781983 100644 (file)
@@ -6,7 +6,7 @@ from RSSScreens import RSSFeedView
 from TagStrip import TagStrip
 from RSSFeed import UniversalFeed
 
-from httpclient import getPage
+from twisted.web.client import getPage
 from xml.dom.minidom import parseString as minidom_parseString
 
 class RSSPoller:
@@ -123,13 +123,7 @@ class RSSPoller:
 
        def singlePoll(self, id, callback = False, errorback = None):
                from Tools.BoundFunction import boundFunction
-               getPage(
-                       self.feeds[id].hostname,
-                       self.feeds[id].port,
-                       self.feeds[id].path,
-                       callback=boundFunction(self._gotSinglePage, id, callback, errorback),
-                       errorback=errorback
-               )
+               getPage(self.feeds[id].uri).addCallback(callback=boundFunction(self._gotSinglePage, id, callback, errorback)).addErrback(errorback)
 
        def poll(self):
                # Reloading, reschedule
@@ -159,13 +153,7 @@ class RSSPoller:
                        # Feed supposed to autoupdate
                        feed = self.feeds[self.current_feed]
                        if feed.autoupdate:
-                               getPage(
-                                       feed.hostname,
-                                       feed.port,
-                                       feed.path,
-                                       callback=self._gotPage,
-                                       errorback=self.error
-                               )
+                               getPage(feed.uri).addCallback(self._gotPage).addErrback(self.error)
                        # Go to next feed
                        else:
                                print "[SimpleRSS] passing feed"
index c0378e0..45b9582 100644 (file)
@@ -38,8 +38,8 @@ class PictureView(Screen):
 
        def fetchFile(self):
                # Fetch file
-               from httpclient import getFile
-               getFile(self.filename, self.url, callback=self.gotFile, errorback=self.error)
+               from twisted.web.client import downloadPage
+               downloadPage(self.url, self.filename).addCallback(self.gotFile).addErrback(self.error)
 
        def gotFile(self, data = ""):
                # Determine Aspect
diff --git a/simplerss/src/httpclient.py b/simplerss/src/httpclient.py
deleted file mode 100644 (file)
index 22e7fbf..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-from twisted.internet.protocol import ClientFactory
-from twisted.web2.client.http import HTTPClientProtocol
-from twisted.internet import reactor, error
-from urlparse import urlsplit
-from socket import gethostbyname
-from urllib import urlencode as urllib_urlencode, quote_plus as urllib_quote_plus
-
-global HTTPCLIENT_requestCount
-HTTPCLIENT_requestCount = 0 # counts requests
-    
-class Enigma2HTTPRequest:
-        
-    def __init__(self,hostname,path,port,method="GET",headerfields={}):
-        self.hostname=hostname
-        self.port=port
-        self.path=path
-        self.method=method
-        self.headerfields = headerfields
-        self.onRequestFinished = []
-        self.onRequestError = []
-        self.onHeaderLoaded = []
-        
-        self.data=""
-        self.readsize = 0
-        self.headers= {}
-        
-    def _DataRecived(self,data):
-        self.readsize += len(data)
-        self.data += data
-            
-    def getIPAdress(self):
-        """    
-            socket.gethostbyname() is syncron
-            Enigma2 is blocked while process is running    
-        """
-        try:
-            return gethostbyname(self.hostname)
-        except:
-            return False
-        
-    def HeaderLoaded(self,headers):
-        self.headers = headers
-        for i in self.onHeaderLoaded:
-            if i is not None:
-                i(headers)
-        self.onHeaderLoaded=[]
-        
-    def RequestError(self,error):
-        for i in self.onRequestError:
-            if i is not None:
-                i(error)
-        self.onRequestError = []
-        
-    def RequestFinished(self,data):
-        for i in self.onRequestFinished:
-            if i is not None:
-                i(data)
-       
-class Enigma2URLHTTPRequest(Enigma2HTTPRequest):
-    def __init__(self,url,method="GET",headerfields={}):
-        x= urlsplit(url)
-        if x[1].rfind(":")>0:
-            y = x[1].split(":")
-            hostname = y[0]
-            port = int(y[1])
-        else:
-            hostname = x[1]
-            port = 80
-        path=x[2]
-        Enigma2HTTPRequest.__init__(self,hostname,path,port,method=method,headerfields=headerfields)
-
-class Enigma2FileHTTPRequest(Enigma2URLHTTPRequest):
-    def __init__(self,targetfile,url,method="GET",headerfields={}):
-        Enigma2URLHTTPRequest.__init__(self,url,method=method,headerfields=headerfields)
-        self.filehandle = open(targetfile,"w")
-        self.onRequestFinished.append(self.close)
-        self.onRequestError.append(self.close)
-    def close(self,dummy):
-        self.filehandle.close()
-    
-    def _DataRecived(self,data):
-        self.readsize += len(data)
-        self.filehandle.write(data)
-        
-            
-        
-        
-class Enigma2HTTPProtocol(HTTPClientProtocol):
-    DEBUG = False
-    
-    def __init__(self,request,requestCount):
-        self.request = request
-        self.requestCount = requestCount
-        self.headers={}
-        self.headerread=False
-        self.responseFirstLine = True # to indikate, that first line of responseheader was read
-        HTTPClientProtocol.__init__(self)
-        self.setRawMode()
-        
-    def rawDataReceived(self,line):
-        for l in line.split(self.delimiter): 
-            if self.headerread:
-                self.request._DataRecived(l)
-            else:
-                if self.DEBUG:
-                    print "HTTP "+self.requestCount+" <<==",l
-                if l == "":
-                    self.headerread = True
-                    self.request.HeaderLoaded(self.headers)
-                else:
-                    self.parseHeaderLine(l)
-    
-    def parseHeaderLine(self,line):
-        if self.responseFirstLine is  True:
-            #print "parseHeaderLine",line.split(" ")
-            fields = line.split(" ")
-            protocoll = fields[0]
-            responsecode  = fields[1]
-            statuscode = " ".join(fields[2:])
-            self.headers["protocoll"] = protocoll
-            self.headers["responsecode"] = responsecode
-            self.headers["statuscode"] = statuscode
-            self.responseFirstLine = False
-        elif line.rfind(":"):
-            x = line.split(":")
-            key = x[0].lstrip().rstrip().lower()
-            var = ":".join(x[1:]).lstrip()
-            self.headers[key] = var        
-        else:
-            print "unknown headerline",line
-
-    def connectionMade(self):
-        if self.request.method == "POST":
-            (path,params ) = self.request.path.split("?")
-        elif self.request.method == "GET":
-            path = self.request.path
-        self.sendLine("%s %s HTTP/1.0"%(self.request.method,path))
-        self.sendLine("Host: %s"%self.request.hostname)
-        for i in self.request.headerfields:
-            self.sendLine(i+": "+self.request.headerfields[i])
-        if self.request.method == "POST":
-            self.sendLine("Content-Type: application/x-www-form-urlencoded")
-            self.sendLine("Content-Length: "+str(len(params)))
-        
-        self.sendLine("")
-        if self.request.method == "POST":
-            self.sendLine(params)
-    
-    def sendLine(self,data):
-        if self.DEBUG:
-            print "HTTP "+self.requestCount+" ==>>",data
-        HTTPClientProtocol.sendLine(self,data)
-        
-class Enigma2HTTPClientFactory(ClientFactory):
-
-    initialDelay = 20
-    maxDelay = 500
-    def __init__(self,request):
-        self.hangup_ok = False
-        self.request = request
-       
-    def startedConnecting(self, connector):
-        pass
-    
-    def buildProtocol(self, addr):
-        global HTTPCLIENT_requestCount
-        HTTPCLIENT_requestCount = HTTPCLIENT_requestCount + 1
-        return Enigma2HTTPProtocol(self.request,str(HTTPCLIENT_requestCount))
-
-    def clientConnectionLost(self, connector, reason):
-        if not self.hangup_ok:
-            self.request.RequestFinished(self.request.data)
-        ClientFactory.clientConnectionLost(self, connector, reason)
-        
-    def clientConnectionFailed(self, connector, reason):
-        self.request.RequestError(reason.getErrorMessage())
-        ClientFactory.clientConnectionFailed(self, connector, reason)
-
-def urlencode(dict):
-       return urllib_urlencode(dict)
-       
-def quote_plus(data):
-       return urllib_quote_plus(data)
-
-def getURL(url,callback=None,errorback=None,headercallback=None,method="GET",headers={}):
-    """ 
-        this will is called with a url
-        url = http://www.hostna.me/somewhere/on/the/server <string>
-    """
-    req = Enigma2URLHTTPRequest(url,method=method,headerfields=headers)
-    req.onRequestError.append(errorback)
-    req.onHeaderLoaded.append(headercallback)
-    req.onRequestFinished.append(callback)
-    ipadress = req.getIPAdress()
-    if ipadress is not False:
-        reactor.connectTCP(ipadress,req.port, Enigma2HTTPClientFactory(req))
-        return req
-    else:
-        if errorback is not None:
-            errorback("Error while resolve Hostname")
-
-def getPage(hostname,port,path,method="GET",callback=None,errorback=None,headercallback=None,headers={}):
-    """ 
-        this will is called with separte hostname,port,path
-        hostname = www.hostna.me <string>
-        port = 80 <int>
-        path= /somewhere/on/the/server <string>
-    """
-    req = Enigma2HTTPRequest(hostname,path,port,method=method,headerfields=headers)
-    req.onRequestError.append(errorback)
-    req.onRequestFinished.append(callback)
-    ipadress = req.getIPAdress()
-    if ipadress is not False:
-        reactor.connectTCP(ipadress,req.port, Enigma2HTTPClientFactory(req))
-        return req
-    else:
-        if errorback is not None:
-            errorback("Error while resolve Hostname")
-
-def getFile(filename,url,method="GET",callback=None,errorback=None,headercallback=None,headers={}):
-    """ 
-        this will is called with a url and a target file
-        fimename = /tmp/target.jpg 
-        url = http://www.hostna.me/somewhere/on/the/server.jpg <string>
-    """
-    req = Enigma2FileHTTPRequest(filename,url,method=method,headerfields=headers)
-    req.onRequestError.append(errorback)
-    req.onHeaderLoaded.append(headercallback)
-    req.onRequestFinished.append(callback)
-    ipadress = req.getIPAdress()
-    if ipadress is not False:
-        reactor.connectTCP(ipadress,req.port, Enigma2HTTPClientFactory(req))
-        return req
-    else:
-        if errorback is not None:
-            errorback("Error while resolve Hostname")
-