Browse Source

https connections handling

mom040267 11 years ago
parent
commit
f9ac2c4460
3 changed files with 105 additions and 57 deletions
  1. 70 53
      src/apps/relay/ns_ioalib_engine_impl.c
  2. 4 0
      src/server/ns_turn_ioalib.h
  3. 31 4
      src/server/ns_turn_server.c

+ 70 - 53
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) {

+ 4 - 0
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);

+ 31 - 4
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);
+				}
 			}
 		}
 	}