10#define FMT_HEADER_ONLY
11#include <fmt/format.h>
12#include <llhttp/llhttp.h>
21 std::string header_string;
22 for (
const auto& [k, v] : headers)
24 header_string += fmt::format(
"{}: {}\r\n", k, v);
34 const uint8_t*
body =
nullptr;
48 ccf::nonstd::to_lower(k);
73 const std::vector<uint8_t>* b,
bool overwrite_content_length =
true)
77 set_body(b->data(), b->size(), overwrite_content_length);
81 set_body(
nullptr, 0, overwrite_content_length);
86 const uint8_t* b,
size_t s,
bool overwrite_content_length =
true)
92 overwrite_content_length ||
95 headers[ccf::http::headers::CONTENT_LENGTH] =
100 void set_body(
const std::string& s,
bool overwrite_content_length =
true)
103 body =
reinterpret_cast<const uint8_t*
>(s.data());
107 overwrite_content_length ||
108 headers.find(ccf::http::headers::CONTENT_LENGTH) ==
headers.end())
110 headers[ccf::http::headers::CONTENT_LENGTH] =
119 llhttp_method method;
120 std::string path =
"/";
121 std::map<std::string, std::string> query_params;
124 Request(
const std::string_view& p =
"/", llhttp_method m = HTTP_POST) :
142 if (!p.empty() && p[0] ==
'/')
148 path = fmt::format(
"/{}", p);
164 std::string formatted_query;
166 for (
const auto& it : query_params)
169 fmt::format(
"{}{}={}", (first ?
'?' :
'&'), it.first, it.second);
172 return formatted_query;
176 bool header_only =
false)
const
180 const auto body_view = (header_only ||
body ==
nullptr) ?
183 std::string_view(
reinterpret_cast<char const*
>(
body),
body_size);
185 const auto request_string = fmt::format(
190 llhttp_method_name(method),
195 return {request_string.begin(), request_string.end()};
208 bool header_only =
false)
const
210 const auto body_view = (header_only ||
body ==
nullptr) ?
213 std::string_view(
reinterpret_cast<char const*
>(
body),
body_size);
215 const auto response_string = fmt::format(
221 ccf::http_status_str(status),
225 return {response_string.begin(), response_string.end()};
228#pragma clang diagnostic push
229#pragma clang diagnostic ignored "-Wunused-function"
232 static std::vector<uint8_t> build_header(
233 llhttp_method method,
const std::vector<uint8_t>& body)
235 Request r(
"/", method);
237 return r.build_request(
true);
240 static std::vector<uint8_t> build_request(
241 llhttp_method method,
const std::vector<uint8_t>& body)
243 Request r(
"/", method);
245 return r.build_request(
false);
249 static std::vector<uint8_t> build_delete_header(
250 const std::vector<uint8_t>& body)
252 return build_header(HTTP_DELETE, body);
255 static std::vector<uint8_t> build_delete_request(
256 const std::vector<uint8_t>& body)
258 return build_request(HTTP_DELETE, body);
262 static std::vector<uint8_t> build_get_header(
const std::vector<uint8_t>& body)
264 return build_header(HTTP_GET, body);
267 static std::vector<uint8_t> build_get_request(
268 const std::vector<uint8_t>& body)
270 return build_request(HTTP_GET, body);
274 static std::vector<uint8_t> build_post_header(
275 const std::vector<uint8_t>& body)
277 return build_header(HTTP_POST, body);
280 static std::vector<uint8_t> build_post_request(
281 const std::vector<uint8_t>& body)
283 return build_request(HTTP_POST, body);
287 static std::vector<uint8_t> build_put_header(
const std::vector<uint8_t>& body)
289 return build_header(HTTP_PUT, body);
292 static std::vector<uint8_t> build_put_request(
293 const std::vector<uint8_t>& body)
295 return build_request(HTTP_PUT, body);
297#pragma clang diagnostic pop
Definition http_builder.h:31
ccf::http::HeaderMap headers
Definition http_builder.h:33
const uint8_t * body
Definition http_builder.h:34
const ccf::http::HeaderMap & get_headers() const
Definition http_builder.h:40
void set_body(const uint8_t *b, size_t s, bool overwrite_content_length=true)
Definition http_builder.h:85
size_t get_content_length() const
Definition http_builder.h:57
void set_header(std::string k, const std::string &v)
Definition http_builder.h:45
void set_body(const std::string &s, bool overwrite_content_length=true)
Definition http_builder.h:100
void set_body(const std::vector< uint8_t > *b, bool overwrite_content_length=true)
Definition http_builder.h:72
const uint8_t * get_content_data() const
Definition http_builder.h:67
size_t body_size
Definition http_builder.h:35
void clear_headers()
Definition http_builder.h:52
Definition http_builder.h:117
std::vector< uint8_t > build_request(bool header_only=false) const
Definition http_builder.h:175
std::string get_path() const
Definition http_builder.h:152
std::string get_formatted_query() const
Definition http_builder.h:162
void set_method(llhttp_method m)
Definition http_builder.h:130
llhttp_method get_method() const
Definition http_builder.h:135
Request(const std::string_view &p="/", llhttp_method m=HTTP_POST)
Definition http_builder.h:124
void set_query_param(const std::string &k, const std::string &v)
Definition http_builder.h:157
void set_path(const std::string_view &p)
Definition http_builder.h:140
Definition http_builder.h:200
std::vector< uint8_t > build_response(bool header_only=false) const
Definition http_builder.h:207
Response(ccf::http_status s=HTTP_STATUS_OK)
Definition http_builder.h:205
std::map< std::string, std::string, std::less<> > HeaderMap
Definition http_header_map.h:10
llhttp_status http_status
Definition http_status.h:9
Definition error_reporter.h:6