[atoms] add http_get as a failsafe downloading method 30/21630/10
mottelet [Fri, 27 Nov 2020 08:36:43 +0000 (09:36 +0100)]
Under new macOS 11.0 neither curl or wget seem to work when
invoked via unix_w (network entitlement problem). The idea is to
propose http_get as a failsafe method for all platforms.

Change-Id: Ibdc9c9eb9f8e0c1bc334003bb68cf42f220494b5

scilab/CHANGES.md
scilab/modules/atoms/help/en_US/atomsSetConfig.xml
scilab/modules/atoms/macros/atoms_internals/atomsDownload.sci

index 7b1f48b..506007d 100644 (file)
@@ -28,6 +28,7 @@ For a high-level description of the main new features of this release, please co
 
 In summary, the main new features are:
 * Webtools utilities added for HTTP protocol, JSON data usage
+   - http_get can be used as an alternative download method for ATOMS
 * Profiled values are available as Scilab values
 * Values have a cleaner display:
    - they are displayed in order on assignment
index 0bb0b8f..8ec5a12 100644 (file)
                 <tr>
                     <td>downloadTool</td>
                     <td>Set tool used to download</td>
-                    <td>"curl", "wget" or "httpdownload" (Windows only)</td>
+                    <td>"curl", "wget", "http_get" or "httpdownload" (Windows only)</td>
                 </tr>
                 <tr>
                     <td>downloadTimeout</td>
index 2e40d3e..4b6e5ee 100644 (file)
@@ -72,6 +72,7 @@ function atomsDownload(url_in,file_out,md5sum)
 
     CURL     = %F;
     WGET     = %F;
+    HTTP_GET = %F;
     HTTPDOWNLOAD = %F;
 
     // Maybe the detection has already been done
@@ -80,6 +81,8 @@ function atomsDownload(url_in,file_out,md5sum)
         WGET = %T;
     elseif atomsGetConfig("downloadTool") == "curl" then
         CURL = %T;
+    elseif atomsGetConfig("downloadTool") == "http_get" then
+        HTTP_GET = %T;
     elseif atomsGetConfig("downloadTool") == "httpdownload" & getos() == "Windows" then
         HTTPDOWNLOAD = %T;
     else
@@ -199,22 +202,55 @@ function atomsDownload(url_in,file_out,md5sum)
             // Save the parameter to always download with httpdownload
             if stat == 0 then
                 atomsSetConfig("downloadTool","httpdownload");
-            else
-                select stat,
-                case -1 then mprintf(gettext("%s: Error: the response status from the URL %s is invalid.\n"), "atomsDownload", url_in),
-                case -2 then mprintf(gettext("%s: Error while opening an Internet connection.\n"), "atomsDownload"),
-                case -3 then mprintf(gettext("%s: Error while opening the URL %s.\n"), "atomsDownload", url_in),
-                case -4 then mprintf(gettext("%s: Error while creating the file %s on disk.\n"), "atomsDownload", file_out),
-                case -5 then mprintf(gettext("%s: Error while retrieving the size of file at URL %s.\n"), "atomsDownload", url_in),
-                case -6 then mprintf(gettext("%s: Error while reading the file from the URL %s.\n"), "atomsDownload", url_in),
-                case -7 then mprintf(gettext("%s: Error while writing the file %s on disk.\n"), "atomsDownload", file_out),
-                case -8 then mprintf(gettext("%s: Error while downloading the file from the URL %s.\n"), "atomsDownload", url_in),
-                case -9 then mprintf(gettext("%s: Error: out of memory.\n"), "atomsDownload"),
+            end
+        end
+
+        if (HTTP_GET | stat<>0) then
+            try
+                [res,http_status] = http_get(url_in,file_out);
+                select http_status
+                case 200 then
+                    stat = 0;
+                else
+                    stat = -1;
+                end
+            catch
+                error_message = lasterror();
+                select error_message($);
+                case _("Couldn''t resolve host name") then
+                    stat = -2;
+                case msprintf(_("%s: Wrong value for input argument #%d: The given path does not exist.\n"),"http_get",2) then
+                    stat = -7;
                 end
             end
+
+            // Save the parameter to always download with http_get
+            if stat == 0 then
+                atomsSetConfig("downloadTool","http_get");
+            end
         end
 
         if stat <> 0 then
+            select stat,
+            case -1 then
+                mprintf(gettext("%s: Error: the response status from the URL %s is invalid.\n"), "atomsDownload", url_in),
+            case -2 then
+                mprintf(gettext("%s: Error while opening an Internet connection.\n"), "atomsDownload"),
+            case -3 then
+                mprintf(gettext("%s: Error while opening the URL %s.\n"), "atomsDownload", url_in),
+            case -4 then
+                mprintf(gettext("%s: Error while creating the file %s on disk.\n"), "atomsDownload", file_out),
+            case -5 then
+                mprintf(gettext("%s: Error while retrieving the size of file at URL %s.\n"), "atomsDownload", url_in),
+            case -6 then
+                mprintf(gettext("%s: Error while reading the file from the URL %s.\n"), "atomsDownload", url_in),
+            case -7 then
+                mprintf(gettext("%s: Error while writing the file %s on disk.\n"), "atomsDownload", file_out),
+            case -8 then
+                mprintf(gettext("%s: Error while downloading the file from the URL %s.\n"), "atomsDownload", url_in),
+            case -9 then
+                mprintf(gettext("%s: Error: out of memory.\n"), "atomsDownload"),
+            end
             mprintf(gettext("%s: The following file hasn''t been downloaded:\n"), "atomsDownload");
             mprintf(gettext("\t - URL      : ''%s''\n"), url_in);
             mprintf(gettext("\t - Local location : ''%s''\n"), file_out);