Handle reconnects for websockets.

This commit is contained in:
Roger A. Light 2014-06-30 06:58:56 +01:00
parent 542ebb2480
commit d60e44ec1b

View File

@ -31,6 +31,10 @@ Contributors:
# include <uuid/uuid.h>
#endif
#ifdef WITH_WEBSOCKETS
#include <libwebsockets.h>
#endif
#ifdef WITH_SYS_TREE
extern unsigned int g_connection_count;
#endif
@ -383,60 +387,45 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
/* Find if this client already has an entry. This must be done *after* any security checks. */
HASH_FIND(hh_id, db->contexts_by_id, client_id, strlen(client_id), found_context);
if(found_context){
HASH_DELETE(hh_id, db->contexts_by_id, found_context);
_mosquitto_free(found_context->id);
found_context->id = NULL;
/* Found a matching client */
if(found_context->sock == -1){
if(found_context->sock == INVALID_SOCKET){
/* Client is reconnecting after a disconnect */
/* FIXME - does anything else need to be done here? */
#ifdef WITH_SYS_TREE
db->disconnected_count--;
#endif
HASH_ADD_KEYPTR(hh_for_free, db->contexts_for_free, found_context, sizeof(void *), found_context);
}else{
/* Client is already connected, disconnect old version */
if(db->config->connection_messages == true){
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Client %s already connected, closing old connection.", client_id);
}
if(found_context->sock >= 0){
HASH_ADD_KEYPTR(hh_for_free, db->contexts_for_free, found_context, sizeof(void *), found_context);
}
mqtt3_context_disconnect(db, found_context);
}
if(context->protocol == mosq_p_mqtt311){
if(clean_session == 0){
connect_ack |= 0x01;
}
}
found_context->clean_session = clean_session;
mqtt3_context_cleanup(db, found_context, false);
found_context->state = mosq_cs_connected;
if(context->address){
found_context->address = context->address;
context->address = NULL;
}else{
found_context->address = NULL;
}
found_context->disconnect_t = 0;
if(context->sock >= 0){
HASH_DELETE(hh_sock, db->contexts_by_sock, context);
}
found_context->sock = context->sock;
found_context->listener = context->listener;
context->listener = NULL;
found_context->last_msg_in = mosquitto_time();
found_context->last_msg_out = mosquitto_time();
found_context->keepalive = context->keepalive;
found_context->pollfd_index = context->pollfd_index;
#ifdef WITH_TLS
found_context->ssl = context->ssl;
#endif
if(context->username){
found_context->username = _mosquitto_strdup(context->username);
}
context->sock = -1;
#ifdef WITH_TLS
context->ssl = NULL;
#endif
context->state = mosq_cs_disconnecting;
HASH_ADD_KEYPTR(hh_for_free, db->contexts_for_free, context, sizeof(void *), context);
context = found_context;
HASH_ADD(hh_sock, db->contexts_by_sock, sock, sizeof(context->sock), context);
if(context->msgs){
if(found_context->msgs){
if(context->last_msg){
context->last_msg->next = found_context->msgs;
context->last_msg = context->last_msg->next;
}else{
context->msgs = found_context->msgs;
context->last_msg = found_context->msgs;
}
mqtt3_db_message_reconnect_reset(context);
found_context->msgs = NULL;
}
}