https connections handling
This commit is contained in:
parent
f8c08b4a58
commit
f9ac2c4460
@ -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) {
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user