cb7601d4a740d5abc8f1cb61081c8ad9d3f39285
[scilab.git] / scilab / modules / webtools / src / cpp / sciCurl.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *
4 * Copyright (C) 2017 - ESI-Group - Cedric Delamarre
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 #include <stdio.h>
15 #include "sciCurl.hxx"
16 #include "string.hxx"
17 #include "json.hxx"
18
19 extern "C"
20 {
21     #include "getScilabPreference.h"
22     #include "freeArrayOfString.h"
23 }
24
25 SciCurl* SciCurl::me = nullptr;
26 std::string SciCurl::data;
27 bool SciCurl::useFile = false;
28
29 SciCurl* SciCurl::getInstance(void)
30 {
31     if(me == nullptr)
32     {
33         me = new SciCurl();
34     }
35
36     return me;
37 }
38
39 void SciCurl::destroyInstance(void)
40 {
41     if (me)
42     {
43         delete me;
44         me = nullptr;
45     }
46 }
47
48 SciCurl::SciCurl()
49 {
50     curl_global_init(CURL_GLOBAL_ALL);
51 }
52
53 SciCurl::~SciCurl()
54 {
55     curl_global_cleanup();
56 }
57
58 void SciCurl::getResultAsObject(CURL* curl)
59 {
60     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, SciCurl::write_result);
61     useFile = false;
62 }
63
64 void SciCurl::getResultAsFile(CURL* curl, FILE* fd)
65 {
66 #ifdef _MSC_VER
67     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, SciCurl::write_result);
68     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd);
69     useFile = true;
70 #else
71     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
72     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd);
73 #endif
74 }
75
76 types::InternalType* SciCurl::getResult()
77 {
78     types::InternalType* res = fromJSON(data);
79     if (res == nullptr)
80     {
81         res = new types::String(data.c_str());
82     }
83
84     clear();
85
86     return res;
87 }
88
89 void SciCurl::clear()
90 {
91     data.clear();
92 }
93
94 int SciCurl::write_result(char* pcInput, size_t size, size_t nmemb, void* output)
95 {
96 #ifdef _MSC_VER
97     if(useFile)
98     {
99         FILE* fd = (FILE*)output;
100         fwrite(pcInput, size, nmemb, fd);
101         return static_cast<int>(size*nmemb);
102     }
103 #endif
104
105     std::string d(pcInput, size * nmemb);
106     data += d;
107     return static_cast<int>(size*nmemb);
108 }
109
110 // Proxy is configured in scilab preferences (internet tab)
111 int SciCurl::setProxy(CURL* curl)
112 {
113     char* proxyUserPwd = NULL;
114     const char* attrs[] = {"enabled", "host", "port", "user", "password"};
115     const unsigned int N = sizeof(attrs) / sizeof(char*);
116     char** values = getPrefAttributesValues("//web/body/proxy", attrs, N);
117
118     if (values == NULL)
119     {
120         // no proxy configured
121         return 0;
122     }
123
124     // proxy is configured and not enabled
125     if (stricmp(values[0]/*enabled*/, "false") == 0)
126     {
127         freeArrayOfString(values, N);
128         return 0;
129     }
130
131     const unsigned int host_len = (const unsigned int)strlen(values[1]);
132     const unsigned int port_len = (const unsigned int)strlen(values[2]);
133     const unsigned int user_len = (const unsigned int)strlen(values[3]);
134     const unsigned int pwd_len  = (const unsigned int)strlen(values[4]);
135
136     if(host_len == 0 || port_len == 0 || user_len == 0)
137     {
138         freeArrayOfString(values, N);
139         return 1;
140     }
141
142     if (pwd_len == 0)
143     {
144         proxyUserPwd = values[3]; //user
145     }
146     else
147     {
148         proxyUserPwd = (char *)MALLOC((user_len + 1 + pwd_len + 1) * sizeof(char));
149         sprintf(proxyUserPwd, "%s:%s", values[3]/*user*/, values[4]/*password*/);
150         proxyUserPwd[user_len + 1 + pwd_len] = '\0';
151     }
152
153     // set cURL options
154     if(curl_easy_setopt(curl, CURLOPT_PROXY, values[1]) != CURLE_OK) //host
155     {
156         FREE(proxyUserPwd);
157         freeArrayOfString(values, N);
158         return 1;
159     }
160
161     if(curl_easy_setopt(curl, CURLOPT_PROXYPORT, strtol(values[2], NULL, 10)) != CURLE_OK) //port
162     {
163         FREE(proxyUserPwd);
164         freeArrayOfString(values, N);
165         return 1;
166     }
167
168     if(curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxyUserPwd) != CURLE_OK) //port
169     {
170         FREE(proxyUserPwd);
171         freeArrayOfString(values, N);
172         return 1;
173     }
174
175     FREE(proxyUserPwd);
176     freeArrayOfString(values, N);
177     return 0;
178 }