aboutsummaryrefslogtreecommitdiff
path: root/libbutl/curl.txx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-05-01 16:08:43 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-05-01 16:59:24 +0300
commit61377c582e0f2675baa5f5e6e30a35d1a4164b33 (patch)
tree11cdca992834d7f7f197f72856712fbcb3020e3d /libbutl/curl.txx
parent442c1a6790e52baa0c081f310d4d9e9b6f1ff638 (diff)
Add hxx extension for headers and lib prefix for library dir
Diffstat (limited to 'libbutl/curl.txx')
-rw-r--r--libbutl/curl.txx99
1 files changed, 99 insertions, 0 deletions
diff --git a/libbutl/curl.txx b/libbutl/curl.txx
new file mode 100644
index 0000000..5fd81dc
--- /dev/null
+++ b/libbutl/curl.txx
@@ -0,0 +1,99 @@
+// file : libbutl/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.
+ }
+}