diff sat/plugins/plugin_misc_download.py @ 3186:84b0c8b4dee0

plugin download, aesgcm: fixed handling of HTTP errors
author Goffi <goffi@goffi.org>
date Wed, 26 Feb 2020 15:54:43 +0100
parents 9d0df638c8b4
children d92a144f3589
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_download.py	Wed Feb 26 15:54:43 2020 +0100
+++ b/sat/plugins/plugin_misc_download.py	Wed Feb 26 15:54:43 2020 +0100
@@ -169,6 +169,17 @@
         except KeyError:
             raise exceptions.NotFound(f"No callback registered for scheme {scheme!r}")
 
+    def errbackDownload(self, file_obj, download_d, resp):
+        """Set file_obj and download deferred appropriatly after a network error
+
+        @param file_obj(SatFile): file where the download must be done
+        @param download_d(Deferred): deffered which must be fired on complete download
+        @param resp(treq.response.IResponse): treq response
+        """
+        msg = f"HTTP error ({resp.code}): {resp.phrase.decode()}"
+        file_obj.close(error=msg)
+        download_d.errback(exceptions.NetworkError(msg))
+
     async def downloadHTTP(self, client, uri_parsed, dest_path, options):
         url = uri_parsed.geturl()
 
@@ -189,6 +200,10 @@
         progress_id = file_obj.uid
 
         resp = await treq.get(url, unbuffered=True)
-        d = treq.collect(resp, file_obj.write)
-        d.addBoth(lambda _: file_obj.close())
+        if resp.code == 200:
+            d = treq.collect(resp, file_obj.write)
+            d.addBoth(lambda _: file_obj.close())
+        else:
+            d = defer.Deferred()
+            self.errbackDownload(file_obj, d, resp)
         return progress_id, d