@@ -18,7 +18,8 @@ using namespace OpenShock;
1818HTTP::HTTPClientState::HTTPClientState (uint32_t timeoutMs)
1919 : m_handle(nullptr )
2020 , m_reading(false )
21- , m_headers(false )
21+ , m_retryAfterSeconds(0 )
22+ , m_headers()
2223{
2324 esp_http_client_config_t cfg;
2425 memset (&cfg, 0 , sizeof (cfg));
@@ -44,34 +45,45 @@ HTTP::HTTPClientState::~HTTPClientState()
4445 }
4546}
4647
47- std::variant< HTTP::HTTPClientState::StartRequestResult, HTTP::HTTPError> HTTP::HTTPClientState::StartRequest (esp_http_client_method_t method, const char * url, int writeLen)
48+ HTTP::HTTPClientState::StartRequestResult HTTP::HTTPClientState::StartRequest (esp_http_client_method_t method, const char * url, int writeLen)
4849{
4950 esp_err_t err;
5051
52+ m_headers.clear ();
53+
5154 err = esp_http_client_set_url (m_handle, url);
52- if (err != ESP_OK) return HTTPError::InvalidUrl;
55+ if (err != ESP_OK) return { . error = HTTPError::InvalidUrl } ;
5356
5457 err = esp_http_client_set_method (m_handle, method);
55- if (err != ESP_OK) return HTTPError::InvalidHttpMethod;
58+ if (err != ESP_OK) return { . error = HTTPError::InvalidHttpMethod } ;
5659
5760 err = esp_http_client_open (m_handle, writeLen);
58- if (err != ESP_OK) return HTTPError::NetworkError;
61+ if (err != ESP_OK) return { . error = HTTPError::NetworkError } ;
5962
6063 int contentLength = esp_http_client_fetch_headers (m_handle);
61- if (contentLength == ESP_FAIL) return HTTPError::NetworkError;
64+ if (contentLength == ESP_FAIL) return { .error = HTTPError::NetworkError };
65+
66+ if (m_retryAfterSeconds > 0 ) {
67+ return { .error = HTTPError::RateLimited, .retryAfterSeconds = m_retryAfterSeconds };
68+ }
6269
6370 bool isChunked = false ;
6471 if (contentLength == 0 ) {
6572 isChunked = esp_http_client_is_chunked_response (m_handle);
6673 }
6774
68- int code = esp_http_client_get_status_code (m_handle);
69- if (code < 0 || code > 599 ) {
70- OS_LOGE (TAG, " Returned statusCode is invalid (%i)" , code );
71- return HTTPError::NetworkError;
75+ int statusCode = esp_http_client_get_status_code (m_handle);
76+ if (statusCode < 0 || statusCode > 599 ) {
77+ OS_LOGE (TAG, " Returned statusCode is invalid (%i)" , statusCode );
78+ return { . error = HTTPError::NetworkError } ;
7279 }
7380
74- return StartRequestResult {static_cast <uint16_t >(code), isChunked, static_cast <uint32_t >(contentLength)};
81+ return StartRequestResult {
82+ .statusCode = static_cast <uint16_t >(statusCode),
83+ .isChunked = isChunked,
84+ .contentLength = static_cast <uint32_t >(contentLength),
85+ .headers = std::move (m_headers)
86+ };
7587}
7688
7789HTTP::ReadResult<uint32_t > HTTP::HTTPClientState::ReadStreamImpl (DownloadCallback cb)
@@ -181,16 +193,16 @@ esp_err_t HTTP::HTTPClientState::EventHeaderHandler(std::string key, std::string
181193 OS_LOGI (TAG, " Got header_received event: %.*s - %.*s" , key.length (), key.c_str (), key.length (), key.c_str ());
182194
183195 if (key == " Retry-After" ) {
184- uint32_t seconds;
196+ uint32_t seconds = 0 ;
185197 if (!Convert::ToUint32 (value, seconds) || seconds <= 0 ) {
186198 seconds = 15 ;
187199 }
188200
189201 OS_LOGI (TAG, " Retry-After: %d seconds, applying delay to rate limiter" , seconds);
190- // TODO: Inform caller
202+ m_retryAfterSeconds = seconds;
191203 }
192204
193- m_headers. emplace_back ( std::move ( key), std::move (value) );
205+ m_headers[ key] = std::move (value);
194206
195207 return ESP_OK;
196208}
0 commit comments