diff --git a/lib/tdeck_ui/Hardware/TDeck/MapTileHttpArduino.cpp b/lib/tdeck_ui/Hardware/TDeck/MapTileHttpArduino.cpp index 54b1a173..b7ef9b39 100644 --- a/lib/tdeck_ui/Hardware/TDeck/MapTileHttpArduino.cpp +++ b/lib/tdeck_ui/Hardware/TDeck/MapTileHttpArduino.cpp @@ -34,7 +34,10 @@ TileTransportResult MapTileHttpArduino::start(const char* url, const char* user_ client_.setTimeout(read_timeout_ms); http_.setConnectTimeout(boundedConnectTimeout(connect_timeout_ms)); http_.setTimeout(boundedReadTimeout(read_timeout_ms)); - http_.useHTTP10(true); // deterministic EOF for responses without Content-Length + // Keep the single visible-tile TLS session alive across sequential requests. + // Repeated handshakes fragment the ESP32-S3 internal heap and can exhaust the + // hardware SHA/AES allocation budget before the six-tile viewport completes. + http_.setReuse(true); http_.setUserAgent(user_agent); const char* response_headers[] = {"Content-Type"}; http_.collectHeaders(response_headers, 1U); diff --git a/tests/build_scripts/test_map_tile_downloader_contract.py b/tests/build_scripts/test_map_tile_downloader_contract.py index 7efc338e..214d189c 100644 --- a/tests/build_scripts/test_map_tile_downloader_contract.py +++ b/tests/build_scripts/test_map_tile_downloader_contract.py @@ -35,6 +35,8 @@ def test_https_adapter_verifies_peer_with_explicit_ca_and_has_no_credentials(): assert "setInsecure" not in source assert "setConnectTimeout" in source assert "setTimeout" in source + assert "setReuse(true)" in source + assert "useHTTP10(true)" not in source for forbidden in ("Authorization", "Cookie", "username", "password", "SD.begin", "format(", "LittleFS"): assert forbidden not in source