/**
* @brief Websocket event handler select() timeout value, msec.
*/
-#define WEBSOCKET_HANDLER_TIMEOUT (300) //mili second
+#define WEBSOCKET_HANDLER_TIMEOUT (100) //mili second
/**
* @brief Ping message limits without pong.
*/
#define WEBSOCKET_MAX_CLIENT (3)
+/**
+ * @brief The maximun retry of tls handshake.
+ */
+#define WEBSOCKET_MAX_TLS_HANDSHAKE (3)
+
/*
* Pre-definition variables from wslay below.
* just not to include wslay.h on application side.
int websocket_connect(websocket_t *client, const char *addr, const char *port)
{
int r;
+ int tls_hs_retry = WEBSOCKET_MAX_TLS_HANDSHAKE;
- r = connect_socket(client, addr, port);
- if (r == WEBSOCKET_SUCCESS && client->tls_enabled) {
+TLS_HS_RETRY:
+ if ((r = connect_socket(client, addr, port)) != WEBSOCKET_SUCCESS) {
+ return r;
+ }
+
+ websocket_update_state(client, WEBSOCKET_RUNNING);
+
+ if (websocket_make_block(client->fd) != WEBSOCKET_SUCCESS) {
+ close(client->fd);
+ return WEBSOCKET_SOCKET_ERROR;
+ }
+
+ if (client->tls_enabled) {
if ((r = websocket_tls_handshake(client, WEBSOCKET_SERVERNAME, MBEDTLS_SSL_VERIFY_REQUIRED)) != WEBSOCKET_SUCCESS) {
+ if (r == MBEDTLS_ERR_NET_SEND_FAILED ||
+ r == MBEDTLS_ERR_NET_RECV_FAILED ||
+ r == MBEDTLS_ERR_SSL_CONN_EOF) {
+ if (tls_hs_retry-- > 0) {
+ WEBSOCKET_DEBUG("Handshake again.... \n");
+ mbedtls_net_free(&(client->tls_net));
+ mbedtls_ssl_free(client->tls_ssl);
+ mbedtls_ssl_init(client->tls_ssl);
+ goto TLS_HS_RETRY;
+ }
+ }
return WEBSOCKET_TLS_HANDSHAKE_ERROR;
}
}