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