1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

lws_inform_client_conn_fail

There are many places where we have the same code to inform about client
connection failure... consolidate it
This commit is contained in:
Andy Green 2019-08-10 09:20:27 +01:00
parent 2fc35ef6bd
commit 7b517eac87
7 changed files with 52 additions and 41 deletions

View file

@ -55,8 +55,8 @@ enum {
LWSSTATS_US_SSL_RX_DELAY_AVG, /**< aggregate delay between ssl accept complete and first RX */
LWSSTATS_C_PEER_LIMIT_AH_DENIED, /**< number of times we would have given an ah but for the peer limit */
LWSSTATS_C_PEER_LIMIT_WSI_DENIED, /**< number of times we would have given a wsi but for the peer limit */
LWSSTATS_C_CONNECTIONS_CLIENT, /**< attempted client conns */
LWSSTATS_C_CONNECTIONS_CLIENT_FAILED, /**< failed client conns */
LWSSTATS_C_CONNS_CLIENT, /**< attempted client conns */
LWSSTATS_C_CONNS_CLIENT_FAILED, /**< failed client conns */
/* Add new things just above here ---^
* This is part of the ABI, don't needlessly break compatibility

View file

@ -127,6 +127,24 @@ lws_close_trans_q_leader(struct lws_dll2 *d, void *user)
return 0;
}
void
lws_inform_client_conn_fail(struct lws *wsi, void *arg, size_t len)
{
if (wsi->already_did_cce)
return;
wsi->already_did_cce = 1;
lws_stats_bump(&wsi->context->pt[(int)wsi->tsi],
LWSSTATS_C_CONNS_CLIENT_FAILED, 1);
if (!wsi->protocol)
return;
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, arg, len);
}
#endif
void
@ -349,13 +367,13 @@ just_kill_connection:
wsi->protocol_bind_balance = 0;
}
#if !defined(LWS_NO_CLIENT)
if ((lwsi_state(wsi) == LRS_WAITING_SERVER_REPLY ||
lwsi_state(wsi) == LRS_WAITING_CONNECT) &&
!wsi->already_did_cce && wsi->protocol)
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space,
(void *)"closed before established", 24);
lws_inform_client_conn_fail(wsi,
(void *)"closed before established", 24);
#endif
/*
* Testing with ab shows that we have to stage the socket close when

View file

@ -45,8 +45,9 @@ lws_client_connect_via_info(const struct lws_client_connect_info *i)
struct lws *wsi, *safe = NULL;
const struct lws_protocols *p;
const char *local = i->protocol;
int tid = 0;
#if LWS_MAX_SMP > 1
int n, tid;
int n;
#endif
if (i->context->requested_kill)
@ -56,6 +57,11 @@ lws_client_connect_via_info(const struct lws_client_connect_info *i)
if (lws_protocol_init(i->context))
return NULL;
#if LWS_MAX_SMP > 1
tid = wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_GET_THREAD_ID,
NULL, NULL, 0);
#endif
/*
* If we have .local_protocol_name, use it to select the local protocol
* handler to bind to. Otherwise use .protocol if http[s].
@ -63,6 +69,8 @@ lws_client_connect_via_info(const struct lws_client_connect_info *i)
if (i->local_protocol_name)
local = i->local_protocol_name;
lws_stats_bump(&i->context->pt[tid], LWSSTATS_C_CONNS_CLIENT, 1);
/* PHASE 1: create a bare wsi */
wsi = lws_zalloc(sizeof(struct lws), "client wsi");
@ -91,9 +99,6 @@ lws_client_connect_via_info(const struct lws_client_connect_info *i)
*/
#if LWS_MAX_SMP > 1
tid = wsi->vhost->protocols[0].callback(wsi, LWS_CALLBACK_GET_THREAD_ID,
NULL, NULL, 0);
lws_context_lock(i->context, "client find tsi");
for (n = 0; n < i->context->count_threads; n++)
@ -110,10 +115,6 @@ lws_client_connect_via_info(const struct lws_client_connect_info *i)
*/
lws_context_unlock(i->context);
lws_stats_bump(&i->context->pt[tid], LWSSTATS_C_CONNECTIONS_CLIENT, 1);
#else
lws_stats_bump(&i->context->pt[0], LWSSTATS_C_CONNECTIONS_CLIENT, 1);
#endif
/*
@ -308,5 +309,7 @@ bail2:
if (i->pwsi)
*i->pwsi = NULL;
lws_stats_bump(&i->context->pt[tid], LWSSTATS_C_CONNS_CLIENT_FAILED, 1);
return NULL;
}

View file

@ -1121,6 +1121,9 @@ lws_buflist_aware_consume(struct lws *wsi, struct lws_tokens *ebuf, int used,
extern const struct lws_protocols protocol_abs_client_raw_skt,
protocol_abs_client_unit_test;
void
lws_inform_client_conn_fail(struct lws *wsi, void *arg, size_t len);
#ifdef __cplusplus
};
#endif

View file

@ -107,11 +107,11 @@ lws_sul_wsitimeout_cb(lws_sorted_usec_list_t *sul)
* don't try to do protocol cleanup like flush partials.
*/
wsi->socket_is_permanently_unusable = 1;
if (lwsi_state(wsi) == LRS_WAITING_SSL && wsi->protocol)
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space,
#if !defined(LWS_NO_CLIENT)
if (lwsi_state(wsi) == LRS_WAITING_SSL)
lws_inform_client_conn_fail(wsi,
(void *)"Timed out waiting SSL", 21);
#endif
__lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timeout");
}

View file

@ -198,10 +198,7 @@ send_hs:
return wsi;
failed:
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, (void *)cce, strlen(cce));
wsi->already_did_cce = 1;
lws_inform_client_conn_fail(wsi, (void *)cce, strlen(cce));
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "client_connect2");
@ -735,12 +732,9 @@ ads_known:
oom4:
if (lwsi_role_client(wsi) && wsi->protocol /* && lwsi_state_est(wsi) */) {
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, (void *)cce, strlen(cce));
wsi->already_did_cce = 1;
}
if (lwsi_role_client(wsi) && wsi->protocol /* && lwsi_state_est(wsi) */)
lws_inform_client_conn_fail(wsi,(void *)cce, strlen(cce));
/* take care that we might be inserted in fds already */
if (wsi->position_in_fds_table != LWS_NO_FDS_POS)
goto failed1;
@ -763,10 +757,8 @@ oom4:
return NULL;
failed:
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, (void *)cce, strlen(cce));
wsi->already_did_cce = 1;
lws_inform_client_conn_fail(wsi, (void *)cce, strlen(cce));
failed1:
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "client_connect2");

View file

@ -565,10 +565,8 @@ bail3:
lwsl_info("closing conn at LWS_CONNMODE...SERVER_REPLY\n");
if (cce)
lwsl_info("reason: %s\n", cce);
wsi->protocol->callback(wsi,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
wsi->user_space, (void *)cce, strlen(cce));
wsi->already_did_cce = 1;
lws_inform_client_conn_fail(wsi, (void *)cce, strlen(cce));
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "cbail3");
return -1;
@ -1030,12 +1028,9 @@ bail2:
n = 0;
if (cce)
n = (int)strlen(cce);
w->protocol->callback(w,
LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
w->user_space, (void *)cce,
(unsigned int)n);
lws_inform_client_conn_fail(wsi, (void *)cce, (unsigned int)n);
}
wsi->already_did_cce = 1;
lwsl_info("closing connection (prot %s) "
"due to bail2 connection error: %s\n", wsi->protocol ?