From f9ac2c4460cd4391832a36807ccb8a10e00639aa Mon Sep 17 00:00:00 2001 From: mom040267 Date: Tue, 2 Dec 2014 06:47:39 +0000 Subject: [PATCH] https connections handling --- src/apps/relay/ns_ioalib_engine_impl.c | 123 ++++++++++++++----------- src/server/ns_turn_ioalib.h | 4 + src/server/ns_turn_server.c | 35 ++++++- 3 files changed, 105 insertions(+), 57 deletions(-) diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index aa825d2..8990a00 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -108,66 +108,67 @@ static int bufferevent_enabled(struct bufferevent *bufev, short flags) return (bufferevent_get_enabled(bufev) & flags); } -static int is_socket_writeable(ioa_socket_handle s, size_t sz, const char *msg, int option) +static int is_socket_writeable(ioa_socket_handle s, size_t sz, const char *msg, int option) { - UNUSED_ARG(sz); - UNUSED_ARG(msg); - UNUSED_ARG(option); + UNUSED_ARG(sz); + UNUSED_ARG(msg); + UNUSED_ARG(option); - if(!s) - return 0; + if (!s) + return 0; - if(!(s->done) && !(s->broken) && !(s->tobeclosed)) { + if (!(s->done) && !(s->broken) && !(s->tobeclosed)) { - switch(s->st) { - - case TCP_SOCKET: - case TLS_SOCKET: - if(s->bev) { + switch (s->st){ - struct evbuffer *evb = bufferevent_get_output(s->bev); - - if(evb) { - size_t bufsz = evbuffer_get_length(evb); - size_t newsz = bufsz + sz; - - switch(s->sat) { - case TCP_CLIENT_DATA_SOCKET: - case TCP_RELAY_DATA_SOCKET: - - switch(option) { - case 0: - case 1: - if(newsz >= BUFFEREVENT_MAX_TCP_TO_TCP_WRITE) { - return 0; - } - break; - case 3: - case 4: - if(newsz >= BUFFEREVENT_MAX_TCP_TO_TCP_WRITE) { - return 0; - } - break; - default: - return 1; - }; - break; - default: - if(option == 2) { - if(newsz >= BUFFEREVENT_MAX_UDP_TO_TCP_WRITE) { - return 0; - } - } - }; + case TCP_SOCKET: + case TLS_SOCKET: + if (s->bev) { + + struct evbuffer *evb = bufferevent_get_output(s->bev); + + if (evb) { + size_t bufsz = evbuffer_get_length(evb); + size_t newsz = bufsz + sz; + + switch (s->sat){ + case TCP_CLIENT_DATA_SOCKET: + case TCP_RELAY_DATA_SOCKET: + + switch (option){ + case 0: + case 1: + if (newsz >= BUFFEREVENT_MAX_TCP_TO_TCP_WRITE) { + return 0; + } + break; + case 3: + case 4: + if (newsz >= BUFFEREVENT_MAX_TCP_TO_TCP_WRITE) { + return 0; + } + break; + default: + return 1; + } + ; + break; + default: + if (option == 2) { + if (newsz >= BUFFEREVENT_MAX_UDP_TO_TCP_WRITE) { + return 0; + } + } + }; + } + } + break; + default: + ; + }; } - } - break; - default: - ; - }; - } - return 1; + return 1; } static void log_socket_event(ioa_socket_handle s, const char *msg, int error) { @@ -3448,6 +3449,22 @@ void ioa_network_buffer_delete(ioa_engine_handle e, ioa_network_buffer_handle nb /////////// REPORTING STATUS ///////////////////// +const char* get_ioa_socket_cipher(ioa_socket_handle s) +{ + if(s && s->ssl) { + return SSL_get_cipher(s->ssl); + } + return "no SSL"; +} + +const char* get_ioa_socket_ssl_method(ioa_socket_handle s) +{ + if(s && s->ssl) { + return turn_get_ssl_method(s->ssl, s->orig_ctx_type); + } + return "no SSL"; +} + void turn_report_allocation_set(void *a, turn_time_t lifetime, int refresh) { if(a) { diff --git a/src/server/ns_turn_ioalib.h b/src/server/ns_turn_ioalib.h index 79fb3c4..fb70397 100644 --- a/src/server/ns_turn_ioalib.h +++ b/src/server/ns_turn_ioalib.h @@ -96,6 +96,8 @@ typedef enum _SOCKET_TYPE SOCKET_TYPE; enum _SOCKET_APP_TYPE { UNKNOWN_APP_SOCKET, CLIENT_SOCKET, + HTTP_CLIENT_SOCKET, + HTTPS_CLIENT_SOCKET, RELAY_SOCKET, RELAY_RTCP_SOCKET, TCP_CLIENT_DATA_SOCKET, @@ -225,6 +227,8 @@ ioa_socket_handle ioa_create_connecting_tcp_relay_socket(ioa_socket_handle s, i int get_ioa_socket_from_reservation(ioa_engine_handle e, u64bits in_reservation_token, ioa_socket_handle *s, u08bits *realm); int get_ioa_socket_address_family(ioa_socket_handle s); +const char* get_ioa_socket_cipher(ioa_socket_handle s); +const char* get_ioa_socket_ssl_method(ioa_socket_handle s); SOCKET_TYPE get_ioa_socket_type(ioa_socket_handle s); SOCKET_APP_TYPE get_ioa_socket_app_type(ioa_socket_handle s); const char* get_ioa_socket_tls_method(ioa_socket_handle s); diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index d77107d..d50a70c 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -4161,8 +4161,11 @@ static void client_to_be_allocated_timeout_handler(ioa_engine_handle e, int to_close = 0; ioa_socket_handle s = ss->client_socket; + if(!s || ioa_socket_tobeclosed(s)) { to_close = 1; + } else if(get_ioa_socket_app_type(s) == HTTPS_CLIENT_SOCKET) { + ; } else { ioa_socket_handle rs4 = ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s; ioa_socket_handle rs6 = ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s; @@ -4415,6 +4418,12 @@ static void write_http_echo(turn_turnserver *server, ts_ur_super_session *ss) } } +static void handle_https(turn_turnserver *server, ts_ur_super_session *ss, ioa_network_buffer_handle nbh) { + //TODO + UNUSED_ARG(nbh); + write_http_echo(server,ss); +} + static int read_client_connection(turn_turnserver *server, ts_ur_super_session *ss, ioa_net_data *in_buffer, int can_resume, int count_usage) { @@ -4451,9 +4460,20 @@ static int read_client_connection(turn_turnserver *server, size_t blen = ioa_network_buffer_get_size(in_buffer->nbh); size_t orig_blen = blen; SOCKET_TYPE st = get_ioa_socket_type(ss->client_socket); + SOCKET_APP_TYPE sat = get_ioa_socket_app_type(ss->client_socket); int is_padding_mandatory = ((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET)); - if (stun_is_channel_message_str(ioa_network_buffer_data(in_buffer->nbh), + if(sat == HTTP_CLIENT_SOCKET) { + + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: HTTP connection input: %s\n", __FUNCTION__, (char*)ioa_network_buffer_data(in_buffer->nbh)); + write_http_echo(server,ss); + + } else if(sat == HTTPS_CLIENT_SOCKET) { + + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: HTTPS connection input: %s\n", __FUNCTION__, (char*)ioa_network_buffer_data(in_buffer->nbh)); + handle_https(server,ss,in_buffer->nbh); + + } else if (stun_is_channel_message_str(ioa_network_buffer_data(in_buffer->nbh), &blen, &chnum, is_padding_mandatory)) { @@ -4542,9 +4562,16 @@ static int read_client_connection(turn_turnserver *server, if((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET)) { if(is_http_get((char*)ioa_network_buffer_data(in_buffer->nbh), ioa_network_buffer_get_size(in_buffer->nbh))) { const char *proto = "HTTP"; - if(st==TLS_SOCKET) proto = "HTTPS"; - TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: %s request: %s\n", __FUNCTION__, proto, (char*)ioa_network_buffer_data(in_buffer->nbh)); - write_http_echo(server,ss); + if(st==TLS_SOCKET) { + proto = "HTTPS"; + set_ioa_socket_app_type(ss->client_socket,HTTPS_CLIENT_SOCKET); + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: %s (%s %s) request: %s\n", __FUNCTION__, proto, get_ioa_socket_cipher(ss->client_socket), get_ioa_socket_ssl_method(ss->client_socket), (char*)ioa_network_buffer_data(in_buffer->nbh)); + handle_https(server,ss,in_buffer->nbh); + } else { + set_ioa_socket_app_type(ss->client_socket,HTTP_CLIENT_SOCKET); + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: %s request: %s\n", __FUNCTION__, proto, (char*)ioa_network_buffer_data(in_buffer->nbh)); + write_http_echo(server,ss); + } } } }