annotate libinterp/corefcn/urlwrite.cc @ 28467:159b6a1eb408

Use wide character overload to open file streams on Windows. * liboctave/system/lo-sysdep.cc, liboctave/system/lo-sysdep.h (fstream, ifstream, ofstream): Add "wrapper" functions to open file streams. * libinterp/corefcn/__fcn__.cc (F__ftp_mput__, F__ftp_mget__), libinterp/corefcn/debug.cc (do_dbtype), libinterp/corefcn/help.cc (help_system::raw_help_from_docstrings_file), libinterp/corefcn/load-save.cc (check_gzip_magic, load_save_system::get_file_format, load_save_system::dump_octave_core, load_save_system::load, load_save_system::save), libinterp/corefcn/oct-hist.cc (mk_tmp_hist_file, history_system::do_edit_history), libinterp/corefcn/urlwrite.cc (Furlwrite), libinterp/octave-value/ov-java.cc (read_java_opts, read_classpath_txt), libinterp/parse-tree/oct-parse.yy (get_file_line), liboctave/util/cmd-hist.cc (gnu_history::do_append), liboctave/util/file-info.cc (file_info::snarf_file), liboctave/util/url-transfer.cc (base_url_transfer::mget_directory, base_url_transfer::mput_directory): Use new functions. * libinterp/corefcn/dlmread.cc (dlmread): Use wide character overload for std::ifstream::open on Windows. * src/mkoctfile.in.cc (octave_u8_conv_to_encoding): Dummy function for cross-compiler. (main): Use wide character overload of std::ofstream::open on Windows.
author Markus Mützel <markus.muetzel@gmx.de>
date Fri, 12 Jun 2020 22:13:04 +0200
parents 9f9ac219896d
children 28913793f678 0a5b15007766
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
3 // Copyright (C) 2006-2020 The Octave Project Developers
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
25
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21547
diff changeset
26 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
27 # include "config.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
28 #endif
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
29
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
30 #include <string>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
31 #include <fstream>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
32 #include <iomanip>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
33
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
34 #include "dir-ops.h"
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
35 #include "file-ops.h"
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
36 #include "file-stat.h"
25548
d6050ba12c0c Call get_ASCII_filename for std::ifstream (bug #49118).
Markus Mützel <markus.muetzel@gmx.de>
parents: 25438
diff changeset
37 #include "lo-sysdep.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
38 #include "oct-env.h"
17548
92541ff4cc3c improve implementation of ftp object handles
John W. Eaton <jwe@octave.org>
parents: 17546
diff changeset
39 #include "oct-handle.h"
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
40 #include "glob-match.h"
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
41 #include "url-transfer.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
42
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
43 #include "defun.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
44 #include "error.h"
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
45 #include "interpreter.h"
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
46 #include "oct-map.h"
13985
43cc49c7abd1 Use thread-safe atomic reference counting (GCC and MSVC).
Michael Goffioul <michael.goffioul@gmail.com>
parents: 13978
diff changeset
47 #include "oct-refcount.h"
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
48 #include "ov-cell.h"
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
49 #include "ov-classdef.h"
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
50 #include "ovl.h"
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
51 #include "pager.h"
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
52 #include "unwind-prot.h"
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
53 #include "url-handle-manager.h"
17550
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
54
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
55 static void
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
56 delete_file (const std::string& file)
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
57 {
21733
cb0fdd941d84 use namespace for system file_ops class
John W. Eaton <jwe@octave.org>
parents: 21732
diff changeset
58 octave::sys::unlink (file);
17550
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
59 }
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
60
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
61 DEFUN (urlwrite, args, nargout,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
62 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
63 @deftypefn {} {} urlwrite (@var{url}, @var{localfile})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
64 @deftypefnx {} {@var{f} =} urlwrite (@var{url}, @var{localfile})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
65 @deftypefnx {} {[@var{f}, @var{success}] =} urlwrite (@var{url}, @var{localfile})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
66 @deftypefnx {} {[@var{f}, @var{success}, @var{message}] =} urlwrite (@var{url}, @var{localfile})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
67 Download a remote file specified by its @var{url} and save it as
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
68 @var{localfile}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
69
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
70 For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
71
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
72 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
73 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
74 urlwrite ("ftp://ftp.octave.org/pub/README",
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
75 "README.txt");
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
76 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
77 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
78
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
79 The full path of the downloaded file is returned in @var{f}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
80
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
81 The variable @var{success} is 1 if the download was successful,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
82 otherwise it is 0 in which case @var{message} contains an error message.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
83
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
84 If no output argument is specified and an error occurs, then the error is
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
85 signaled through Octave's error handling mechanism.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
86
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
87 This function uses libcurl. Curl supports, among others, the HTTP, FTP, and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
88 FILE protocols. Username and password may be specified in the URL, for
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
89 example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
90
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
91 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
92 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
93 urlwrite ("http://username:password@@example.com/file.txt",
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
94 "file.txt");
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
95 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
96 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
97
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
98 GET and POST requests can be specified by @var{method} and @var{param}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
99 The parameter @var{method} is either @samp{get} or @samp{post} and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
100 @var{param} is a cell array of parameter and value pairs.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
101 For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
102
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
103 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
104 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
105 urlwrite ("http://www.google.com/search", "search.html",
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
106 "get", @{"query", "octave"@});
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
107 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
108 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
109 @seealso{urlread}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
110 @end deftypefn */)
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
111 {
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
112 int nargin = args.length ();
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
113
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
114 // verify arguments
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
115 if (nargin != 2 && nargin != 4)
20799
c349d4c91ce2 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20726
diff changeset
116 print_usage ();
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
117
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
118 std::string url = args(0).xstring_value ("urlwrite: URL must be a string");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
119
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
120 // name to store the file if download is successful
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
121 std::string filename = args(1).xstring_value ("urlwrite: LOCALFILE must be a string");
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
122
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
123 std::string method;
17554
f0d21e7d4653 avoid Cell arrays in usr_transfer classes
John W. Eaton <jwe@octave.org>
parents: 17553
diff changeset
124 Array<std::string> param;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
125
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
126 if (nargin == 4)
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
127 {
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
128 method = args(2).xstring_value ("urlwrite: METHOD must be a string");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
129
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
130 if (method != "get" && method != "post")
23803
90689bdbe048 Use C++11 raw string literals to avoid escaping double quotes.
Rik <rik@octave.org>
parents: 23742
diff changeset
131 error (R"(urlwrite: METHOD must be "get" or "post")");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
132
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
133 param = args(3).xcellstr_value ("urlwrite: parameters (PARAM) for get and post requests must be given as a cell array of strings");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
134
18678
6113e0c6920b maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents: 18391
diff changeset
135 if (param.numel () % 2 == 1)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
136 error ("urlwrite: number of elements in PARAM must be even");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
137 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
138
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
139 // The file should only be deleted if it doesn't initially exist, we
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
140 // create it, and the download fails. We use unwind_protect to do
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
141 // it so that the deletion happens no matter how we exit the function.
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
142
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
143 octave::sys::file_stat fs (filename);
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
144
28467
159b6a1eb408 Use wide character overload to open file streams on Windows.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27985
diff changeset
145 std::ofstream ofile =
159b6a1eb408 Use wide character overload to open file streams on Windows.
Markus Mützel <markus.muetzel@gmx.de>
parents: 27985
diff changeset
146 octave::sys::ofstream (filename.c_str (), std::ios::out | std::ios::binary);
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
147
6986
4ad04ff722d7 [project @ 2007-10-09 17:43:00 by jwe]
jwe
parents: 6984
diff changeset
148 if (! ofile.is_open ())
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
149 error ("urlwrite: unable to open file");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
150
21743
f4d7d0eb5b0c use namespace for unwind_protect class
John W. Eaton <jwe@octave.org>
parents: 21736
diff changeset
151 octave::unwind_protect_safe frame;
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
152
17549
a646665cd574 eliminate unecessary static function in urlwrite.cc
John W. Eaton <jwe@octave.org>
parents: 17548
diff changeset
153 frame.add_fcn (delete_file, filename);
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
154
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
155 octave::url_transfer url_xfer (url, ofile);
17596
43b9181340fb separate object creation from http actions in url_transfer class
John W. Eaton <jwe@octave.org>
parents: 17556
diff changeset
156
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
157 octave_value_list retval;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
158
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
159 if (! url_xfer.is_valid ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
160 error ("support for URL transfers was disabled when Octave was built");
17553
2d01e20abd85 rework error handling for url_transfer class
John W. Eaton <jwe@octave.org>
parents: 17551
diff changeset
161
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
162 url_xfer.http_action (param, method);
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
163
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
164 ofile.close ();
18287
9a43d8d6e29e avoid startup crash if curl library is not available (bug #41067)
John W. Eaton <jwe@octave.org>
parents: 17861
diff changeset
165
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
166 if (url_xfer.good ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
167 frame.discard ();
18287
9a43d8d6e29e avoid startup crash if curl library is not available (bug #41067)
John W. Eaton <jwe@octave.org>
parents: 17861
diff changeset
168
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
169 if (nargout > 0)
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
170 {
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
171 if (url_xfer.good ())
21732
6a1eded90355 use namespace for system env class
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
172 retval = ovl (octave::sys::env::make_absolute (filename), true, "");
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
173 else
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
174 retval = ovl ("", false, url_xfer.lasterror ());
17553
2d01e20abd85 rework error handling for url_transfer class
John W. Eaton <jwe@octave.org>
parents: 17551
diff changeset
175 }
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
176
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
177 if (nargout < 2 && ! url_xfer.good ())
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
178 error ("urlwrite: %s", url_xfer.lasterror ().c_str ());
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
179
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
180 return retval;
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
181 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
182
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
183 DEFUN (urlread, args, nargout,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
184 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
185 @deftypefn {} {@var{s} =} urlread (@var{url})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
186 @deftypefnx {} {[@var{s}, @var{success}] =} urlread (@var{url})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
187 @deftypefnx {} {[@var{s}, @var{success}, @var{message}] =} urlread (@var{url})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
188 @deftypefnx {} {[@dots{}] =} urlread (@var{url}, @var{method}, @var{param})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
189 Download a remote file specified by its @var{url} and return its content
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
190 in string @var{s}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
191
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
192 For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
193
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
194 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
195 s = urlread ("ftp://ftp.octave.org/pub/README");
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
196 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
197
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
198 The variable @var{success} is 1 if the download was successful,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
199 otherwise it is 0 in which case @var{message} contains an error
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
200 message.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
201
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
202 If no output argument is specified and an error occurs, then the error is
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
203 signaled through Octave's error handling mechanism.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
204
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
205 This function uses libcurl. Curl supports, among others, the HTTP, FTP, and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
206 FILE protocols. Username and password may be specified in the URL@. For
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
207 example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
208
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
209 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
210 s = urlread ("http://user:password@@example.com/file.txt");
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
211 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
212
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
213 GET and POST requests can be specified by @var{method} and @var{param}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
214 The parameter @var{method} is either @samp{get} or @samp{post} and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
215 @var{param} is a cell array of parameter and value pairs.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
216 For example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
217
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
218 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
219 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
220 s = urlread ("http://www.google.com/search", "get",
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
221 @{"query", "octave"@});
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
222 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
223 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
224 @seealso{urlwrite}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
225 @end deftypefn */)
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
226 {
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
227 int nargin = args.length ();
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
228
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
229 // verify arguments
19403
03067dab10ca Use stricter input validation when looking for a string as input (bug #42651).
Rik <rik@octave.org>
parents: 19220
diff changeset
230 if (nargin != 1 && nargin != 3)
20799
c349d4c91ce2 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20726
diff changeset
231 print_usage ();
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
232
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
233 std::string url = args(0).xstring_value ("urlread: URL must be a string");
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
234
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
235 std::string method;
17554
f0d21e7d4653 avoid Cell arrays in usr_transfer classes
John W. Eaton <jwe@octave.org>
parents: 17553
diff changeset
236 Array<std::string> param;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
237
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
238 if (nargin == 3)
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
239 {
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
240 method = args(1).xstring_value ("urlread: METHOD must be a string");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
241
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
242 if (method != "get" && method != "post")
23803
90689bdbe048 Use C++11 raw string literals to avoid escaping double quotes.
Rik <rik@octave.org>
parents: 23742
diff changeset
243 error (R"(urlread: METHOD must be "get" or "post")");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
244
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
245 param = args(2).xcellstr_value ("urlread: parameters (PARAM) for get and post requests must be given as a cell array of strings");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
246
18678
6113e0c6920b maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents: 18391
diff changeset
247 if (param.numel () % 2 == 1)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
248 error ("urlread: number of elements in PARAM must be even");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
249 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
250
6986
4ad04ff722d7 [project @ 2007-10-09 17:43:00 by jwe]
jwe
parents: 6984
diff changeset
251 std::ostringstream buf;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
252
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
253 octave::url_transfer url_xfer = octave::url_transfer (url, buf);
17596
43b9181340fb separate object creation from http actions in url_transfer class
John W. Eaton <jwe@octave.org>
parents: 17556
diff changeset
254
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
255 if (! url_xfer.is_valid ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
256 error ("support for URL transfers was disabled when Octave was built");
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
257
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
258 url_xfer.http_action (param, method);
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
259
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
260 octave_value_list retval;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
261
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
262 if (nargout > 0)
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
263 {
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
264 // Return empty string if no error occurred.
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
265 retval = ovl (buf.str (), url_xfer.good (),
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
266 url_xfer.good () ? "" : url_xfer.lasterror ());
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
267 }
18287
9a43d8d6e29e avoid startup crash if curl library is not available (bug #41067)
John W. Eaton <jwe@octave.org>
parents: 17861
diff changeset
268
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
269 if (nargout < 2 && ! url_xfer.good ())
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
270 error ("urlread: %s", url_xfer.lasterror ().c_str ());
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
271
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
272 return retval;
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
273 }
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
274
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
275 DEFUN (__restful_service__, args, nargout,
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
276 doc: /* -*- texinfo -*-
27795
afbaad39d25c doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents: 27357
diff changeset
277 @deftypefn {} {@var{response} =} __restful_service__ (@var{url}, @var{param}, @var{weboptions})
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
278 Undocumented internal function.
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
279 @end deftypefn */)
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
280 {
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
281 int nargin = args.length ();
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
282
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
283 if (nargin < 1)
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
284 print_usage ();
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
285
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
286 std::string url = args(0).xstring_value ("__restful_service__: URL must be a string");
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
287
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
288 std::ostringstream content;
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
289
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
290 octave::url_transfer url_xfer (url, content);
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
291
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
292 if (! url_xfer.is_valid ())
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
293 error ("support for URL transfers was disabled when Octave was built");
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
294
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
295 Array<std::string> param = args(1).cellstr_value ();
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
296
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
297 std::string data, method;
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
298
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
299 struct octave::weboptions options;
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
300
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
301 octave::cdef_object object = args (nargin - 1).classdef_object_value ()
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
302 -> get_object ();
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
303
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
304 // We could've used object.map_value () instead to return a map but that
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
305 // shows a warning about about overriding access restrictions.
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
306 // Nevertheless, we are keeping checking that here if the keys are not
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
307 // equal to "delete" and "display", getting away with the warning.
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
308 string_vector keys = object.map_keys ();
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
309
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
310 for (int i = 0; i < keys.numel (); i++)
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
311 {
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
312 if (keys(i) == "Timeout")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
313 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
314 float timeout = object.get (keys(i)).float_value ();
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
315 options.Timeout = static_cast<long>(timeout * 1000);
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
316 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
317
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
318 if (keys(i) == "HeaderFields")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
319 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
320 options.HeaderFields = object.get (keys(i)).cellstr_value ();
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
321 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
322
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
323 // FIXME: 'delete' and 'display', auto-generated, probably by cdef_object
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
324 // class? Remaining fields have already been adjusted elsewhere in the
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
325 // m-script. Set 'value' as the Value of the Key wherever it's a string.
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
326 if (keys(i) != "Timeout" && keys(i) != "HeaderFields"
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
327 && keys(i) != "delete" && keys(i) != "display")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
328 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
329 std::string value = object.get (keys(i)).string_value ();
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
330
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
331 if (keys(i) == "UserAgent")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
332 options.UserAgent = value;
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
333
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
334 if (keys(i) == "Username")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
335 options.Username = value;
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
336
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
337 if (keys(i) == "Password")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
338 options.Password = value;
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
339
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
340 if (keys(i) == "ContentReader")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
341 // Unimplemented. Only for MATLAB compatibility.
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
342 options.ContentReader = "";
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
343
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
344 if (keys(i) == "RequestMethod")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
345 method = value;
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
346
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
347 if (keys(i) == "ArrayFormat")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
348 options.ArrayFormat = value;
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
349
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
350 if (keys(i) == "CertificateFilename")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
351 options.CertificateFilename = "";
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
352 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
353 }
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
354
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
355 url_xfer.set_weboptions (options);
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
356
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
357 url_xfer.http_action (param, method);
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
358
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
359 if (nargout < 2 && ! url_xfer.good ())
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
360 error ("__restful_service__: %s", url_xfer.lasterror ().c_str ());
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
361
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
362 return ovl (content.str ());
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
363 }