uvco 0.1
Loading...
Searching...
No Matches
curl.h
Go to the documentation of this file.
1// uvco (c) 2024 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <curl/curl.h>
6#include <curl/multi.h>
7
10
11#include <exception>
12#include <memory>
13#include <optional>
14#include <span>
15#include <string>
16#include <utility>
17
18namespace uvco {
19
20class Loop;
21
22class UvCurlContext_;
23class CurlRequestCore_;
24class Curl;
25
26class CurlException : public std::exception {
27public:
28 CurlException(CURLcode code, std::string url)
29 : url_{std::move(url)}, code_{code} {}
30
31 [[nodiscard]] const char *what() const noexcept override {
32 return curl_easy_strerror(code_);
33 }
34
35private:
36 std::string url_;
37 CURLcode code_;
38};
39
41public:
42 enum class Method { GET, POST };
43
44 CurlRequest(const CurlRequest &) = delete;
46 CurlRequest &operator=(const CurlRequest &) = delete;
49
50 void setTimeoutMs(long timeoutMs);
51
58
60 [[nodiscard]] std::optional<long> statusCode() const;
61
62private:
63 friend class Curl;
65 CurlRequest(std::weak_ptr<UvCurlContext_> context, Method method,
66 std::string url);
68 CurlRequest(std::weak_ptr<UvCurlContext_> context, Method method,
69 std::string url,
70 std::span<const std::pair<std::string, std::string>> fields);
71
72 // Core must be pinned in memory.
73 std::unique_ptr<CurlRequestCore_> core_;
74};
75
86class Curl {
87public:
88 explicit Curl(const Loop &loop);
89
90 // Pinned in memory due to uv fields. Hide behind unique_ptr if moving
91 // is required.
92 Curl(const Curl &) = delete;
93 Curl(Curl &&other) = delete;
94 Curl &operator=(const Curl &) = delete;
95 Curl &operator=(Curl &&other) = delete;
97
101 CurlRequest get(std::string url);
102
106 CurlRequest post(std::string url,
107 std::span<const std::pair<std::string, std::string>> fields);
108
111
112private:
113 std::shared_ptr<UvCurlContext_> context_;
114};
115
116} // namespace uvco
Definition curl.h:26
std::string url_
Definition curl.h:36
CurlException(CURLcode code, std::string url)
Definition curl.h:28
CURLcode code_
Definition curl.h:37
const char * what() const noexcept override
Definition curl.h:31
Definition curl.h:40
std::optional< long > statusCode() const
Return the status code of the request after it has finished.
Definition curl.cc:563
CurlRequest & operator=(CurlRequest &&)=delete
std::unique_ptr< CurlRequestCore_ > core_
Definition curl.h:73
CurlRequest & operator=(const CurlRequest &)=delete
void setTimeoutMs(long timeoutMs)
Definition curl.cc:559
Method
Definition curl.h:42
MultiPromise< std::string > start()
Definition curl.cc:567
CurlRequest(CurlRequest &&)=delete
CurlRequest(const CurlRequest &)=delete
Definition curl.h:86
Curl(const Curl &)=delete
CurlRequest post(std::string url, std::span< const std::pair< std::string, std::string > > fields)
Definition curl.cc:523
Curl(const Loop &loop)
Definition curl.cc:513
std::shared_ptr< UvCurlContext_ > context_
Definition curl.h:113
Curl & operator=(Curl &&other)=delete
Curl & operator=(const Curl &)=delete
CurlRequest get(std::string url)
Definition curl.cc:518
Curl(Curl &&other)=delete
Promise< void > close()
Close the curl handle in order to free all associated resources.
Definition curl.cc:529
Definition loop.h:26
Definition multipromise.h:133
Definition promise.h:76
Definition async_work.cc:17