diff options
Diffstat (limited to 'butl/curl.txx')
-rw-r--r-- | butl/curl.txx | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/butl/curl.txx b/butl/curl.txx new file mode 100644 index 0000000..fe8a25f --- /dev/null +++ b/butl/curl.txx @@ -0,0 +1,99 @@ +// file : butl/curl.txx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <utility> // move(), forward() +#include <exception> // invalid_argument + +namespace butl +{ + template <typename I> + typename std::enable_if<curl::is_other<I>::value, I>::type curl:: + map_in (I&& in, method_proto mp, io_data& d) + { + switch (mp) + { + case ftp_put: + { + d.options.push_back ("--upload-file"); + d.options.push_back ("-"); + break; + } + case http_post: + { + d.options.push_back ("--data-binary"); + d.options.push_back ("@-"); + break; + } + case ftp_get: + case http_get: + { + throw std::invalid_argument ("input specified for GET method"); + } + } + + return std::forward<I> (in); + } + + template <typename O> + typename std::enable_if<curl::is_other<O>::value, O>::type curl:: + map_out (O&& out, method_proto mp, io_data&) + { + switch (mp) + { + case ftp_get: + case http_get: + case http_post: + { + // Note: no need for any options, curl writes to stdout by default. + // + break; + } + case ftp_put: + { + throw std::invalid_argument ("output specified for PUT method"); + } + } + + return std::forward<O> (out); + } + + template <typename C, + typename I, + typename O, + typename E, + typename... A> + curl:: + curl (const C& cmdc, + I&& in, + O&& out, + E&& err, + method_type m, + const std::string& url, + A&&... options) + { + method_proto_options mpo; + method_proto mp (translate (m, url, mpo)); + + io_data in_data; + io_data out_data; + + process& p (*this); + p = process_start ( + cmdc, + map_in (std::forward<I> (in), mp, in_data), + map_out (std::forward<O> (out), mp, out_data), + std::forward<E> (err), + dir_path (), + "curl", + "-s", // Silent. + "-S", // But do show diagnostics. + mpo, + in_data.options, + out_data.options, + std::forward<A> (options)..., + url); + + // Note: leaving this scope closes any open ends of the pipes in io_data. + } +} |