@@ -113,9 +113,6 @@ int mock_poll_read_callback(esp_transport_handle_t t, int timeout_ms, int num_ca
113113
114114int mock_valid_read_callback (esp_transport_handle_t transport, char *buffer, int len, int timeout_ms, int num_call)
115115{
116- if (num_call) {
117- return 0 ;
118- }
119116 std::string websocket_response = make_response ();
120117 std::memcpy (buffer, websocket_response.data (), websocket_response.size ());
121118 return websocket_response.size ();
@@ -160,6 +157,21 @@ TEST_CASE("WebSocket Transport Connection", "[success]")
160157 unique_transport websocket_transport{esp_transport_ws_init (parent_handle.get ()), esp_transport_destroy};
161158 REQUIRE (websocket_transport);
162159
160+ // Allocate buffer for response header
161+ constexpr size_t response_header_len = 1024 ;
162+ std::vector<char > response_header_buffer (response_header_len);
163+ esp_transport_ws_config_t ws_config = {
164+ .ws_path = " /" ,
165+ .sub_protocol = nullptr ,
166+ .user_agent = nullptr ,
167+ .headers = nullptr ,
168+ .auth = nullptr ,
169+ .response_headers = response_header_buffer.data (),
170+ .response_headers_len = response_header_len,
171+ .propagate_control_frames = false
172+ };
173+ REQUIRE (esp_transport_ws_set_config (websocket_transport.get (), &ws_config) == ESP_OK);
174+
163175 fmt::print (" Attempting to connect to WebSocket\n " );
164176 esp_crypto_sha1_ExpectAnyArgsAndReturn (0 );
165177 esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
@@ -176,6 +188,11 @@ TEST_CASE("WebSocket Transport Connection", "[success]")
176188 mock_destroy_ExpectAnyArgsAndReturn (ESP_OK);
177189
178190 REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == 0 );
191+
192+ // Verify the response header was stored correctly
193+ std::string expected_header = make_response ();
194+ REQUIRE (std::string (response_header_buffer.data ()) == expected_header);
195+
179196 char buffer[WS_BUFFER_SIZE];
180197 int read_len = 0 ;
181198 read_len = esp_transport_read (websocket_transport.get (), &buffer[read_len], WS_BUFFER_SIZE - read_len, timeout);
@@ -196,6 +213,14 @@ TEST_CASE("WebSocket Transport Connection", "[success]")
196213
197214 REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == 0 );
198215
216+ // Verify the response header was stored correctly
217+ std::string expected_header = " HTTP/1.1 101 Switching Protocols\r\n "
218+ " Upgrade: websocket\r\n "
219+ " Connection: Upgrade\r\n "
220+ " Sec-WebSocket-Accept:\r\n "
221+ " \r\n " ;
222+ REQUIRE (std::string (response_header_buffer.data ()) == expected_header);
223+
199224 char buffer[WS_BUFFER_SIZE];
200225 int read_len = 0 ;
201226 int partial_read;
@@ -208,6 +233,25 @@ TEST_CASE("WebSocket Transport Connection", "[success]")
208233 std::string response (buffer, read_len);
209234 REQUIRE (response == " Test" );
210235 }
236+
237+ SECTION (" Happy flow with smaller response header" ) {
238+ // Set the response header length to 10
239+ ws_config.response_headers_len = 10 ;
240+ REQUIRE (esp_transport_ws_set_config (websocket_transport.get (), &ws_config) == ESP_OK);
241+
242+ // Set the callback function for mock_read
243+ mock_read_Stub (mock_valid_read_callback);
244+ mock_poll_read_Stub (mock_poll_read_callback);
245+ esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
246+ mock_destroy_ExpectAnyArgsAndReturn (ESP_OK);
247+
248+ REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == 0 );
249+
250+ // Verify the response header was stored correctly. it must contain only ten bytes and be null terminated
251+ std::string expected_header = " HTTP/1.1 1\0 " ;
252+
253+ REQUIRE (std::string (response_header_buffer.data ()) == expected_header);
254+ }
211255}
212256
213257TEST_CASE (" WebSocket Transport Connection" , " [failure]" )
@@ -225,6 +269,21 @@ TEST_CASE("WebSocket Transport Connection", "[failure]")
225269 unique_transport websocket_transport{esp_transport_ws_init (parent_handle.get ()), esp_transport_destroy};
226270 REQUIRE (websocket_transport);
227271
272+ // Allocate buffer for response header
273+ constexpr size_t response_header_len = 1024 ;
274+ std::vector<char > response_header_buffer (response_header_len);
275+ esp_transport_ws_config_t ws_config = {
276+ .ws_path = " /" ,
277+ .sub_protocol = nullptr ,
278+ .user_agent = nullptr ,
279+ .headers = nullptr ,
280+ .auth = nullptr ,
281+ .response_headers = response_header_buffer.data (),
282+ .response_headers_len = response_header_len,
283+ .propagate_control_frames = false
284+ };
285+ REQUIRE (esp_transport_ws_set_config (websocket_transport.get (), &ws_config) == ESP_OK);
286+
228287 fmt::print (" Attempting to connect to WebSocket\n " );
229288 esp_crypto_sha1_ExpectAnyArgsAndReturn (0 );
230289 esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
@@ -244,6 +303,9 @@ TEST_CASE("WebSocket Transport Connection", "[failure]")
244303
245304 // check that the connect() function fails
246305 REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) != 0 );
306+
307+ // Verify the response header is empty
308+ REQUIRE (std::string (response_header_buffer.data ()) == " " );
247309 }
248310
249311 SECTION (" ws connect fails (invalid response)" ) {
@@ -259,6 +321,9 @@ TEST_CASE("WebSocket Transport Connection", "[failure]")
259321
260322 // check that the connect() function fails
261323 REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) != 0 );
324+
325+ // Verify the response header is empty
326+ REQUIRE (std::string (response_header_buffer.data ()) == " " );
262327 }
263328
264329 SECTION (" ws connect fails (big response)" ) {
@@ -272,46 +337,8 @@ TEST_CASE("WebSocket Transport Connection", "[failure]")
272337
273338 // check that the connect() function fails
274339 REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) != 0 );
275- }
276-
277- SECTION (" ws connect receives redirection response" ) {
278- // Set the callback function for mock_read
279- mock_read_Stub ( [](esp_transport_handle_t h, char *buf, int len, int tout, int n) {
280- char response[WS_BUFFER_SIZE];
281- int response_length = snprintf (response, WS_BUFFER_SIZE,
282- " HTTP/1.1 301 Moved Permanently\r\n "
283- " Location: ws://newhost:8080\r\n "
284- " \r\n " );
285- std::memcpy (buf, response, response_length);
286- return response_length;
287- });
288- mock_poll_read_Stub (mock_poll_read_callback);
289- esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
290- mock_destroy_ExpectAnyArgsAndReturn (ESP_OK);
291340
292- // check that the connect() function returns redir status
293- REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == 301 );
294- // Assert the expected HTTP status code
295- REQUIRE ((esp_transport_ws_get_upgrade_request_status (websocket_transport.get ())) == 301 );
296- }
297-
298- SECTION (" ws connect receives redirection response without location uri" ) {
299- // Set the callback function for mock_read
300- mock_read_Stub ( [](esp_transport_handle_t h, char *buf, int len, int tout, int n) {
301- char response[WS_BUFFER_SIZE];
302- int response_length = snprintf (response, WS_BUFFER_SIZE,
303- " HTTP/1.1 301 Moved Permanently\r\n "
304- " \r\n " );
305- std::memcpy (buf, response, response_length);
306- return response_length;
307- });
308- mock_poll_read_Stub (mock_poll_read_callback);
309- esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
310- mock_destroy_ExpectAnyArgsAndReturn (ESP_OK);
311-
312- // check that the connect() function fails
313- REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == -1 );
314- // Assert the expected HTTP status code
315- REQUIRE ((esp_transport_ws_get_upgrade_request_status (websocket_transport.get ())) == 301 );
341+ // Verify the response header is empty
342+ REQUIRE (std::string (response_header_buffer.data ()) == " " );
316343 }
317344}
0 commit comments