https connections handling

This commit is contained in:
mom040267 2014-12-02 06:47:39 +00:00
parent f8c08b4a58
commit f9ac2c4460
3 changed files with 105 additions and 57 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}
}
}
}