annotate libinterp/corefcn/urlwrite.cc @ 27932:b018f553fd85

maint: Use Octave coding conventions in libinterp/ * __ftp__.cc, __ichol__.cc, call-stack.cc, error.h, event-manager.cc, file-io.cc, gl-render.cc, graphics.cc, help.cc, input.cc, interpreter.cc, load-path.cc, load-save.cc, ls-hdf5.cc, ls-hdf5.h, mex.cc, oct-hist.cc, oct-stream.cc, sighandlers.h, stack-frame.cc, stack-frame.h, strfns.cc, syminfo.cc, sysdep.cc, text-engine.h, url-handle-manager.h, urlwrite.cc, xpow.cc, __init_fltk__.cc, __ode15__.cc, ccolamd.cc, colamd.cc, cdef-class.cc, cdef-manager.cc, cdef-manager.h, cdef-method.cc, cdef-object.cc, cdef-package.h, cdef-property.cc, ov-class.cc, ov-classdef.cc, ov-cx-sparse.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov-fcn.h, ov-java.cc, ov-typeinfo.h, bp-table.cc, jit-ir.h, jit-typeinfo.h, pt-classdef.h, pt-eval.cc, pt-eval.h, pt-idx.cc: Use Octave coding conventions in libinterp.
author Rik <rik@octave.org>
date Fri, 10 Jan 2020 17:25:12 -0800
parents 265b386f8b20
children 7f1cec12c240
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
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
26 // Author: Alexander Barth <abarth@marine.usf.edu>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
27 // Adapted-By: jwe
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
28
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21547
diff changeset
29 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
30 # include "config.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
31 #endif
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
32
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
33 #include <string>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
34 #include <fstream>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
35 #include <iomanip>
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
36
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
37 #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
38 #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
39 #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
40 #include "lo-sysdep.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
41 #include "oct-env.h"
17548
92541ff4cc3c improve implementation of ftp object handles
John W. Eaton <jwe@octave.org>
parents: 17546
diff changeset
42 #include "oct-handle.h"
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
43 #include "glob-match.h"
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
44 #include "url-transfer.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
45
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
46 #include "defun.h"
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
47 #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
48 #include "interpreter.h"
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
49 #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
50 #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
51 #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
52 #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
53 #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
54 #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
55 #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
56 #include "url-handle-manager.h"
17550
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
57
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
58 static void
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
59 delete_file (const std::string& file)
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
60 {
21733
cb0fdd941d84 use namespace for system file_ops class
John W. Eaton <jwe@octave.org>
parents: 21732
diff changeset
61 octave::sys::unlink (file);
17550
77127a3badaa move curl_object actions to rep class
John W. Eaton <jwe@octave.org>
parents: 17549
diff changeset
62 }
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
63
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
64 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
65 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
66 @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
67 @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
68 @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
69 @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
70 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
71 @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
72
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
73 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
74
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
75 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
76 @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 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
78 "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
79 @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
80 @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
81
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
82 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
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 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
85 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
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 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
88 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
89
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
90 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
91 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
92 example:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
93
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
94 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
95 @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 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
97 "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
98 @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
99 @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
100
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
101 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
102 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
103 @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
104 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
105
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
106 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
107 @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 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
109 "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
110 @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
111 @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
112 @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
113 @end deftypefn */)
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
114 {
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
115 int nargin = args.length ();
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
116
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
117 // verify arguments
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
118 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
119 print_usage ();
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
120
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 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
122
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
123 // 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
124 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
125
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
126 std::string method;
17554
f0d21e7d4653 avoid Cell arrays in usr_transfer classes
John W. Eaton <jwe@octave.org>
parents: 17553
diff changeset
127 Array<std::string> param;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
128
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
129 if (nargin == 4)
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
130 {
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
131 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
132
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
133 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
134 error (R"(urlwrite: METHOD must be "get" or "post")");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
135
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
136 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
137
18678
6113e0c6920b maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents: 18391
diff changeset
138 if (param.numel () % 2 == 1)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
139 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
140 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
141
8151
3725f819b5b3 urlwrite.cc (Furlwrite): delete files we create if download fails
John W. Eaton <jwe@octave.org>
parents: 7481
diff changeset
142 // 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
143 // 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
144 // 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
145
21736
0504351a45e6 use namespace for file_stat classes
John W. Eaton <jwe@octave.org>
parents: 21733
diff changeset
146 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
147
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14424
diff changeset
148 std::ofstream ofile (filename.c_str (), std::ios::out | std::ios::binary);
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
149
6986
4ad04ff722d7 [project @ 2007-10-09 17:43:00 by jwe]
jwe
parents: 6984
diff changeset
150 if (! ofile.is_open ())
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
151 error ("urlwrite: unable to open file");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
152
21743
f4d7d0eb5b0c use namespace for unwind_protect class
John W. Eaton <jwe@octave.org>
parents: 21736
diff changeset
153 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
154
17549
a646665cd574 eliminate unecessary static function in urlwrite.cc
John W. Eaton <jwe@octave.org>
parents: 17548
diff changeset
155 frame.add_fcn (delete_file, filename);
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
156
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
157 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
158
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
159 octave_value_list retval;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
160
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
161 if (! url_xfer.is_valid ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
162 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
163
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
164 url_xfer.http_action (param, method);
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
165
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
166 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
167
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
168 if (url_xfer.good ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
169 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
170
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
171 if (nargout > 0)
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
172 {
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
173 if (url_xfer.good ())
21732
6a1eded90355 use namespace for system env class
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
174 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
175 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
176 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
177 }
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
178
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
179 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
180 error ("urlwrite: %s", url_xfer.lasterror ().c_str ());
6043
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 return retval;
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
183 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
184
17555
0946b0e06544 move url_transfer classes to liboctave
John W. Eaton <jwe@octave.org>
parents: 17554
diff changeset
185 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
186 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
187 @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
188 @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
189 @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
190 @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
191 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
192 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
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 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
195
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
196 @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 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
198 @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
199
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
200 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
201 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
202 message.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
203
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
204 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
205 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
206
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
207 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
208 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
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
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
211 @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 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
213 @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
214
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
215 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
216 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
217 @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
218 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
219
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
220 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
221 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21782
diff changeset
222 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
223 @{"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
224 @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
225 @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
226 @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
227 @end deftypefn */)
6043
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 int nargin = args.length ();
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
230
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
231 // 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
232 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
233 print_usage ();
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
234
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
235 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
236
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
237 std::string method;
17554
f0d21e7d4653 avoid Cell arrays in usr_transfer classes
John W. Eaton <jwe@octave.org>
parents: 17553
diff changeset
238 Array<std::string> param;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
239
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
240 if (nargin == 3)
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
241 {
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
242 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
243
19404
c2f4f6eb5907 A few more instances of stricter input validation for strings (bug #42651).
Rik <rik@octave.org>
parents: 19403
diff changeset
244 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
245 error (R"(urlread: METHOD must be "get" or "post")");
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
246
20700
68e3a747ca02 rename octave_value value extractors that accept error message args
John W. Eaton <jwe@octave.org>
parents: 20681
diff changeset
247 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
248
18678
6113e0c6920b maint: Clean up extra spaces before/after parentheses.
Rik <rik@octave.org>
parents: 18391
diff changeset
249 if (param.numel () % 2 == 1)
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20819
diff changeset
250 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
251 }
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
252
6986
4ad04ff722d7 [project @ 2007-10-09 17:43:00 by jwe]
jwe
parents: 6984
diff changeset
253 std::ostringstream buf;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
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 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
256
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
257 if (! url_xfer.is_valid ())
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
258 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
259
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
260 url_xfer.http_action (param, method);
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
261
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
262 octave_value_list retval;
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
263
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
264 if (nargout > 0)
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
265 {
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
266 // 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
267 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
268 url_xfer.good () ? "" : url_xfer.lasterror ());
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20909
diff changeset
269 }
18287
9a43d8d6e29e avoid startup crash if curl library is not available (bug #41067)
John W. Eaton <jwe@octave.org>
parents: 17861
diff changeset
270
23742
1f0daaf81955 don't use singleton for ch_manager, rename to url_handle_manager
John W. Eaton <jwe@octave.org>
parents: 23577
diff changeset
271 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
272 error ("urlread: %s", url_xfer.lasterror ().c_str ());
6043
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
273
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
274 return retval;
199f15a8d1fc [project @ 2006-10-09 19:49:03 by jwe]
jwe
parents:
diff changeset
275 }
9880
7f77e5081e83 Add ftp objects
David Bateman <dbateman@free.fr>
parents: 9064
diff changeset
276
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
277 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
278 doc: /* -*- texinfo -*-
27795
afbaad39d25c doc: grammarcheck C++ files in libinterp/ directory.
Rik <rik@octave.org>
parents: 27357
diff changeset
279 @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
280 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
281 @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
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 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
284
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
285 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
286 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
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::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
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 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
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 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
293
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
294 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
295 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
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 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
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 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
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 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
302
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
303 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
304 -> 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
305
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
306 // 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
307 // 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
308 // 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
309 // 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
310 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
311
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
312 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
313 {
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
314 if (keys(i) == "Timeout")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
315 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
316 float timeout = object.get (keys(i)).float_value ();
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
317 options.Timeout = static_cast<long>(timeout * 1000);
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
318 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
319
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
320 if (keys(i) == "HeaderFields")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
321 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
322 options.HeaderFields = object.get (keys(i)).cellstr_value ();
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
323 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
324
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
325 // 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
326 // 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
327 // 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
328 if (keys(i) != "Timeout" && keys(i) != "HeaderFields"
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
329 && keys(i) != "delete" && keys(i) != "display")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
330 {
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
331 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
332
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
333 if (keys(i) == "UserAgent")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
334 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
335
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
336 if (keys(i) == "Username")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
337 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
338
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
339 if (keys(i) == "Password")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
340 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
341
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
342 if (keys(i) == "ContentReader")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
343 // Unimplemented. Only for MATLAB compatibility.
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
344 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
345
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
346 if (keys(i) == "RequestMethod")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
347 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
348
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
349 if (keys(i) == "ArrayFormat")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
350 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
351
27932
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
352 if (keys(i) == "CertificateFilename")
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
353 options.CertificateFilename = "";
b018f553fd85 maint: Use Octave coding conventions in libinterp/
Rik <rik@octave.org>
parents: 27929
diff changeset
354 }
27048
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
355 }
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.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
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 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
360
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
361 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
362 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
363
159402e52cfa New implementation of RESTful web services as part of GSoC 2018 (patch #9795).
Sahil Yadav <yadavsahil5198@gmail.com>
parents: 26376
diff changeset
364 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
365 }