19namespace http_request {
83class HttpRequestComponent;
92 virtual int read(uint8_t *buf,
size_t max_len) = 0;
93 virtual void end() = 0;
116 void process(
const std::shared_ptr<HttpContainer> &container, std::string &response_body) {
117 this->
trigger(container, response_body);
133 std::shared_ptr<HttpContainer>
get(
const std::string &url) {
return this->
start(url,
"GET",
"", {}); }
134 std::shared_ptr<HttpContainer>
get(
const std::string &url,
const std::list<Header> &request_headers) {
135 return this->
start(url,
"GET",
"", request_headers);
137 std::shared_ptr<HttpContainer>
get(
const std::string &url,
const std::list<Header> &request_headers,
138 const std::set<std::string> &collect_headers) {
139 return this->
start(url,
"GET",
"", request_headers, collect_headers);
141 std::shared_ptr<HttpContainer>
post(
const std::string &url,
const std::string &body) {
142 return this->
start(url,
"POST", body, {});
144 std::shared_ptr<HttpContainer>
post(
const std::string &url,
const std::string &body,
145 const std::list<Header> &request_headers) {
146 return this->
start(url,
"POST", body, request_headers);
148 std::shared_ptr<HttpContainer>
post(
const std::string &url,
const std::string &body,
149 const std::list<Header> &request_headers,
150 const std::set<std::string> &collect_headers) {
151 return this->
start(url,
"POST", body, request_headers, collect_headers);
154 std::shared_ptr<HttpContainer>
start(
const std::string &url,
const std::string &method,
const std::string &body,
155 const std::list<Header> &request_headers) {
156 return this->
start(url, method, body, request_headers, {});
159 std::shared_ptr<HttpContainer>
start(
const std::string &url,
const std::string &method,
const std::string &body,
160 const std::list<Header> &request_headers,
161 const std::set<std::string> &collect_headers) {
162 std::set<std::string> lower_case_collect_headers;
163 for (
const std::string &collect_header : collect_headers) {
164 lower_case_collect_headers.insert(
str_lower_case(collect_header));
166 return this->
perform(url, method, body, request_headers, lower_case_collect_headers);
170 virtual std::shared_ptr<HttpContainer>
perform(
const std::string &url,
const std::string &method,
171 const std::string &body,
const std::list<Header> &request_headers,
172 const std::set<std::string> &collect_headers) = 0;
186#ifdef USE_HTTP_REQUEST_RESPONSE
200#ifdef USE_HTTP_REQUEST_RESPONSE
213 void play(
const Ts &...
x)
override {
215 if (this->body_.has_value()) {
216 body = this->body_.value(
x...);
218 if (!this->
json_.empty()) {
226 std::list<Header> request_headers;
228 auto val = item.second;
230 header.
name = item.first;
232 request_headers.push_back(header);
235 auto container = this->
parent_->
start(this->url_.value(
x...), this->method_.value(
x...), body, request_headers,
236 this->collect_headers_);
238 auto captured_args = std::make_tuple(
x...);
240 if (container ==
nullptr) {
241 std::apply([
this](Ts... captured_args_inner) { this->error_trigger_->trigger(captured_args_inner...); },
246 size_t content_length = container->content_length;
249#ifdef USE_HTTP_REQUEST_RESPONSE
250 if (this->capture_response_.value(
x...)) {
251 std::string response_body;
253 uint8_t *buf = allocator.
allocate(max_length);
254 if (buf !=
nullptr) {
255 size_t read_index = 0;
256 while (container->get_bytes_read() < max_length) {
257 int read = container->read(buf + read_index, std::min<size_t>(max_length - read_index, 512));
262 response_body.reserve(read_index);
263 response_body.assign((
char *) buf, read_index);
267 [
this, &container, &response_body](Ts... captured_args_inner) {
268 this->success_trigger_with_response_->trigger(container, response_body, captured_args_inner...);
274 std::apply([
this, &container](
275 Ts... captured_args_inner) { this->success_trigger_->trigger(container, captured_args_inner...); },
283 for (
const auto &item : this->
json_) {
284 auto val = item.second;
285 root[item.first] =
val.value(
x...);
294#ifdef USE_HTTP_REQUEST_RESPONSE
void feed_wdt(uint32_t time=0)
Helper class to easily give an object a parent of type T.
An STL allocator that uses SPI or internal RAM.
void deallocate(T *p, size_t n)
void trigger(const Ts &...x)
std::string get_response_header(const std::string &header_name)
std::map< std::string, std::list< std::string > > get_response_headers()
Get response headers.
virtual int read(uint8_t *buf, size_t max_len)=0
virtual ~HttpContainer()=default
std::map< std::string, std::list< std::string > > response_headers_
size_t get_bytes_read() const
void set_secure(bool secure)
float get_setup_priority() const override
std::shared_ptr< HttpContainer > post(const std::string &url, const std::string &body, const std::list< Header > &request_headers, const std::set< std::string > &collect_headers)
uint32_t get_watchdog_timeout() const
std::shared_ptr< HttpContainer > post(const std::string &url, const std::string &body)
std::shared_ptr< HttpContainer > post(const std::string &url, const std::string &body, const std::list< Header > &request_headers)
void set_useragent(const char *useragent)
virtual std::shared_ptr< HttpContainer > perform(const std::string &url, const std::string &method, const std::string &body, const std::list< Header > &request_headers, const std::set< std::string > &collect_headers)=0
std::shared_ptr< HttpContainer > start(const std::string &url, const std::string &method, const std::string &body, const std::list< Header > &request_headers, const std::set< std::string > &collect_headers)
std::shared_ptr< HttpContainer > get(const std::string &url, const std::list< Header > &request_headers)
uint32_t watchdog_timeout_
void set_follow_redirects(bool follow_redirects)
std::shared_ptr< HttpContainer > start(const std::string &url, const std::string &method, const std::string &body, const std::list< Header > &request_headers)
void set_redirect_limit(uint16_t limit)
void set_watchdog_timeout(uint32_t watchdog_timeout)
void set_timeout(uint32_t timeout)
std::shared_ptr< HttpContainer > get(const std::string &url, const std::list< Header > &request_headers, const std::set< std::string > &collect_headers)
std::shared_ptr< HttpContainer > get(const std::string &url)
void dump_config() override
void process(const std::shared_ptr< HttpContainer > &container, std::string &response_body)
void set_max_response_buffer_size(size_t max_response_buffer_size)
void play(const Ts &...x) override
std::set< std::string > collect_headers_
Trigger< Ts... > * error_trigger_
HttpRequestComponent * parent_
Trigger< std::shared_ptr< HttpContainer >, Ts... > * success_trigger_
std::map< const char *, TemplatableValue< std::string, Ts... > > json_
method capture_response void add_request_header(const char *key, TemplatableValue< const char *, Ts... > value)
TEMPLATABLE_VALUE(std::string, url) TEMPLATABLE_VALUE(const char *
void add_collect_header(const char *value)
Trigger< std::shared_ptr< HttpContainer >, std::string &, Ts... > * success_trigger_with_response_
Trigger< std::shared_ptr< HttpContainer >, std::string &, Ts... > * get_success_trigger_with_response() const
std::function< void(Ts..., JsonObject)> json_func_
Trigger< std::shared_ptr< HttpContainer >, Ts... > * get_success_trigger() const
void encode_json_func_(Ts... x, JsonObject root)
void set_json(std::function< void(Ts..., JsonObject)> json_func)
void add_json(const char *key, TemplatableValue< std::string, Ts... > value)
void encode_json_(Ts... x, JsonObject root)
Trigger< Ts... > * get_error_trigger() const
size_t max_response_buffer_size_
std::map< const char *, TemplatableValue< const char *, Ts... > > request_headers_
HttpRequestSendAction(HttpRequestComponent *parent)
@ HTTP_STATUS_PARTIAL_CONTENT
@ HTTP_STATUS_LENGTH_REQUIRED
@ HTTP_STATUS_PERMANENT_REDIRECT
@ HTTP_STATUS_METHOD_NOT_ALLOWED
@ HTTP_STATUS_NOT_MODIFIED
@ HTTP_STATUS_INTERNAL_ERROR
@ HTTP_STATUS_UNAUTHORIZED
@ HTTP_STATUS_MULTIPLE_CHOICES
@ HTTP_STATUS_NOT_ACCEPTABLE
@ HTTP_STATUS_TEMPORARY_REDIRECT
@ HTTP_STATUS_BAD_REQUEST
@ HTTP_STATUS_MOVED_PERMANENTLY
bool is_success(int const status)
Checks if the given HTTP status code indicates a successful request.
bool is_redirect(int const status)
Returns true if the HTTP status code is a redirect.
std::string build_json(const json_build_t &f)
Build a JSON string with the provided json build function.
const float AFTER_WIFI
For components that should be initialized after WiFi is connected.
Providing packet encoding functions for exchanging data with a remote host.
std::string str_lower_case(const std::string &str)
Convert the string to lower case.
void IRAM_ATTR HOT yield()
Application App
Global storage of Application pointer - only one Application can exist.