From c12c9e97c2574896ee71b4c686202cb9ccdc86d4 Mon Sep 17 00:00:00 2001 From: Nikolay Vasilchuk Date: Thu, 3 Dec 2020 21:37:00 +0300 Subject: [PATCH] HTTP Request fix reusing connections. (#1383) --- .../components/http_request/http_request.cpp | 18 ++++++++++++++++-- esphome/components/http_request/http_request.h | 6 ++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/esphome/components/http_request/http_request.cpp b/esphome/components/http_request/http_request.cpp index 46b0910b5e..0e73a7956a 100644 --- a/esphome/components/http_request/http_request.cpp +++ b/esphome/components/http_request/http_request.cpp @@ -12,9 +12,20 @@ void HttpRequestComponent::dump_config() { ESP_LOGCONFIG(TAG, " User-Agent: %s", this->useragent_); } +void HttpRequestComponent::set_url(std::string url) { + this->url_ = url; + this->secure_ = url.compare(0, 6, "https:") == 0; + + if (!this->last_url_.empty() && this->url_ != this->last_url_) { + // Close connection if url has been changed + this->client_.setReuse(false); + this->client_.end(); + } + this->client_.setReuse(true); +} + void HttpRequestComponent::send() { bool begin_status = false; - this->client_.setReuse(true); const String url = this->url_.c_str(); #ifdef ARDUINO_ARCH_ESP32 begin_status = this->client_.begin(url); @@ -78,7 +89,10 @@ WiFiClient *HttpRequestComponent::get_wifi_client_() { } #endif -void HttpRequestComponent::close() { this->client_.end(); } +void HttpRequestComponent::close() { + this->last_url_ = this->url_; + this->client_.end(); +} const char *HttpRequestComponent::get_string() { static const String STR = this->client_.getString(); diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index e6c0510b32..c69683db0e 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -27,10 +27,7 @@ class HttpRequestComponent : public Component { void dump_config() override; float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } - void set_url(std::string url) { - this->url_ = url; - this->secure_ = url.compare(0, 6, "https:") == 0; - } + void set_url(std::string url); void set_method(const char *method) { this->method_ = method; } void set_useragent(const char *useragent) { this->useragent_ = useragent; } void set_timeout(uint16_t timeout) { this->timeout_ = timeout; } @@ -43,6 +40,7 @@ class HttpRequestComponent : public Component { protected: HTTPClient client_{}; std::string url_; + std::string last_url_; const char *method_; const char *useragent_{nullptr}; bool secure_;