From f1baf7dd48c4ccb8d2d0ab0b24547f2793bb8588 Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Thu, 2 May 2024 10:15:48 +0200 Subject: [PATCH] nghttp2: set the data field for event route - reset ctx fields when nothing was set from session/stream --- src/modules/nghttp2/nghttp2_server.c | 34 ++++++++++++++++++++++++---- src/modules/nghttp2/nghttp2_server.h | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/modules/nghttp2/nghttp2_server.c b/src/modules/nghttp2/nghttp2_server.c index d8c23220a13..6f5faf02ad6 100644 --- a/src/modules/nghttp2/nghttp2_server.c +++ b/src/modules/nghttp2/nghttp2_server.c @@ -518,11 +518,25 @@ static int on_request_recv(nghttp2_session *session, if(stream_data->request_method) { _ksr_nghttp2_ctx.method.s = stream_data->request_method; _ksr_nghttp2_ctx.method.len = strlen(_ksr_nghttp2_ctx.method.s); + } else { + _ksr_nghttp2_ctx.method.s = NULL; + _ksr_nghttp2_ctx.method.len = 0; } if(session_data->client_addr) { _ksr_nghttp2_ctx.srcip.s = session_data->client_addr; _ksr_nghttp2_ctx.srcip.len = strlen(_ksr_nghttp2_ctx.srcip.s); + } else { + _ksr_nghttp2_ctx.srcip.s = NULL; + _ksr_nghttp2_ctx.srcip.len = 0; + } + + if(stream_data->request_data.len > 0) { + _ksr_nghttp2_ctx.data.s = stream_data->request_data.s; + _ksr_nghttp2_ctx.data.len = stream_data->request_data.len; + } else { + _ksr_nghttp2_ctx.data.s = NULL; + _ksr_nghttp2_ctx.data.len = 0; } ksr_event_route(); @@ -567,16 +581,26 @@ static int on_frame_recv_callback( static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags, int32_t stream_id, const uint8_t *data, size_t len, void *user_data) { - struct Request *req; + http2_stream_data *stream_data; (void)flags; - (void)user_data; - req = nghttp2_session_get_stream_user_data(session, stream_id); - if(req) { + stream_data = nghttp2_session_get_stream_user_data(session, stream_id); + + if(stream_data) { LM_DBG("---------------------------- (DATA chunk) [%lu bytes]\n", (unsigned long int)len); LM_DBG("[[%.*s]]", (int)len, (char *)data); - LM_DBG("----------------------------\n"); + LM_DBG("\n----------------------------\n"); + stream_data->request_data.s = realloc(stream_data->request_data.s, + len + stream_data->request_data.len + 1); + if(stream_data->request_data.s == NULL) { + LM_ERR("failed to allocate system memory\n"); + return 0; + } + memcpy(stream_data->request_data.s + stream_data->request_data.len, + data, len); + stream_data->request_data.len += len; + stream_data->request_data.s[stream_data->request_data.len] = '\0'; } return 0; } diff --git a/src/modules/nghttp2/nghttp2_server.h b/src/modules/nghttp2/nghttp2_server.h index ac69a147313..63650db53af 100644 --- a/src/modules/nghttp2/nghttp2_server.h +++ b/src/modules/nghttp2/nghttp2_server.h @@ -80,6 +80,7 @@ typedef struct http2_stream_data char *request_pathfull; char *request_method; http2_msghdr_t *hdrlist; + str request_data; int32_t stream_id; int fd; } http2_stream_data;