From b25a0ca3815ba577e8d2f59570c0e6f0be85b052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Jaramago=20Fern=C3=A1ndez?= Date: Thu, 12 May 2022 18:03:10 +0200 Subject: [PATCH] Fix POST processing of final keys without values for libhttpserver This patch fixes the processing of POST parameters for content type 'application/x-www-form-urlencoded'. Prior to this patch if a final key is present in the params without a value, it's left unprocessed. --- deps/Makefile | 1 + .../final_val_post_process.patch | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 deps/libhttpserver/final_val_post_process.patch diff --git a/deps/Makefile b/deps/Makefile index e4c6e4fae..67639e3ab 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -87,6 +87,7 @@ ifeq ($(REQUIRE_PATCH), true) cd libhttpserver/libhttpserver && patch src/httpserver/http_response.hpp < ../http_response.hpp.patch cd libhttpserver/libhttpserver && patch src/httpserver/string_response.hpp < ../string_response.hpp.patch cd libhttpserver/libhttpserver && patch -p0 < ../re2_regex.patch + cd libhttpserver/libhttpserver && patch -p0 < ../final_val_post_process.patch endif ifeq ($(UNAME_S),FreeBSD) sed -i -e 's/\/bin\/bash/\/usr\/local\/bin\/bash/' libhttpserver/libhttpserver/bootstrap diff --git a/deps/libhttpserver/final_val_post_process.patch b/deps/libhttpserver/final_val_post_process.patch new file mode 100644 index 000000000..9a421a62d --- /dev/null +++ b/deps/libhttpserver/final_val_post_process.patch @@ -0,0 +1,19 @@ +diff --git src/webserver.cpp src/webserver.cpp +index a3104e9..5ae7381 100644 +--- src/webserver.cpp ++++ src/webserver.cpp +@@ -676,6 +676,14 @@ int webserver::finalize_answer( + { + if(hrm->is_allowed(method)) + { ++ // NOTE: Here 'MHD_destroy_post_processor' is required for performing a final 'post_process' ++ // of the 'URL Encode'. This ensures ensures the processing of final key without value left ++ // at the end of the buffer. See function internal doc at 'postprocessor.c'. ++ if (mr->pp != NULL) { ++ MHD_destroy_post_processor(mr->pp); ++ mr->pp = NULL; ++ } ++ + mr->dhrs = ((hrm)->*(mr->callback))(*mr->dhr); //copy in memory (move in case) + if (mr->dhrs->get_response_code() == -1) + {