Free proxy connection slot when upgrading to WebSocket connection

This commit is contained in:
2023-07-06 01:34:23 +02:00
parent c59977dada
commit b6c9d7330d

View File

@ -11,8 +11,10 @@
#include "../logger.h" #include "../logger.h"
#include "../lib/websocket.h" #include "../lib/websocket.h"
#include "../workers.h" #include "../workers.h"
#include "../lib/utils.h"
#include <errno.h> #include <errno.h>
#include <string.h>
static int ws_frame_handler(ws_ctx_t *ctx); static int ws_frame_handler(ws_ctx_t *ctx);
@ -32,15 +34,25 @@ void ws_frame_handler_func(ws_ctx_t *ctx) {
int ws_handle_connection(client_ctx_t *ctx) { int ws_handle_connection(client_ctx_t *ctx) {
info("Upgrading to WebSocket connection"); info("Upgrading to WebSocket connection");
// copy proxy connection details
proxy_ctx_t *proxy = malloc(sizeof(proxy_ctx_t));
memcpy(proxy, ctx->proxy, sizeof(proxy_ctx_t));
ctx->proxy = proxy;
// free proxy connection slot
ctx->proxy->initialized = 0;
proxy_unlock_ctx(ctx->proxy);
sock_set_timeout(&ctx->socket, WS_TIMEOUT); sock_set_timeout(&ctx->socket, WS_TIMEOUT);
sock_set_timeout(&ctx->proxy->proxy, WS_TIMEOUT); sock_set_timeout(&proxy->proxy, WS_TIMEOUT);
ws_ctx_t *a = malloc(sizeof(ws_ctx_t)); ws_ctx_t *a = malloc(sizeof(ws_ctx_t));
ws_ctx_t *b = malloc(sizeof(ws_ctx_t)); ws_ctx_t *b = malloc(sizeof(ws_ctx_t));
a->other = b, b->other = a; a->other = b, b->other = a;
a->client = ctx, b->client = ctx; a->client = ctx, b->client = ctx;
a->socket = &ctx->socket, b->socket = &ctx->proxy->proxy; a->socket = &ctx->socket, b->socket = &proxy->proxy;
ws_handle_frame(a); ws_handle_frame(a);
ws_handle_frame(b); ws_handle_frame(b);
@ -84,11 +96,16 @@ static int ws_frame_handler(ws_ctx_t *ctx) {
void ws_close(ws_ctx_t *ctx) { void ws_close(ws_ctx_t *ctx) {
ws_ctx_t *other = ctx->other; ws_ctx_t *other = ctx->other;
if (other) { if (other) {
proxy_ctx_t *proxy = ctx->client->proxy;
other->other = NULL; other->other = NULL;
logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->client->socket.s_addr, ctx->client->log_prefix); logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->client->socket.s_addr, ctx->client->log_prefix);
info("Closing WebSocket connection");
proxy_close(ctx->client->proxy); proxy->cnx_e = clock_micros();
proxy_unlock_ctx(ctx->client->proxy); char buf[32];
info("Closing WebSocket connection (%s)", format_duration(proxy->cnx_e - proxy->cnx_s, buf));
sock_close(&proxy->proxy);
free(ctx->client->proxy);
tcp_close(ctx->client); tcp_close(ctx->client);
} }
free(ctx); free(ctx);