Skip to content

Commit da86842

Browse files
committed
Fixed url assignment issues
1 parent c9f2094 commit da86842

File tree

12 files changed

+77
-81
lines changed

12 files changed

+77
-81
lines changed

include/http/HTTPClient.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "http/HTTPClientState.h"
55
#include "http/HTTPResponse.h"
66
#include "http/JsonResponse.h"
7+
#include "RateLimiter.h"
78

89
#include <esp_err.h>
910

@@ -16,24 +17,28 @@ namespace OpenShock::HTTP {
1617
DISABLE_MOVE(HTTPClient);
1718

1819
public:
19-
HTTPClient(uint32_t timeoutMs = 10'000)
20-
: m_state(std::make_shared<HTTPClientState>(timeoutMs))
20+
HTTPClient(const char* url, uint32_t timeoutMs = 10'000)
21+
: m_state(std::make_shared<HTTPClientState>(url, timeoutMs))
2122
{
2223
}
2324

25+
inline esp_err_t SetUrl(const char* url) {
26+
return m_state->SetUrl(url);
27+
}
28+
2429
inline esp_err_t SetHeader(const char* key, const char* value) {
2530
return m_state->SetHeader(key, value);
2631
}
2732

28-
inline HTTPResponse Get(const char* url) {
29-
auto response = GetInternal(url);
33+
inline HTTPResponse Get() {
34+
auto response = m_state->StartRequest(HTTP_METHOD_GET, 0);
3035
if (response.error != HTTPError::None) return HTTP::HTTPResponse(response.error, response.retryAfterSeconds);
3136

3237
return HTTP::HTTPResponse(m_state, response.statusCode, response.contentLength, std::move(response.headers));
3338
}
3439
template<typename T>
35-
inline JsonResponse<T> GetJson(const char* url, JsonParserFn<T> jsonParser) {
36-
auto response = GetInternal(url);
40+
inline JsonResponse<T> GetJson(JsonParserFn<T> jsonParser) {
41+
auto response = m_state->StartRequest(HTTP_METHOD_GET, 0);
3742
if (response.error != HTTPError::None) return HTTP::JsonResponse<T>(response.error, response.retryAfterSeconds);
3843

3944
return HTTP::JsonResponse(m_state, jsonParser, response.statusCode, response.contentLength, std::move(response.headers));
@@ -43,8 +48,6 @@ namespace OpenShock::HTTP {
4348
return m_state->Close();
4449
}
4550
private:
46-
HTTPClientState::StartRequestResult GetInternal(const char* url);
47-
4851
std::shared_ptr<HTTPClientState> m_state;
4952
};
5053
} // namespace OpenShock::HTTP

include/http/HTTPClientState.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ namespace OpenShock::HTTP {
1919
DISABLE_COPY(HTTPClientState);
2020
DISABLE_MOVE(HTTPClientState);
2121
public:
22-
HTTPClientState(uint32_t timeoutMs);
22+
HTTPClientState(const char* url, uint32_t timeoutMs);
2323
~HTTPClientState();
2424

25-
inline esp_err_t SetHeader(const char* key, const char* value) {
26-
return esp_http_client_set_header(m_handle, key, value);
27-
}
25+
esp_err_t SetUrl(const char* url);
26+
27+
esp_err_t SetHeader(const char* key, const char* value);
2828

2929
struct HeaderEntry {
3030
std::string key;
@@ -40,7 +40,7 @@ namespace OpenShock::HTTP {
4040
std::map<std::string, std::string> headers{};
4141
};
4242

43-
StartRequestResult StartRequest(esp_http_client_method_t method, const char* url, int writeLen);
43+
StartRequestResult StartRequest(esp_http_client_method_t method, int writeLen);
4444

4545
// High-throughput streaming logic
4646
ReadResult<uint32_t> ReadStreamImpl(DownloadCallback cb);
@@ -71,6 +71,7 @@ namespace OpenShock::HTTP {
7171
}
7272

7373
inline esp_err_t Close() {
74+
if (m_handle == nullptr) return ESP_FAIL;
7475
return esp_http_client_close(m_handle);
7576
}
7677
private:

include/http/JsonAPI.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ namespace OpenShock::HTTP::JsonAPI {
1010
/// @brief Links the hub to the account with the given account link code, returns the hub token. Valid response codes: 200, 404
1111
/// @param hubToken
1212
/// @return
13-
JsonResponse<Serialization::JsonAPI::AccountLinkResponse> LinkAccount(HTTP::HTTPClient& client, std::string_view accountLinkCode);
13+
JsonResponse<Serialization::JsonAPI::AccountLinkResponse> LinkAccount(std::string_view accountLinkCode);
1414

1515
/// @brief Gets the hub info for the given hub token. Valid response codes: 200, 401
1616
/// @param hubToken
1717
/// @return
18-
JsonResponse<Serialization::JsonAPI::HubInfoResponse> GetHubInfo(HTTP::HTTPClient& client, const char* hubToken);
18+
JsonResponse<Serialization::JsonAPI::HubInfoResponse> GetHubInfo(const char* hubToken);
1919

2020
/// @brief Requests a Live Control Gateway to connect to. Valid response codes: 200, 401
2121
/// @param hubToken
2222
/// @return
23-
JsonResponse<Serialization::JsonAPI::AssignLcgResponse> AssignLcg(HTTP::HTTPClient& client, const char* hubToken);
23+
JsonResponse<Serialization::JsonAPI::AssignLcgResponse> AssignLcg(const char* hubToken);
2424
} // namespace OpenShock::HTTP::JsonAPI

platformio.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ build_flags =
4444
-Wno-unused
4545
-Wno-unknown-pragmas
4646
-DCONFIG_ASYNC_TCP_QUEUE_SIZE=256
47+
-DCONFIG_ESP_TLS_INSECURE=y
48+
-DCONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y
4749
build_unflags =
4850
-std=gnu++11
4951
lib_deps =

src/GatewayConnectionManager.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ AccountLinkResultCode GatewayConnectionManager::Link(std::string_view linkCode)
105105
return AccountLinkResultCode::InvalidCode;
106106
}
107107

108-
HTTP::HTTPClient client;
109-
auto response = HTTP::JsonAPI::LinkAccount(client, linkCode);
108+
auto response = HTTP::JsonAPI::LinkAccount(linkCode);
110109
if (!response.Ok()) {
111110

112111
if (response.Error() == HTTP::HTTPError::RateLimited) {
@@ -183,8 +182,7 @@ bool FetchHubInfo(const char* authToken)
183182
return false;
184183
}
185184

186-
HTTP::HTTPClient client;
187-
auto response = HTTP::JsonAPI::GetHubInfo(client, authToken);
185+
auto response = HTTP::JsonAPI::GetHubInfo(authToken);
188186
if (!response.Ok()) {
189187
if (response.Error() == HTTP::HTTPError::RateLimited) {
190188
return false; // Just return false, don't spam the console with errors
@@ -254,8 +252,7 @@ bool StartConnectingToLCG()
254252
return false;
255253
}
256254

257-
HTTP::HTTPClient client;
258-
auto response = HTTP::JsonAPI::AssignLcg(client, authToken.c_str());
255+
auto response = HTTP::JsonAPI::AssignLcg(authToken.c_str());
259256
if (!response.Ok()) {
260257
if (response.Error() == HTTP::HTTPError::RateLimited) {
261258
return false; // Just return false, don't spam the console with errors

src/OtaUpdateManager.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,8 @@ static void otaum_updatetask(void* arg)
426426

427427
static bool _tryGetStringList(const char* url, std::vector<std::string>& list)
428428
{
429-
HTTP::HTTPClient client;
430-
auto response = client.Get(url);
429+
HTTP::HTTPClient client(url);
430+
auto response = client.Get();
431431
if (!response.Ok()) {
432432
OS_LOGE(TAG, "Failed to fetch list");
433433
return false;
@@ -550,8 +550,8 @@ bool OtaUpdateManager::TryGetFirmwareVersion(OtaUpdateChannel channel, OpenShock
550550

551551
OS_LOGD(TAG, "Fetching firmware version from %s", channelIndexUrl);
552552

553-
HTTP::HTTPClient client;
554-
auto response = client.Get(channelIndexUrl);
553+
HTTP::HTTPClient client(channelIndexUrl);
554+
auto response = client.Get();
555555
if (!response.Ok()) {
556556
OS_LOGE(TAG, "Failed to fetch firmware version");
557557
return false;
@@ -627,8 +627,8 @@ bool OtaUpdateManager::TryGetFirmwareRelease(const OpenShock::SemVer& version, F
627627
}
628628

629629
// Fetch hashes.
630-
HTTP::HTTPClient client;
631-
auto response = client.Get(sha256HashesUrl.c_str());
630+
HTTP::HTTPClient client(sha256HashesUrl.c_str());
631+
auto response = client.Get();
632632
if (!response.Ok()) {
633633
OS_LOGE(TAG, "Failed to fetch hashes");
634634
return false;

src/http/HTTPClient.cpp

Lines changed: 0 additions & 28 deletions
This file was deleted.

src/http/HTTPClientState.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ static const uint32_t HTTP_DOWNLOAD_SIZE_LIMIT = 200 * 1024 * 1024; // 200 MB
1515

1616
using namespace OpenShock;
1717

18-
HTTP::HTTPClientState::HTTPClientState(uint32_t timeoutMs)
18+
HTTP::HTTPClientState::HTTPClientState(const char* url, uint32_t timeoutMs)
1919
: m_handle(nullptr)
2020
, m_reading(false)
2121
, m_retryAfterSeconds(0)
@@ -24,15 +24,15 @@ HTTP::HTTPClientState::HTTPClientState(uint32_t timeoutMs)
2424
esp_http_client_config_t cfg;
2525
memset(&cfg, 0, sizeof(cfg));
2626

27+
cfg.url = url;
2728
cfg.user_agent = OpenShock::Constants::FW_USERAGENT;
2829
cfg.timeout_ms = static_cast<int>(std::min<uint32_t>(timeoutMs, INT32_MAX));
2930
cfg.disable_auto_redirect = true;
3031
cfg.event_handler = HTTPClientState::EventHandler;
3132
cfg.transport_type = HTTP_TRANSPORT_OVER_SSL;
3233
cfg.user_data = reinterpret_cast<void*>(this);
3334
cfg.is_async = false;
34-
cfg.use_global_ca_store = true;
35-
#warning This still uses SSL, upgrade to TLS! (latest ESP-IDF)
35+
cfg.use_global_ca_store = false;
3636

3737
m_handle = esp_http_client_init(&cfg);
3838
}
@@ -45,8 +45,30 @@ HTTP::HTTPClientState::~HTTPClientState()
4545
}
4646
}
4747

48-
HTTP::HTTPClientState::StartRequestResult HTTP::HTTPClientState::StartRequest(esp_http_client_method_t method, const char* url, int writeLen)
48+
esp_err_t HTTP::HTTPClientState::SetUrl(const char* url)
4949
{
50+
if (m_handle == nullptr) {
51+
return ESP_FAIL;
52+
}
53+
54+
return esp_http_client_set_url(m_handle, url);
55+
}
56+
57+
esp_err_t HTTP::HTTPClientState::SetHeader(const char* key, const char* value)
58+
{
59+
if (m_handle == nullptr) {
60+
return ESP_FAIL;
61+
}
62+
63+
return esp_http_client_set_header(m_handle, key, value);
64+
}
65+
66+
HTTP::HTTPClientState::StartRequestResult HTTP::HTTPClientState::StartRequest(esp_http_client_method_t method, int writeLen)
67+
{
68+
if (m_handle == nullptr) {
69+
return { .error = HTTPError::ConnectionClosed };
70+
}
71+
5072
esp_err_t err;
5173

5274
if (m_reading) {
@@ -56,9 +78,6 @@ HTTP::HTTPClientState::StartRequestResult HTTP::HTTPClientState::StartRequest(es
5678
m_retryAfterSeconds = 0;
5779
m_headers.clear();
5880

59-
err = esp_http_client_set_url(m_handle, url);
60-
if (err != ESP_OK) return { .error = HTTPError::InvalidUrl };
61-
6281
err = esp_http_client_set_method(m_handle, method);
6382
if (err != ESP_OK) return { .error = HTTPError::InvalidHttpMethod };
6483

src/http/JsonAPI.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
using namespace OpenShock;
99

10-
HTTP::JsonResponse<Serialization::JsonAPI::AccountLinkResponse> HTTP::JsonAPI::LinkAccount(HTTP::HTTPClient& client, std::string_view accountLinkCode)
10+
HTTP::JsonResponse<Serialization::JsonAPI::AccountLinkResponse> HTTP::JsonAPI::LinkAccount(std::string_view accountLinkCode)
1111
{
1212
std::string domain;
1313
if (!Config::GetBackendDomain(domain)) {
@@ -17,12 +17,14 @@ HTTP::JsonResponse<Serialization::JsonAPI::AccountLinkResponse> HTTP::JsonAPI::L
1717
char uri[OPENSHOCK_URI_BUFFER_SIZE];
1818
sprintf(uri, "https://%s/1/device/pair/%.*s", domain.c_str(), accountLinkCode.length(), accountLinkCode.data());
1919

20+
HTTP::HTTPClient client(uri);
21+
2022
client.SetHeader("Accept", "application/json");
2123

22-
return client.GetJson<Serialization::JsonAPI::AccountLinkResponse>(uri, Serialization::JsonAPI::ParseAccountLinkJsonResponse);
24+
return client.GetJson<Serialization::JsonAPI::AccountLinkResponse>(Serialization::JsonAPI::ParseAccountLinkJsonResponse);
2325
}
2426

25-
HTTP::JsonResponse<Serialization::JsonAPI::HubInfoResponse> HTTP::JsonAPI::GetHubInfo(HTTP::HTTPClient& client, const char* hubToken)
27+
HTTP::JsonResponse<Serialization::JsonAPI::HubInfoResponse> HTTP::JsonAPI::GetHubInfo(const char* hubToken)
2628
{
2729
std::string domain;
2830
if (!Config::GetBackendDomain(domain)) {
@@ -32,13 +34,15 @@ HTTP::JsonResponse<Serialization::JsonAPI::HubInfoResponse> HTTP::JsonAPI::GetHu
3234
char uri[OPENSHOCK_URI_BUFFER_SIZE];
3335
sprintf(uri, "https://%s/1/device/self", domain.c_str());
3436

37+
HTTP::HTTPClient client(uri);
38+
3539
client.SetHeader("Accept", "application/json");
3640
client.SetHeader("DeviceToken", hubToken);
3741

38-
return client.GetJson<Serialization::JsonAPI::HubInfoResponse>(uri, Serialization::JsonAPI::ParseHubInfoJsonResponse);
42+
return client.GetJson<Serialization::JsonAPI::HubInfoResponse>(Serialization::JsonAPI::ParseHubInfoJsonResponse);
3943
}
4044

41-
HTTP::JsonResponse<Serialization::JsonAPI::AssignLcgResponse> HTTP::JsonAPI::AssignLcg(HTTP::HTTPClient& client, const char* hubToken)
45+
HTTP::JsonResponse<Serialization::JsonAPI::AssignLcgResponse> HTTP::JsonAPI::AssignLcg(const char* hubToken)
4246
{
4347
std::string domain;
4448
if (!Config::GetBackendDomain(domain)) {
@@ -48,8 +52,10 @@ HTTP::JsonResponse<Serialization::JsonAPI::AssignLcgResponse> HTTP::JsonAPI::Ass
4852
char uri[OPENSHOCK_URI_BUFFER_SIZE];
4953
sprintf(uri, "https://%s/2/device/assignLCG?version=2", domain.c_str());
5054

55+
HTTP::HTTPClient client(uri);
56+
5157
client.SetHeader("Accept", "application/json");
5258
client.SetHeader("DeviceToken", hubToken);
5359

54-
return client.GetJson<Serialization::JsonAPI::AssignLcgResponse>(uri, Serialization::JsonAPI::ParseAssignLcgJsonResponse);
60+
return client.GetJson<Serialization::JsonAPI::AssignLcgResponse>(Serialization::JsonAPI::ParseAssignLcgJsonResponse);
5561
}

src/serial/command_handlers/authtoken.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,11 @@ void _handleAuthtokenCommand(std::string_view arg, bool isAutomated) {
2121

2222
std::string token = std::string(arg);
2323

24-
// Scope to immediately destroy client after use
25-
{
26-
OpenShock::HTTP::HTTPClient client;
27-
auto apiResponse = OpenShock::HTTP::JsonAPI::GetHubInfo(client, token.c_str());
24+
auto apiResponse = OpenShock::HTTP::JsonAPI::GetHubInfo(token.c_str());
2825

29-
if (apiResponse.StatusCode() == 401) {
30-
SERPR_ERROR("Invalid auth token, refusing to save it!");
31-
return;
32-
}
26+
if (apiResponse.StatusCode() == 401) {
27+
SERPR_ERROR("Invalid auth token, refusing to save it!");
28+
return;
3329
}
3430

3531
// If we have some other kind of request fault just set it anyway, we probably arent connected to a network

0 commit comments

Comments
 (0)