From a4b1486f9cc1d82da473fb0acd86995b1d2f706c Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sat, 30 Apr 2022 23:03:06 +0200 Subject: [PATCH] http client rx callback fix for empty response body --- include/api/api_xmacro_helpers.h | 1 + src/aprsis.c | 10 +++++----- system/include/gsm/sim800c_tcpip.h | 2 +- system/src/gsm/sim800c_tcpip.c | 4 ++-- system/src/http_client/http_client.c | 6 ++++-- system/src/http_client/http_client_rx_callback.c | 4 ++++ 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/api/api_xmacro_helpers.h b/include/api/api_xmacro_helpers.h index 5aa9b6f..6e7881d 100644 --- a/include/api/api_xmacro_helpers.h +++ b/include/api/api_xmacro_helpers.h @@ -12,6 +12,7 @@ #include #define BEGIN \ + LN = 0; \ memset(OUT, 0x00, sizeof(OUT)); \ LN = sprintf(OUT + LN, "{\r\n"); \ diff --git a/src/aprsis.c b/src/aprsis.c index b59cdac..a9ef8c3 100644 --- a/src/aprsis.c +++ b/src/aprsis.c @@ -157,16 +157,16 @@ uint8_t aprsis_connect_and_login(char * address, uint8_t address_ln, uint16_t po } else { // if authoruzation wasn't successfull drop a connection - gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state); + gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state, 0); } } } else { - gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state); + gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state, 0); } } else { - gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state); + gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state, 1); } } } @@ -181,7 +181,7 @@ uint8_t aprsis_connect_and_login_default(void) { } void aprsis_disconnect(void) { - gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state); + gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state, 0); aprsis_logged = 0; @@ -215,7 +215,7 @@ void aprsis_check_alive(void) { // reset the flag aprsis_logged = 0; - gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state); + gsm_sim800_tcpip_close(aprsis_serial_port, aprsis_gsm_modem_state, 1); } } diff --git a/system/include/gsm/sim800c_tcpip.h b/system/include/gsm/sim800c_tcpip.h index a1faa87..2c3d4d8 100644 --- a/system/include/gsm/sim800c_tcpip.h +++ b/system/include/gsm/sim800c_tcpip.h @@ -28,7 +28,7 @@ uint8_t gsm_sim800_tcpip_async_receive(srl_context_t * srl_context, gsm_sim800_s uint8_t gsm_sim800_tcpip_receive(uint8_t * buffer, uint16_t buffer_size, srl_context_t * srl_context, gsm_sim800_state_t * state, srl_rx_termination_callback_t rx_callback, uint32_t timeout); uint8_t gsm_sim800_tcpip_async_write(uint8_t * data, uint16_t data_len, srl_context_t * srl_context, gsm_sim800_state_t * state); uint8_t gsm_sim800_tcpip_write(uint8_t * data, uint16_t data_len, srl_context_t * srl_context, gsm_sim800_state_t * state); -void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * state); +void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * state, uint8_t force); void gsm_sim800_tcpip_rx_done_callback(srl_context_t * srl_context, gsm_sim800_state_t * state); void gsm_sim800_tcpip_tx_done_callback(srl_context_t * srl_context, gsm_sim800_state_t * state); diff --git a/system/src/gsm/sim800c_tcpip.c b/system/src/gsm/sim800c_tcpip.c index 2636cbe..76fe115 100644 --- a/system/src/gsm/sim800c_tcpip.c +++ b/system/src/gsm/sim800c_tcpip.c @@ -224,11 +224,11 @@ uint8_t gsm_sim800_tcpip_write(uint8_t * data, uint16_t data_len, srl_context_t return out; } -void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * state) { +void gsm_sim800_tcpip_close(srl_context_t * srl_context, gsm_sim800_state_t * state, uint8_t force) { uint8_t receive_result = 0; - if (*state == SIM800_TCP_CONNECTED) { + if (*state == SIM800_TCP_CONNECTED || force == 1) { // send escape sequence to exit connection mode srl_send_data(srl_context, (const uint8_t*) ESCAPE, SRL_MODE_ZERO, strlen(ESCAPE), SRL_INTERNAL); diff --git a/system/src/http_client/http_client.c b/system/src/http_client/http_client.c index deb9a0b..355c618 100644 --- a/system/src/http_client/http_client.c +++ b/system/src/http_client/http_client.c @@ -68,6 +68,8 @@ static char http_client_port[PORT_LN]; */ static void http_client_response_done_callback(srl_context_t* context) { + gsm_sim800_tcpip_close(context, http_client_deticated_sim800_state, 1); + if (http_client_on_response_callback != 0) { // execute a callback. addition '+1' is requires because 'http_client_content_end_index' points to the last character of response http_client_on_response_callback(http_client_http_code, (char *)(context->srl_rx_buf_pointer + http_client_content_start_index), http_client_content_end_index - http_client_content_start_index + 1); @@ -229,7 +231,7 @@ uint8_t http_client_async_get(char * url, uint8_t url_ln, uint16_t response_ln_l // check if module is busy on other TCP/IP connection if (*http_client_deticated_sim800_state == SIM800_TCP_CONNECTED && force_disconnect_on_busy != 0) { // if client is connected end a user wants to force disconnect - gsm_sim800_tcpip_close(http_client_deticated_serial_context, http_client_deticated_sim800_state); + gsm_sim800_tcpip_close(http_client_deticated_serial_context, http_client_deticated_sim800_state, 0); } else if (*http_client_deticated_sim800_state == SIM800_TCP_CONNECTED && force_disconnect_on_busy == 0) { out = HTTP_CLIENT_RET_TCPIP_BSY; @@ -315,7 +317,7 @@ uint8_t http_client_async_post(char * url, uint8_t url_ln, char * data_to_post, // check if module is busy on other TCP/IP connection if (*http_client_deticated_sim800_state == SIM800_TCP_CONNECTED && force_disconnect_on_busy != 0) { // if client is connected end a user wants to force disconnect - gsm_sim800_tcpip_close(http_client_deticated_serial_context, http_client_deticated_sim800_state); + gsm_sim800_tcpip_close(http_client_deticated_serial_context, http_client_deticated_sim800_state, 0); } else if (*http_client_deticated_sim800_state == SIM800_TCP_CONNECTED && force_disconnect_on_busy == 0) { out = HTTP_CLIENT_RET_TCPIP_BSY; diff --git a/system/src/http_client/http_client_rx_callback.c b/system/src/http_client/http_client_rx_callback.c index 7694c21..e97d052 100644 --- a/system/src/http_client/http_client_rx_callback.c +++ b/system/src/http_client/http_client_rx_callback.c @@ -233,6 +233,10 @@ uint8_t http_client_rx_done_callback(uint8_t current_data, const uint8_t * const } } + // check if this response doesn't have a content + if (http_client_response_header_processing == 0 && http_client_content_lenght == 0) { + out = 1; + } return out; }