8#ifndef BOTAN_UTILS_HTTP_H_
9#define BOTAN_UTILS_HTTP_H_
11#include <botan/exceptn.h>
12#include <botan/types.h>
51 bool operator()(std::string_view a, std::string_view b)
const {
52 const auto ascii_lower = [](
unsigned char c) ->
unsigned char {
53 return (c >=
'A' && c <=
'Z') ?
static_cast<unsigned char>(c + 32) : c;
55 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [&](
char x,
char y) {
56 return ascii_lower(static_cast<unsigned char>(x)) < ascii_lower(static_cast<unsigned char>(y));
61using Headers = std::map<std::string, std::string, Case_Insensitive_Less>;
65 Response() : m_status_code(0), m_status_message(
"Uninitialized") {}
70 m_body(std::move(
body)),
71 m_headers(std::move(
headers)) {}
75 const std::vector<uint8_t>&
body()
const {
return m_body; }
88 unsigned int m_status_code;
89 std::string m_status_message;
90 std::vector<uint8_t> m_body;
105 std::chrono::milliseconds
timeout()
const {
return m_timeout; }
125 size_t m_max_redirects = 0;
126 std::chrono::milliseconds m_timeout = std::chrono::milliseconds(3000);
127 std::optional<size_t> m_max_body_size;
130typedef std::function<Response(std::string_view, std::string_view, std::string_view, std::optional<size_t>)>
134 std::string_view verb,
136 std::string_view content_type,
137 const std::vector<uint8_t>& body,
142 std::string_view content_type,
143 const std::vector<uint8_t>& body,
149 std::string_view content_type,
150 const std::vector<uint8_t>& body,
151 const RequestLimits& limits = {});
162 std::chrono::milliseconds timeout,
163 std::optional<size_t> max_body_size);
Exception(std::string_view msg)
ErrorType error_type() const noexcept override
HTTP_Error(const std::string &msg)
RequestLimits & set_timeout(std::chrono::milliseconds t)
std::chrono::milliseconds timeout() const
RequestLimits & set_max_body_size(size_t n)
size_t max_redirects() const
RequestLimits & set_max_redirects(size_t n)
std::optional< size_t > max_body_size() const
const std::vector< uint8_t > & body() const
Response(unsigned int status_code, std::string status_message, std::vector< uint8_t > body, Headers headers)
const Headers & headers() const
unsigned int status_code() const
std::string status_message() const
void throw_unless_ok() const
std::string url_encode(std::string_view in)
Response GET_sync(const URI &uri, const RequestLimits &limits)
std::function< Response(std::string_view, std::string_view, std::string_view, std::optional< size_t >)> http_exch_fn
std::map< std::string, std::string, Case_Insensitive_Less > Headers
Response http_sync(const http_exch_fn &http_transact, std::string_view verb, const URI &uri, std::string_view content_type, const std::vector< uint8_t > &body, const RequestLimits &limits)
Response read_response_from_socket(OS::Socket &socket, std::chrono::milliseconds timeout, std::optional< size_t > max_body_size)
Response POST_sync(const URI &uri, std::string_view content_type, const std::vector< uint8_t > &body, const RequestLimits &limits)
std::ostream & operator<<(std::ostream &o, const Response &resp)
bool operator()(std::string_view a, std::string_view b) const