diff --git a/include/libwebsockets/lws-secure-streams.h b/include/libwebsockets/lws-secure-streams.h index 47c8fb385..e4cb6ba5d 100644 --- a/include/libwebsockets/lws-secure-streams.h +++ b/include/libwebsockets/lws-secure-streams.h @@ -447,7 +447,7 @@ typedef struct lws_ss_info { * formats, \p ppayload_fmt is set to point to the name of the needed payload * format from the policy database if non-NULL. */ -LWS_VISIBLE LWS_EXTERN int +LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT lws_ss_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi, void *opaque_user_data, struct lws_ss_handle **ppss, struct lws_sequencer *seq_owner, const char **ppayload_fmt); @@ -471,9 +471,9 @@ lws_ss_destroy(struct lws_ss_handle **ppss); * write on this stream, the \p *tx callback will occur with an empty buffer for * the stream owner to fill in. * - * Returns 0 or LWSSSSRET_SS_HANDLE_DESTROYED + * Returns 0 or LWSSSSRET_DESTROY_ME */ -LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t +LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT lws_ss_request_tx(struct lws_ss_handle *pss); /** @@ -489,7 +489,7 @@ lws_ss_request_tx(struct lws_ss_handle *pss); * This api variant should be used when it's possible the payload will go out * over h1 with x-web-form-urlencoded or similar Content-Type. */ -LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t +LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT lws_ss_request_tx_len(struct lws_ss_handle *pss, unsigned long len); /** @@ -505,7 +505,7 @@ lws_ss_request_tx_len(struct lws_ss_handle *pss, unsigned long len); * LWSSSSRET_OK means the connection is ongoing. * */ -LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t +LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT lws_ss_client_connect(struct lws_ss_handle *h); /** diff --git a/lib/secure-streams/secure-streams-serialize.c b/lib/secure-streams/secure-streams-serialize.c index ccb786dbe..09969fea8 100644 --- a/lib/secure-streams/secure-streams-serialize.c +++ b/lib/secure-streams/secure-streams-serialize.c @@ -362,6 +362,7 @@ lws_ss_deserialize_parse(struct lws_ss_serialization_parser *par, lws_ss_conn_states_t *state, void *parconn, lws_ss_handle_t **pss, lws_ss_info_t *ssi, char client) { + lws_ss_state_return_t r; lws_ss_metadata_t *pm; lws_sspc_handle_t *h; uint8_t pre[23]; @@ -1003,11 +1004,14 @@ payload_ff: lwsl_notice("%s: set payload len %u\n", __func__, par->temp32); - if (proxy_pss_to_ss_h(pss)) - lws_ss_request_tx_len(proxy_pss_to_ss_h(pss), - (unsigned long)par->temp32); - par->ps = RPAR_TYPE; + + if (proxy_pss_to_ss_h(pss)) { + r = lws_ss_request_tx_len(proxy_pss_to_ss_h(pss), + (unsigned long)par->temp32); + if (r == LWSSSSRET_DESTROY_ME) + goto hangup; + } break; case RPAR_METADATA_NAMELEN: diff --git a/lib/secure-streams/secure-streams.c b/lib/secure-streams/secure-streams.c index ced61f324..a13e7526f 100644 --- a/lib/secure-streams/secure-streams.c +++ b/lib/secure-streams/secure-streams.c @@ -1512,7 +1512,7 @@ lws_ss_request_tx(lws_ss_handle_t *h) lws_ss_state_return_t r; r = _lws_ss_request_tx(h); - _lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(r, NULL, &h); + return r; } diff --git a/lib/secure-streams/system/auth-api.amazon.com/auth.c b/lib/secure-streams/system/auth-api.amazon.com/auth.c index afbb72027..af297d8bf 100644 --- a/lib/secure-streams/system/auth-api.amazon.com/auth.c +++ b/lib/secure-streams/system/auth-api.amazon.com/auth.c @@ -227,9 +227,8 @@ ss_api_amazon_auth_state(void *userobj, void *sh, lws_ss_constate_t state, s = lws_system_blob_get_size(ab); if (!s) lwsl_debug("%s: no auth blob\n", __func__); - lws_ss_request_tx_len(m->ss, (unsigned long)s); m->pos = 0; - break; + return lws_ss_request_tx_len(m->ss, (unsigned long)s); case LWSSSCS_DISCONNECTED: /* diff --git a/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c b/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c index 37d23adb3..4de54bfc1 100644 --- a/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c +++ b/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c @@ -47,8 +47,7 @@ ss_cpd_state(void *userobj, void *sh, lws_ss_constate_t state, switch (state) { case LWSSSCS_CREATING: lws_ss_start_timeout(m->ss, 3 * LWS_US_PER_SEC); - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); case LWSSSCS_QOS_ACK_REMOTE: lws_system_cpd_set(cx, LWS_CPD_INTERNET_OK); diff --git a/lib/secure-streams/system/fetch-policy/fetch-policy.c b/lib/secure-streams/system/fetch-policy/fetch-policy.c index 237d2dbe9..ee4b139ac 100644 --- a/lib/secure-streams/system/fetch-policy/fetch-policy.c +++ b/lib/secure-streams/system/fetch-policy/fetch-policy.c @@ -102,8 +102,8 @@ ss_fetch_policy_state(void *userobj, void *sh, lws_ss_constate_t state, switch (state) { case LWSSSCS_CREATING: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); + case LWSSSCS_CONNECTING: break; diff --git a/minimal-examples/api-tests/api-test-lws_sequencer/main.c b/minimal-examples/api-tests/api-test-lws_sequencer/main.c index becb73bae..0db7f4009 100644 --- a/minimal-examples/api-tests/api-test-lws_sequencer/main.c +++ b/minimal-examples/api-tests/api-test-lws_sequencer/main.c @@ -169,8 +169,8 @@ notify: } static const struct lws_protocols protocols[] = { - { "seq-test-http", callback_http, 0, 0, }, - { NULL, NULL, 0, 0 } + { "seq-test-http", callback_http, 0, 0, 0, NULL, 0 }, + LWS_PROTOCOL_LIST_TERM }; diff --git a/minimal-examples/api-tests/api-test-secure-streams/main.c b/minimal-examples/api-tests/api-test-secure-streams/main.c index 8becb6764..841cd1a9c 100644 --- a/minimal-examples/api-tests/api-test-secure-streams/main.c +++ b/minimal-examples/api-tests/api-test-secure-streams/main.c @@ -183,11 +183,11 @@ myss_tx_post(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, *len = budget; m->sent += budget; if (m->sent != next_test->send) - lws_ss_request_tx(m->ss); - else - *flags |= LWSSS_FLAG_EOM; + return lws_ss_request_tx(m->ss); - return 0; + *flags |= LWSSS_FLAG_EOM; + + return LWSSSSRET_OK; } static lws_ss_state_return_t @@ -195,15 +195,18 @@ myss_state(void *userobj, void *sh, lws_ss_constate_t state, lws_ss_tx_ordinal_t ack) { myss_t *m = (myss_t *)userobj; + lws_ss_state_return_t r; lwsl_notice("%s: %s, ord 0x%x\n", __func__, lws_ss_state_name((int)state), (unsigned int)ack); switch (state) { case LWSSSCS_CREATING: - lws_ss_client_connect(m->ss); + r = lws_ss_client_connect(m->ss); + if (r) + return r; if (next_test->send) - lws_ss_request_tx_len(m->ss, (unsigned long)next_test->send); + return lws_ss_request_tx_len(m->ss, (unsigned long)next_test->send); break; case LWSSSCS_ALL_RETRIES_FAILED: lwsl_notice("%s: Connection failed\n", __func__); @@ -258,7 +261,7 @@ happy: break; } - return 0; + return LWSSSSRET_OK; } static const lws_ss_info_t ssi_get = { diff --git a/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c b/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c index ecde1a0b6..a2499060c 100644 --- a/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c +++ b/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c @@ -86,7 +86,7 @@ myss_state(void *userobj, void *sh, lws_ss_constate_t state, switch (state) { case LWSSSCS_CREATING: - lws_ss_client_connect(m->ss); + return lws_ss_client_connect(m->ss); break; default: break; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c b/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c index 6728146a1..bb453bfba 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c @@ -187,7 +187,7 @@ ss_avs_metadata_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, lwsl_info("%s: tx done\n", __func__); m->pos = (size_t)-1l; /* ban subsequent until new stream */ } else - lws_ss_request_tx(m->ss); + return lws_ss_request_tx(m->ss); lwsl_hexdump_info(buf, *len); @@ -211,7 +211,7 @@ ss_avs_metadata_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, if (m->pos == tot) { *flags |= LWSSS_FLAG_EOM; m->pos = 0; /* for next time */ - lws_ss_request_tx(m->ss); + return lws_ss_request_tx(m->ss); } lwsl_hexdump_info(buf, *len); diff --git a/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c b/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c index 39257e3ea..087d49482 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c @@ -318,13 +318,15 @@ myss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, memcpy(buf, postbody + m->pos, *len); m->pos += *len; + if (m->pos == m->len) *flags |= LWSSS_FLAG_EOM; - else - lws_ss_request_tx(m->ss); lwsl_notice("%s: write %d flags %d\n", __func__, (int)*len, (int)*flags); + if (m->pos != m->len) + return lws_ss_request_tx(m->ss); + return 0; } @@ -353,11 +355,12 @@ myss_state(void *userobj, void *sh, lws_ss_constate_t state, /* provide a hint about the payload size */ m->pos = 0; m->len = strlen(postbody); - lws_ss_request_tx_len(m->ss, (unsigned long)strlen(postbody)); - break; + + return lws_ss_request_tx_len(m->ss, (unsigned long)strlen(postbody)); + case LWSSSCS_CONNECTED: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); + case LWSSSCS_ALL_RETRIES_FAILED: /* if we're out of retries, we want to close the app and FAIL */ interrupted = 1; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c b/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c index c6a7abe3e..6b7dd8369 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c @@ -182,8 +182,8 @@ myss_state(void *userobj, void *sh, lws_ss_constate_t state, switch (state) { case LWSSSCS_CREATING: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); + case LWSSSCS_ALL_RETRIES_FAILED: /* if we're out of retries, we want to close the app and FAIL */ interrupted = 1; @@ -266,7 +266,7 @@ min_sec_str_sequencer_cb(struct lws_sequencer *seq, void *user, int event, case LWSSEQ_TIMED_OUT: /* current step timed out */ if (s->state == SEQ_RECONNECT_WAIT) - lws_ss_request_tx(s->ss); + return lws_ss_request_tx(s->ss); break; /* @@ -277,8 +277,8 @@ min_sec_str_sequencer_cb(struct lws_sequencer *seq, void *user, int event, case LWSSEQ_SS_STATE_BASE + LWSSSCS_CREATING: lwsl_info("%s: seq LWSSSCS_CREATING\n", __func__); - lws_ss_request_tx(s->ss); - break; + return lws_ss_request_tx(s->ss); + case LWSSEQ_SS_STATE_BASE + LWSSSCS_DISCONNECTED: lwsl_info("%s: seq LWSSSCS_DISCONNECTED\n", __func__); break; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c b/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c index 7ad0b84ee..4d395d4c6 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c @@ -54,9 +54,8 @@ spam_sul_cb(struct lws_sorted_usec_list *sul) { myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul); - lws_ss_request_tx(m->ss); - - lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, + if (!lws_ss_request_tx(m->ss)) + lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, 100 * LWS_US_PER_MS); } @@ -90,8 +89,7 @@ myss_raw_state(void *userobj, void *sh, lws_ss_constate_t state, lws_sul_cancel(&m->sul); break; case LWSSSCS_CONNECTED: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); default: break; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c index 64834c377..58c0fd98e 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c @@ -62,7 +62,7 @@ myss_state(void *userobj, void *sh, lws_ss_constate_t state, switch (state) { case LWSSSCS_CREATING: - lws_ss_request_tx(m->ss); + return lws_ss_request_tx(m->ss); break; case LWSSSCS_ALL_RETRIES_FAILED: /* if we're out of retries, we want to close the app and FAIL */ diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c index 2a810920e..1b045458f 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c @@ -134,9 +134,8 @@ spam_sul_cb(struct lws_sorted_usec_list *sul) { myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul); - lws_ss_request_tx(m->ss); - - lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, + if (!lws_ss_request_tx(m->ss)) + lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb, 100 * LWS_US_PER_MS); } @@ -170,8 +169,8 @@ myss_srv_state(void *userobj, void *sh, lws_ss_constate_t state, lws_sul_cancel(&m->sul); break; case LWSSSCS_CREATING: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); + case LWSSSCS_ALL_RETRIES_FAILED: /* if we're out of retries, we want to close the app and FAIL */ interrupted = 1; @@ -201,10 +200,9 @@ myss_srv_state(void *userobj, void *sh, lws_ss_constate_t state, /* * ...it's going to be whatever size it is (and request tx) */ - lws_ss_request_tx_len(m->ss, (unsigned long) + return lws_ss_request_tx_len(m->ss, (unsigned long) (multipart ? strlen(multipart_html) : strlen(html))); - break; case LWSSSCS_SERVER_UPGRADE: @@ -217,8 +215,8 @@ myss_srv_state(void *userobj, void *sh, lws_ss_constate_t state, m->upgraded = 1; lws_ss_change_handlers(m->ss, myss_ws_rx, myss_ws_tx, NULL); - lws_ss_request_tx(m->ss); /* we want to start sending numbers */ - break; + return lws_ss_request_tx(m->ss); /* we want to start sending numbers */ + default: break; } diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c index b12f8f51c..1acd43177 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c @@ -57,7 +57,7 @@ ss_s3_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, *flags |= LWSSS_FLAG_EOM; // m->pos = 0; /* we only want to send once */ } else - lws_ss_request_tx(m->ss); + return lws_ss_request_tx(m->ss); return LWSSSSRET_OK; } @@ -173,12 +173,10 @@ ss_s3_state(void *userobj, void *sh, lws_ss_constate_t state, timestamp, strlen(timestamp))) return LWSSSSRET_DESTROY_ME; - lws_ss_request_tx_len(m->ss, m->total); - break; + return lws_ss_request_tx_len(m->ss, m->total); case LWSSSCS_CONNECTED: - lws_ss_request_tx(m->ss); - break; + return lws_ss_request_tx(m->ss); case LWSSSCS_DISCONNECTED: return LWSSSSRET_DESTROY_ME; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c b/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c index 741e6932d..3a9577f23 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c +++ b/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c @@ -94,7 +94,8 @@ sul_tx_periodic_cb(lws_sorted_usec_list_t *sul) myss_t *m = lws_container_of(sul, myss_t, sul); lwsl_info("%s: requesting TX\n", __func__); - lws_ss_request_tx(m->ss); + if (lws_ss_request_tx(m->ss)) + lwsl_info("%s: req failed\n", __func__); } static lws_ss_state_return_t