diff --git a/src/client.c b/src/client.c index d2cfcb8d..d3296572 100644 --- a/src/client.c +++ b/src/client.c @@ -169,8 +169,28 @@ static inline void client_reuseconnection(client_t *client) { return; con = client->con; - con = connection_create(con->sock, con->listensocket_real, con->listensocket_effective, strdup(con->ip)); reuse = client->reuse; + + if (reuse == ICECAST_REUSE_UPGRADETLS) { + http_parser_t *parser = client->parser; + + httpp_deletevar(parser, "upgrade"); + client->reuse = ICECAST_REUSE_CLOSE; + + /* release the buffer now, as the buffer could be on the source queue + * and may of disappeared after auth completes */ + client_set_queue(client, NULL); + client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE); + client->refbuf->len = 0; /* force reader code to ignore buffer contents */ + client->pos = 0; + + connection_uses_tls(con); + connection_queue_client(client); + + return; + } + + con = connection_create(con->sock, con->listensocket_real, con->listensocket_effective, strdup(con->ip)); client->con->sock = -1; /* TODO: do not use magic */ /* handle to keep the TLS connection */ @@ -199,9 +219,6 @@ static inline void client_reuseconnection(client_t *client) { client->reuse = ICECAST_REUSE_CLOSE; client_destroy(client); - - if (reuse == ICECAST_REUSE_UPGRADETLS) - connection_uses_tls(con); connection_queue(con); } diff --git a/src/connection.c b/src/connection.c index 3a049b0e..e3640f22 100644 --- a/src/connection.c +++ b/src/connection.c @@ -1749,3 +1749,9 @@ void connection_close(connection_t *con) refobject_unref(con->listensocket_effective); free(con); } + +void connection_queue_client(client_t *client) +{ + client_queue_t *node = create_client_node(client); + _add_connection(node); +} diff --git a/src/connection.h b/src/connection.h index f16a41c6..654f887e 100644 --- a/src/connection.h +++ b/src/connection.h @@ -75,6 +75,7 @@ void connection_close(connection_t *con); connection_t *connection_create(sock_t sock, listensocket_t *listensocket_real, listensocket_t* listensocket_effective, char *ip); int connection_complete_source(source_t *source, int response); void connection_queue(connection_t *con); +void connection_queue_client(client_t *client); void connection_uses_tls(connection_t *con); ssize_t connection_send_bytes(connection_t *con, const void *buf, size_t len);