[webtools] Header fixed about User-Agent
[scilab.git] / scilab / modules / webtools / sci_gateway / cpp / sci_http_get.cpp
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2017 - ESI-Group - Cedric DELAMARRE
4 *
5 *
6 * This file is hereby licensed under the terms of the GNU GPL v2.0,
7 * pursuant to article 5.3.4 of the CeCILL v.2.1.
8 * This file was originally licensed under the terms of the CeCILL v2.1,
9 * and continues to be available under such terms.
10 * For more information, see the COPYING file which you should have received
11 * along with this program.
12 *
13 */
14 /*--------------------------------------------------------------------------*/
15
16 #include <curl/curl.h>
17 #include "webtools_gw.hxx"
18 #include "function.hxx"
19 #include "string.hxx"
20 #include "double.hxx"
21 #include "sciCurl.hxx"
22
23 extern "C"
24 {
25 #include "localization.h"
26 #include "Scierror.h"
27 #include "sciprint.h"
28 #include "sci_malloc.h"
29 #include "getFullFilename.h"
30 }
31 /*--------------------------------------------------------------------------*/
32 static const char fname[] = "http_get";
33 types::Function::ReturnValue sci_http_get(types::typed_list &in, types::optional_list &opt, int _iRetCount, types::typed_list &out)
34 {
35     SciCurl* sciCurlObj = SciCurl::getInstance();
36     CURLcode res = CURLE_OK;
37     FILE* fd = NULL;
38     types::InternalType* pOut = NULL;
39
40     if (in.size() < 1 || in.size() > 2)
41     {
42         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), fname, 1, 2);
43         return types::Function::Error;
44     }
45
46     if (_iRetCount > 2)
47     {
48         Scierror(78, _("%s: Wrong number of output argument(s): %d to %d expected.\n"), fname, 1, 2);
49         return types::Function::Error;
50     }
51
52     // get URL
53     if(in[0]->isString() == false || in[0]->getAs<types::String>()->isScalar() == false)
54     {
55         Scierror(999, _("%s: Wrong type for input argument #%d: A scalar string expected.\n"), fname, 1);
56         return types::Function::Error;
57     }
58
59     CURL* curl = curl_easy_init();
60     if(curl == nullptr)
61     {
62         Scierror(999, _("%s: CURL initialization failed.\n"), fname);
63         return types::Function::Error;
64     }
65
66     sciCurlObj->setCommonHeaders(curl);
67
68     char* pcURL = wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0));
69     curl_easy_setopt(curl, CURLOPT_URL, pcURL);
70     FREE(pcURL);
71
72     if(in.size() == 2)
73     {
74         // get output file name
75         if(in[1]->isString() == false || in[1]->getAs<types::String>()->isScalar() == false)
76         {
77             Scierror(999, _("%s: Wrong type for input argument #%d: A scalar string expected.\n"), fname, 2);
78             return types::Function::Error;
79         }
80
81         wchar_t* pwcFileName = getFullFilenameW(in[1]->getAs<types::String>()->get(0));
82         char* pcFileName = wide_string_to_UTF8(pwcFileName);
83
84         fd = fopen(pcFileName, "wb");
85         FREE(pcFileName);
86         if(fd == NULL)
87         {
88             Scierror(999, _("%s: Wrong value for input argument #%d: The given path does not exist.\n"), fname, 2);
89             FREE(pwcFileName);
90             return types::Function::Error;
91         }
92
93         sciCurlObj->getResultAsFile(curl, fd);
94
95         pOut = new types::String(pwcFileName);
96         FREE(pwcFileName);
97     }
98     else
99     {
100         sciCurlObj->getResultAsObject(curl);
101     }
102
103     // common optional argument
104     if(checkCommonOpt((void*)curl, opt, fname))
105     {
106         return types::Function::Error;
107     }
108
109     // set proxy information
110     if(sciCurlObj->setProxy(curl))
111     {
112         Scierror(999, _("%s: Wrong proxy information, please check in the 'internet' Scilab preference.\n"), fname);
113         return types::Function::Error;
114     }
115
116     res = curl_easy_perform(curl);
117     if(res != CURLE_OK)
118     {
119         Scierror(999, _("%s: CURL execution failed.\n%s\n"), fname, curl_easy_strerror(res));
120         sciCurlObj->clear();
121         if(fd)
122         {
123             fclose(fd);
124         }
125         return types::Function::Error;
126     }
127
128     if(in.size() == 2)
129     {
130         fclose(fd);
131         sciCurlObj->clear();
132     }
133     else
134     {
135         pOut = sciCurlObj->getResult();
136     }
137
138     out.push_back(pOut);
139
140     if(_iRetCount == 2)
141     {
142         long http_code = 0;
143         curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
144         out.push_back(new types::Double((double)http_code));
145     }
146
147     curl_easy_cleanup(curl);
148     return types::Function::OK;
149 }