From cb86023bd7056fbd99d544985688504b56e52508 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 11 Jan 2018 17:20:54 +0100 Subject: [PATCH] lib/curl/Form: new library --- Makefile.am | 1 + src/lib/curl/Form.cxx | 57 +++++++++++++++++++++++++++++++++++++++++++ src/lib/curl/Form.hxx | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 src/lib/curl/Form.cxx create mode 100644 src/lib/curl/Form.hxx diff --git a/Makefile.am b/Makefile.am index dc7d64f6b..95424c534 100644 --- a/Makefile.am +++ b/Makefile.am @@ -236,6 +236,7 @@ CURL_SOURCES = \ src/lib/curl/Init.cxx src/lib/curl/Init.hxx \ src/lib/curl/Global.cxx src/lib/curl/Global.hxx \ src/lib/curl/Request.cxx src/lib/curl/Request.hxx \ + src/lib/curl/Form.cxx src/lib/curl/Form.hxx \ src/lib/curl/Handler.hxx \ src/lib/curl/Easy.hxx \ src/lib/curl/Multi.hxx \ diff --git a/src/lib/curl/Form.cxx b/src/lib/curl/Form.cxx new file mode 100644 index 000000000..bf2a3cb76 --- /dev/null +++ b/src/lib/curl/Form.cxx @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2018 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "Form.hxx" + +std::string +EncodeForm(CURL *curl, + const std::multimap &fields) noexcept +{ + std::string result; + + for (const auto &i : fields) { + if (!result.empty()) + result.push_back('&'); + + result.append(i.first); + result.push_back('='); + + if (!i.second.empty()) { + char *value = curl_easy_escape(curl, i.second.data(), + i.second.length()); + if (value != nullptr) { + result.append(value); + curl_free(value); + } + } + } + + return result; +} diff --git a/src/lib/curl/Form.hxx b/src/lib/curl/Form.hxx new file mode 100644 index 000000000..8c045ac22 --- /dev/null +++ b/src/lib/curl/Form.hxx @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2018 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CURL_FORM_HXX +#define CURL_FORM_HXX + +#include + +#include +#include + +/** + * Encode the given map of form fields to a + * "application/x-www-form-urlencoded" string. + */ +std::string +EncodeForm(CURL *curl, + const std::multimap &fields) noexcept; + +#endif