1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 2006-2021 The Octave Project Developers
4 //
5 // See the file COPYRIGHT.md in the top-level directory of this
6 // distribution or <https://octave.org/copyright/>.
7 //
8 // This file is part of Octave.
9 //
10 // Octave is free software: you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // Octave is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with Octave; see the file COPYING.  If not, see
22 // <https://www.gnu.org/licenses/>.
23 //
24 ////////////////////////////////////////////////////////////////////////
25 
26 #if ! defined (octave_url_transfer_h)
27 #define octave_url_transfer_h 1
28 
29 #include "octave-config.h"
30 
31 #include <istream>
32 #include <memory>
33 #include <ostream>
34 #include <string>
35 
36 #include "str-vec.h"
37 
38 template <typename T> class Array;
39 
40 namespace octave
41 {
42   struct weboptions
43   {
44     std::string UserAgent;
45     long Timeout;
46     std::string Username;
47     std::string Password;
48     Array<std::string> HeaderFields;
49     std::string ContentReader;
50     std::string RequestMethod;
51     std::string ArrayFormat;
52     std::string CertificateFilename;
53   };
54 
55   class
56   OCTAVE_API
57   base_url_transfer
58   {
59   private:
60 
61     static void delete_file (const std::string& file);
62 
reset_path(base_url_transfer * curl_xfer)63     static void reset_path (base_url_transfer *curl_xfer)
64     {
65       curl_xfer->cwd ("..");
66     }
67 
68   public:
69 
70     friend class url_transfer;
71 
72     base_url_transfer (void);
73 
74     base_url_transfer (const std::string& host,
75                        const std::string& /* user_arg */,
76                        const std::string& /* passwd */,
77                        std::ostream& os);
78 
79     base_url_transfer (const std::string& url, std::ostream& os);
80 
81     // No copying!
82 
83     base_url_transfer (const base_url_transfer&) = delete;
84 
85     base_url_transfer& operator = (const base_url_transfer&) = delete;
86 
87     virtual ~base_url_transfer (void) = default;
88 
is_valid(void)89     bool is_valid (void) const { return m_valid; }
90 
good(void)91     bool good (void) const { return m_valid && m_ok; }
92 
perform(void)93     virtual void perform (void) { }
94 
lasterror(void)95     virtual std::string lasterror (void) const { return m_errmsg; }
96 
set_ostream(std::ostream &)97     virtual std::ostream& set_ostream (std::ostream& /* os */)
98     {
99       return *m_curr_ostream;
100     }
101 
set_istream(std::istream &)102     virtual std::istream& set_istream (std::istream& /* is */)
103     {
104       return *m_curr_istream;
105     }
106 
ascii(void)107     virtual void ascii (void) { }
108 
binary(void)109     virtual void binary (void) { }
110 
is_ascii(void)111     bool is_ascii (void) const { return m_ascii_mode; }
112 
is_binary(void)113     bool is_binary (void) const { return ! m_ascii_mode; }
114 
cwd(const std::string &)115     virtual void cwd (const std::string& /* path */) { }
116 
del(const std::string &)117     virtual void del (const std::string& /* file */) { }
118 
rmdir(const std::string &)119     virtual void rmdir (const std::string& /* path */) { }
120 
mkdir(const std::string &)121     virtual void mkdir (const std::string& /* path */) { }
122 
rename(const std::string &,const std::string &)123     virtual void rename (const std::string& /* oldname */,
124                          const std::string& /* newname */) { }
125 
put(const std::string &,std::istream &)126     virtual void put (const std::string& /* file */,
127                       std::istream& /* is */) { }
128 
get(const std::string &,std::ostream &)129     virtual void get (const std::string& /* file */,
130                       std::ostream& /* os */) { }
131 
132     void mget_directory (const std::string& directory,
133                          const std::string& target);
134 
135     string_vector mput_directory (const std::string& base,
136                                   const std::string& directory);
137 
dir(void)138     virtual void dir (void) { }
139 
list(void)140     virtual string_vector list (void) { return string_vector (); }
141 
get_fileinfo(const std::string &,double &,time_t &,bool &)142     virtual void get_fileinfo (const std::string& /* filename */,
143                                double& /* filesize */,
144                                time_t& /* filetime */,
145                                bool& /* fileisdir */) { }
146 
pwd(void)147     virtual std::string pwd (void) { return ""; }
148 
http_get(const Array<std::string> &)149     virtual void http_get (const Array<std::string>& /* param */) { }
150 
http_post(const Array<std::string> &)151     virtual void http_post (const Array<std::string>& /* param */) { }
152 
http_action(const Array<std::string> &,const std::string &)153     virtual void http_action (const Array<std::string>& /* param */,
154                               const std::string& /* action */) { }
155 
cookie_jar(const std::string &)156     virtual void cookie_jar (const std::string& /* filename */) { }
157 
set_header_fields(const Array<std::string> &)158     virtual void set_header_fields (const Array<std::string>& /* param */) { }
159 
form_data_post(const Array<std::string> &)160     virtual void form_data_post (const Array<std::string>& /* param */) { }
161 
set_weboptions(const struct weboptions &)162     virtual void set_weboptions (const struct weboptions& /* param */) { }
163 
164   protected:
165 
166     // Host for ftp transfers or full URL for http requests.
167     std::string m_host_or_url;
168     bool m_valid;
169     bool m_ftp;
170     bool m_ascii_mode;
171     bool m_ok;
172     std::string m_errmsg;
173     std::istream *m_curr_istream;
174     std::ostream *m_curr_ostream;
175   };
176 
177   class
178   OCTAVE_API
179   url_transfer
180   {
181   public:
182 
183     url_transfer (void);
184 
185     url_transfer (const std::string& host, const std::string& user,
186                   const std::string& passwd, std::ostream& os);
187 
188     url_transfer (const std::string& url, std::ostream& os);
189 
190     url_transfer (const url_transfer&) = default;
191 
192     url_transfer& operator = (const url_transfer&) = default;
193 
194     ~url_transfer (void) = default;
195 
is_valid(void)196     bool is_valid (void) const { return m_rep->is_valid (); }
197 
good(void)198     bool good (void) const { return m_rep->good (); }
199 
lasterror(void)200     std::string lasterror (void) const { return m_rep->lasterror (); }
201 
set_ostream(std::ostream & os)202     std::ostream& set_ostream (std::ostream& os)
203     {
204       return m_rep->set_ostream (os);
205     }
206 
set_istream(std::istream & is)207     std::istream& set_istream (std::istream& is)
208     {
209       return m_rep->set_istream (is);
210     }
211 
ascii(void)212     void ascii (void) { m_rep->ascii (); }
213 
binary(void)214     void binary (void) { m_rep->binary (); }
215 
is_ascii(void)216     bool is_ascii (void) const { return m_rep->is_ascii (); }
217 
is_binary(void)218     bool is_binary (void) const { return m_rep->is_binary (); }
219 
cwd(const std::string & path)220     void cwd (const std::string& path) { m_rep->cwd (path); }
221 
del(const std::string & file)222     void del (const std::string& file) { m_rep->del (file); }
223 
rmdir(const std::string & path)224     void rmdir (const std::string& path) { m_rep->rmdir (path); }
225 
mkdir(const std::string & path)226     void mkdir (const std::string& path) { m_rep->mkdir (path); }
227 
rename(const std::string & oldname,const std::string & newname)228     void rename (const std::string& oldname, const std::string& newname)
229     {
230       m_rep->rename (oldname, newname);
231     }
232 
put(const std::string & file,std::istream & is)233     void put (const std::string& file, std::istream& is)
234     {
235       m_rep->put (file, is);
236     }
237 
get(const std::string & file,std::ostream & os)238     void get (const std::string& file, std::ostream& os)
239     {
240       m_rep->get (file, os);
241     }
242 
mget_directory(const std::string & directory,const std::string & target)243     void mget_directory (const std::string& directory,
244                          const std::string& target)
245     {
246       m_rep->mget_directory (directory, target);
247     }
248 
mput_directory(const std::string & base,const std::string & directory)249     string_vector mput_directory (const std::string& base,
250                                   const std::string& directory)
251     {
252       return m_rep->mput_directory (base, directory);
253     }
254 
dir(void)255     void dir (void) { m_rep->dir (); }
256 
list(void)257     string_vector list (void) { return m_rep->list (); }
258 
get_fileinfo(const std::string & filename,double & filesize,time_t & filetime,bool & fileisdir)259     void get_fileinfo (const std::string& filename, double& filesize,
260                        time_t& filetime, bool& fileisdir)
261     {
262       m_rep->get_fileinfo (filename, filesize, filetime, fileisdir);
263     }
264 
pwd(void)265     std::string pwd (void) { return m_rep->pwd (); }
266 
http_get(const Array<std::string> & param)267     void http_get (const Array<std::string>& param)
268     {
269       m_rep->http_get (param);
270     }
271 
http_post(const Array<std::string> & param)272     void http_post (const Array<std::string>& param)
273     {
274       m_rep->http_post (param);
275     }
276 
http_action(const Array<std::string> & param,const std::string & action)277     void http_action (const Array<std::string>& param,
278                       const std::string& action)
279     {
280       m_rep->http_action (param, action);
281     }
282 
cookie_jar(const std::string & filename)283     void cookie_jar (const std::string& filename)
284     {
285       m_rep->cookie_jar (filename);
286     }
287 
set_header_fields(const Array<std::string> & param)288     void set_header_fields (const Array<std::string>& param)
289     {
290       m_rep->set_header_fields (param);
291     }
292 
form_data_post(const Array<std::string> & param)293     void form_data_post (const Array<std::string>& param)
294     {
295       m_rep->form_data_post (param);
296     }
297 
set_weboptions(const struct weboptions & param)298     void set_weboptions (const struct weboptions& param)
299     {
300       m_rep->set_weboptions (param);
301     }
302 
303   private:
304 
305     std::shared_ptr<base_url_transfer> m_rep;
306   };
307 }
308 
309 #endif
310