Config support for websockets.

This commit is contained in:
Roger A. Light 2014-05-18 22:40:20 +01:00
parent 9ea161f90e
commit 7316742cf4
5 changed files with 84 additions and 25 deletions

View File

@ -651,6 +651,15 @@
<para>Not reloaded on reload signal.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>protocol</option> <replaceable>value</replaceable></term>
<listitem>
<para>Set the protocol to accept for this listener. Can
be <option>mqtt</option>, the default, or
<option>websockets</option> if available.</para>
<para>Not reloaded on reload signal.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect2>
<refsect2>

View File

@ -143,6 +143,10 @@
# connections possible is around 1024.
#max_connections -1
# Choose the protocol to use when listening.
# This can be either mqtt or websockets.
#protocol mqtt
# -----------------------------------------------------------------
# Certificate based SSL/TLS support
# -----------------------------------------------------------------
@ -265,6 +269,10 @@
# happens internally to the broker; the client will not see the prefix.
#mount_point
# Choose the protocol to use when listening.
# This can be either mqtt or websockets.
#protocol mqtt
# -----------------------------------------------------------------
# Certificate based SSL/TLS support
# -----------------------------------------------------------------

View File

@ -177,6 +177,7 @@ void mqtt3_config_init(struct mqtt3_config *config)
config->default_listener.socks = NULL;
config->default_listener.sock_count = 0;
config->default_listener.client_count = 0;
config->default_listener.protocol = mp_mqtt;
#ifdef WITH_TLS
config->default_listener.tls_version = NULL;
config->default_listener.cafile = NULL;
@ -373,7 +374,8 @@ int mqtt3_config_parse_args(struct mqtt3_config *config, int argc, char *argv[])
|| config->default_listener.host
|| config->default_listener.port
|| config->default_listener.max_connections != -1
|| config->default_listener.mount_point){
|| config->default_listener.mount_point
|| config->default_listener.protocol != mp_mqtt){
config->listener_count++;
config->listeners = _mosquitto_realloc(config->listeners, sizeof(struct _mqtt3_listener)*config->listener_count);
@ -397,6 +399,7 @@ int mqtt3_config_parse_args(struct mqtt3_config *config, int argc, char *argv[])
config->listeners[config->listener_count-1].mount_point = NULL;
}
config->listeners[config->listener_count-1].max_connections = config->default_listener.max_connections;
config->listeners[config->listener_count-1].protocol = config->default_listener.protocol;
config->listeners[config->listener_count-1].client_count = 0;
config->listeners[config->listener_count-1].socks = NULL;
config->listeners[config->listener_count-1].sock_count = 0;
@ -1129,6 +1132,7 @@ int _config_read_file(struct mqtt3_config *config, bool reload, const char *file
}
cur_listener = &config->listeners[config->listener_count-1];
memset(cur_listener, 0, sizeof(struct _mqtt3_listener));
cur_listener->protocol = mp_mqtt;
cur_listener->port = port_tmp;
token = strtok_r(NULL, " ", &saveptr);
if(token){
@ -1375,6 +1379,28 @@ int _config_read_file(struct mqtt3_config *config, bool reload, const char *file
return MOSQ_ERR_INVAL;
}
config->default_listener.port = port_tmp;
}else if(!strcmp(token, "protocol")){
token = strtok_r(NULL, " ", &saveptr);
if(token){
if(!strcmp(token, "mqtt")){
cur_listener->protocol = mp_mqtt;
/*
}else if(!strcmp(token, "mqttsn")){
cur_listener->protocol = mp_mqttsn;
*/
}else if(!strcmp(token, "websockets")){
#ifdef WITH_WEBSOCKETS
cur_listener->protocol = mp_websockets;
#else
_mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: Websockets support not available.");
#endif
}else{
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Invalid protocol value (%s).", token);
return MOSQ_ERR_INVAL;
}
}else{
_mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Empty protocol value in configuration.");
}
}else if(!strcmp(token, "psk_file")){
#ifdef REAL_WITH_TLS_PSK
if(reload){

View File

@ -259,26 +259,8 @@ int main(int argc, char *argv[])
listener_max = -1;
listensock_index = 0;
for(i=0; i<config.listener_count; i++){
if(mqtt3_socket_listen(&config.listeners[i])){
_mosquitto_free(int_db.contexts);
mqtt3_db_close(&int_db);
if(config.pid_file){
remove(config.pid_file);
}
return 1;
}
listensock_count += config.listeners[i].sock_count;
listensock = _mosquitto_realloc(listensock, sizeof(int)*listensock_count);
if(!listensock){
_mosquitto_free(int_db.contexts);
mqtt3_db_close(&int_db);
if(config.pid_file){
remove(config.pid_file);
}
return 1;
}
for(j=0; j<config.listeners[i].sock_count; j++){
if(config.listeners[i].socks[j] == INVALID_SOCKET){
if(config.listeners[i].protocol == mp_mqtt){
if(mqtt3_socket_listen(&config.listeners[i])){
_mosquitto_free(int_db.contexts);
mqtt3_db_close(&int_db);
if(config.pid_file){
@ -286,11 +268,35 @@ int main(int argc, char *argv[])
}
return 1;
}
listensock[listensock_index] = config.listeners[i].socks[j];
if(listensock[listensock_index] > listener_max){
listener_max = listensock[listensock_index];
listensock_count += config.listeners[i].sock_count;
listensock = _mosquitto_realloc(listensock, sizeof(int)*listensock_count);
if(!listensock){
_mosquitto_free(int_db.contexts);
mqtt3_db_close(&int_db);
if(config.pid_file){
remove(config.pid_file);
}
return 1;
}
listensock_index++;
for(j=0; j<config.listeners[i].sock_count; j++){
if(config.listeners[i].socks[j] == INVALID_SOCKET){
_mosquitto_free(int_db.contexts);
mqtt3_db_close(&int_db);
if(config.pid_file){
remove(config.pid_file);
}
return 1;
}
listensock[listensock_index] = config.listeners[i].socks[j];
if(listensock[listensock_index] > listener_max){
listener_max = listensock[listensock_index];
}
listensock_index++;
}
}else if(config.listeners[i].protocol == mp_websockets){
#ifdef WITH_WEBSOCKETS
config.listeners[i].ws_context = mosq_websockets_init(config.listeners[i].port);
#endif
}
}

View File

@ -39,6 +39,12 @@ Contributors:
#define MQTT3_LOG_TOPIC 0x10
#define MQTT3_LOG_ALL 0xFF
enum mosquitto_protocol {
mp_mqtt,
mp_mqttsn,
mp_websockets
};
typedef uint64_t dbid_t;
struct _mqtt3_listener {
@ -50,6 +56,7 @@ struct _mqtt3_listener {
int *socks;
int sock_count;
int client_count;
enum mosquitto_protocol protocol;
#ifdef WITH_TLS
char *cafile;
char *capath;
@ -63,6 +70,9 @@ struct _mqtt3_listener {
bool use_identity_as_username;
char *tls_version;
#endif
#ifdef WITH_WEBSOCKETS
struct libwebsocket_context *ws_context;
#endif
};
struct mqtt3_config {