From 087874620f5f9dfe7f71c7afaf2193ec34ccee0b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 23 Dec 2019 14:15:18 +0100 Subject: [PATCH] test/RunCurl: new debug program --- test/RunCurl.cxx | 93 ++++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 12 +++++++ 2 files changed, 105 insertions(+) create mode 100644 test/RunCurl.cxx diff --git a/test/RunCurl.cxx b/test/RunCurl.cxx new file mode 100644 index 000000000..c8ca25909 --- /dev/null +++ b/test/RunCurl.cxx @@ -0,0 +1,93 @@ +/* + * Copyright 2003-2019 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "ShutdownHandler.hxx" +#include "lib/curl/Global.hxx" +#include "lib/curl/Request.hxx" +#include "lib/curl/Handler.hxx" +#include "event/Loop.hxx" +#include "util/PrintException.hxx" + +#include + +class MyHandler final : public CurlResponseHandler { + EventLoop &event_loop; + + std::exception_ptr error; + +public: + explicit MyHandler(EventLoop &_event_loop) noexcept + :event_loop(_event_loop) {} + + void Finish() { + if (error) + std::rethrow_exception(error); + } + + /* virtual methods from CurlResponseHandler */ + void OnHeaders(unsigned status, + std::multimap &&headers) override { + fprintf(stderr, "status: %u\n", status); + for (const auto &i : headers) + fprintf(stderr, "%s: %s\n", + i.first.c_str(), i.second.c_str()); + } + + void OnData(ConstBuffer data) override { + if (fwrite(data.data, data.size, 1, stdout) != 1) + throw std::runtime_error("Failed to write"); + } + + void OnEnd() override { + event_loop.Break(); + } + + void OnError(std::exception_ptr e) noexcept override { + error = std::move(e); + event_loop.Break(); + } +}; + +int +main(int argc, char **argv) noexcept +try { + if (argc != 2) { + fprintf(stderr, "Usage: RunCurl URI\n"); + return EXIT_FAILURE; + } + + const char *const uri = argv[1]; + + EventLoop event_loop; + const ShutdownHandler shutdown_handler(event_loop); + CurlGlobal curl_global(event_loop); + + MyHandler handler(event_loop); + CurlRequest request(curl_global, uri, handler); + request.Start(); + + event_loop.Run(); + + handler.Finish(); + + return EXIT_SUCCESS; +} catch (...) { + PrintException(std::current_exception()); + return EXIT_FAILURE; +} diff --git a/test/meson.build b/test/meson.build index dab10ecb2..0c7371e89 100644 --- a/test/meson.build +++ b/test/meson.build @@ -334,6 +334,18 @@ executable( ) if curl_dep.found() + executable( + 'RunCurl', + 'RunCurl.cxx', + 'ShutdownHandler.cxx', + '../src/Log.cxx', + '../src/LogBackend.cxx', + include_directories: inc, + dependencies: [ + curl_dep, + ], + ) + test('test_icy_parser', executable( 'test_icy_parser', 'test_icy_parser.cxx',