add Enigma2FileHTTPRequest
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 15 Apr 2007 15:21:58 +0000 (15:21 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sun, 15 Apr 2007 15:21:58 +0000 (15:21 +0000)
lastfm/src/httpclient.py

index fa33ad7..91ac1c4 100755 (executable)
@@ -19,7 +19,13 @@ class Enigma2HTTPRequest:
         self.onHeaderLoaded = []\r
         \r
         self.data=""\r
+        self.readsize = 0\r
+        self.headers= {}\r
         \r
+    def _DataRecived(self,data):\r
+        self.readsize += len(data)\r
+        self.data += data\r
+            \r
     def getIPAdress(self):\r
         """    \r
             socket.gethostbyname() is syncron\r
@@ -30,17 +36,20 @@ class Enigma2HTTPRequest:
     def HeaderLoaded(self,headers):\r
         self.headers = headers\r
         for i in self.onHeaderLoaded:\r
-            i(headers)\r
+            if i is not None:\r
+                i(headers)\r
         self.onHeaderLoaded=[]\r
         \r
     def RequestError(self,error):\r
         for i in self.onRequestError:\r
-            i(error)\r
+            if i is not None:\r
+                i(error)\r
         self.onRequestError = []\r
         \r
     def RequestFinished(self,data):\r
         for i in self.onRequestFinished:\r
-            i(data)\r
+            if i is not None:\r
+                i(data)\r
        \r
 class Enigma2URLHTTPRequest(Enigma2HTTPRequest):\r
     def __init__(self,url,method="GET",headerfields={}):\r
@@ -54,21 +63,37 @@ class Enigma2URLHTTPRequest(Enigma2HTTPRequest):
             port = 80\r
         path=x[2]\r
         Enigma2HTTPRequest.__init__(self,hostname,path,port,method=method,headerfields=headerfields)\r
+\r
+class Enigma2FileHTTPRequest(Enigma2URLHTTPRequest):\r
+    def __init__(self,targetfile,url,method="GET",headerfields={}):\r
+        Enigma2URLHTTPRequest.__init__(self,url,method=method,headerfields=headerfields)\r
+        self.filehandle = open(targetfile,"w")\r
+        self.onRequestFinished.append(self.close)\r
+        self.onRequestError.append(self.close)\r
+    def close(self,dummy):\r
+        self.filehandle.close()\r
     \r
+    def _DataRecived(self,data):\r
+        self.readsize += len(data)\r
+        self.filehandle.write(data)\r
+        \r
+            \r
+        \r
+        \r
 class Enigma2HTTPProtocol(HTTPClientProtocol):\r
-    headers={}\r
-    headerread=False\r
-    responseFirstLine = True # to indikate, that first line of responseheader was read\r
 \r
     def __init__(self,request):\r
         self.request = request\r
+        self.headers={}\r
+        self.headerread=False\r
+        self.responseFirstLine = True # to indikate, that first line of responseheader was read\r
         HTTPClientProtocol.__init__(self)\r
         self.setRawMode()\r
         \r
     def rawDataReceived(self,line):\r
         for l in line.split(self.delimiter): \r
             if self.headerread:\r
-                self.request.data +=l\r
+                self.request._DataRecived(l)\r
             else:\r
                 if l == "":\r
                     self.headerread = True\r
@@ -131,20 +156,23 @@ def getURL(url,callback=None,errorback=None,headercallback=None,method="GET",hea
     """\r
     req = Enigma2URLHTTPRequest(url,method=method,headerfields=headers)\r
     req.onRequestError.append(errorback)\r
+    req.onHeaderLoaded.append(headercallback)\r
     req.onRequestFinished.append(callback)\r
     reactor.connectTCP(req.getIPAdress(),req.port, Enigma2HTTPClientFactory(req))\r
+    return req\r
 \r
-def getPage(hostname,port,path,method="GET",callback=None,errorback=None):#,headercallback=None,headers={}):\r
+def getPage(hostname,port,path,method="GET",callback=None,errorback=None,headercallback=None,headers={}):\r
     """ \r
         this will is called with separte hostname,port,path\r
         hostname = www.hostna.me <string>\r
         port = 80 <int>\r
         path= /somewhere/on/the/server <string>\r
     """\r
-    req = Enigma2HTTPRequest(hostname,path,port,method=method)#,headerfields=headers)\r
+    req = Enigma2HTTPRequest(hostname,path,port,method=method,headerfields=headers)\r
     req.onRequestError.append(errorback)\r
     req.onRequestFinished.append(callback)\r
     reactor.connectTCP(req.getIPAdress(),req.port, Enigma2HTTPClientFactory(req))\r
+    return req\r
 \r
 def getFile(filename,url,method="GET",callback=None,errorback=None,headercallback=None,headers={}):\r
     """ \r
@@ -152,14 +180,9 @@ def getFile(filename,url,method="GET",callback=None,errorback=None,headercallbac
         fimename = /tmp/target.jpg \r
         url = http://www.hostna.me/somewhere/on/the/server.jpg <string>\r
     """\r
-    def save(data):\r
-        try:\r
-            fp = open(filename,"w")\r
-            fp.write(data)\r
-            fp.close()\r
-            if callback is not None:\r
-                callback()\r
-        except Exception,e:\r
-            if errorback is not None:\r
-                errorback(e)\r
-    getURL(url,method=method,callback=save,errorback=errorback,headercallback=headercallback,headers=headers)\r
+    req = Enigma2FileHTTPRequest(filename,url,method=method,headerfields=headers)\r
+    req.onRequestError.append(errorback)\r
+    req.onHeaderLoaded.append(headercallback)\r
+    req.onRequestFinished.append(callback)\r
+    reactor.connectTCP(req.getIPAdress(),req.port, Enigma2HTTPClientFactory(req))\r
+    return req\r