| ");
str_buffer_append_sz(sb,(size_t)(csarg->counter+1));
str_buffer_append(sb," | ");
@@ -2013,16 +2053,18 @@ static int https_print_session(ur_map_key_type key, ur_map_value_type value, voi
return 0;
}
-static void https_print_sessions(struct str_buffer* sb)
+static size_t https_print_sessions(struct str_buffer* sb, const char* client_protocol, const char* user_pattern, size_t max_sessions)
{
- struct https_ps_arg arg = {sb,0,0};
+ struct https_ps_arg arg = {sb,0,0,client_protocol,user_pattern,max_sessions};
arg.ct = turn_time();
ur_map_foreach_arg(cliserver.sessions, (foreachcb_arg_type)https_print_session, &arg);
+
+ return arg.counter;
}
-static void write_ps_page(ioa_socket_handle s)
+static void write_ps_page(ioa_socket_handle s, const char* client_protocol, const char* user_pattern, size_t max_sessions)
{
if(s && !ioa_socket_tobeclosed(s)) {
@@ -2035,16 +2077,64 @@ static void write_ps_page(ioa_socket_handle s)
str_buffer_append(sb,"\r\n\r\n \r\n ");
str_buffer_append(sb,admin_title);
str_buffer_append(sb,"\r\n \r\n \r\n ");
- str_buffer_append(sb,admin_title);
+ str_buffer_append(sb,bold_admin_title);
str_buffer_append(sb," \r\n");
str_buffer_append(sb,home_link);
str_buffer_append(sb," \r\n");
+
+ str_buffer_append(sb,"\r\n");
+
str_buffer_append(sb,"TURN Sessions:
\r\n");
str_buffer_append(sb,"| N | Session ID | User | Realm | Origin | Age, secs | Expires, secs | Client protocol | Relay protocol | Client addr | Server addr | Relay addr (IPv4) | Relay addr (IPv6) | Fingerprints | Mobile | TLS method | TLS cipher | BPS (allocated) | Packets | Rate | Peers | \r\n");
- https_print_sessions(sb);
+ size_t total_sz = https_print_sessions(sb,client_protocol,user_pattern,max_sessions);
- str_buffer_append(sb,"\r\n \r\n\r\n");
+ str_buffer_append(sb,"\r\n\r\n");
+
+ str_buffer_append(sb," Total sessions = ");
+ str_buffer_append_sz(sb,total_sz);
+ str_buffer_append(sb," \r\n");
+
+ str_buffer_append(sb,"\r\n\r\n");
send_str_from_ioa_socket_tcp(s,"HTTP/1.1 200 OK\r\nServer: ");
send_str_from_ioa_socket_tcp(s,TURN_SOFTWARE);
@@ -2161,7 +2251,23 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh)
if(!is_superuser())
realm0 = current_socket->as_realm;
STRCPY(current_socket->as_eff_realm,realm0);
- write_ps_page(s);
+
+ const char* client_protocol = get_http_header_value(hr, HR_CLIENT_PROTOCOL);
+ if(!client_protocol) client_protocol="";
+
+ const char* user_pattern = get_http_header_value(hr, HR_USER_PATTERN);
+ if(!user_pattern) user_pattern="";
+
+ size_t max_sessions = cli_max_output_sessions;
+ const char* s_max_sessions = get_http_header_value(hr, HR_MAX_SESSIONS);
+ if(s_max_sessions) {
+ max_sessions=strtoul(s_max_sessions,NULL,10);
+ if(!max_sessions) max_sessions = cli_max_output_sessions;
+ }
+
+ if(!max_sessions) max_sessions = DEFAULT_CLI_MAX_OUTPUT_SESSIONS;
+
+ write_ps_page(s,client_protocol,user_pattern,max_sessions);
} else {
write_https_logon_page(s);
}
diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c
index d8a84ef..6b9d8f8 100644
--- a/src/server/ns_turn_server.c
+++ b/src/server/ns_turn_server.c
@@ -4512,6 +4512,7 @@ static int read_client_connection(turn_turnserver *server,
if((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET)) {
if(is_http((char*)ioa_network_buffer_data(in_buffer->nbh), ioa_network_buffer_get_size(in_buffer->nbh))) {
const char *proto = "HTTP";
+ ioa_network_buffer_data(in_buffer->nbh)[ioa_network_buffer_get_size(in_buffer->nbh)] = 0;
if(st==TLS_SOCKET) {
proto = "HTTPS";
set_ioa_socket_app_type(ss->client_socket,HTTPS_CLIENT_SOCKET);
|