libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 19e1ed8355744dc2e0c6755e91de43ee335dea31
parent 8962cba42d7a104408608518a161fc0e0311ef4a
Author: Christian Grothoff <christian@grothoff.org>
Date:   Mon, 25 Sep 2023 20:32:41 +0200

-add support for ICECAST-style uploads

Diffstat:
Msrc/include/microhttpd.h | 11++++++++++-
Msrc/microhttpd/connection.c | 21++++++++++++++++++---
2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/include/microhttpd.h b/src/include/microhttpd.h @@ -1503,7 +1503,16 @@ enum MHD_FLAG * Flag set to enable TLS 1.3 early data. This has * security implications, be VERY careful when using this. */ - MHD_USE_INSECURE_TLS_EARLY_DATA = 1U << 18 + MHD_USE_INSECURE_TLS_EARLY_DATA = 1U << 18, + + /** + * Flag set to allow uploads from clients even if the client supplied no + * transfer encoding and no Content-length header. The upload is expected + * to be concluded when the client closes the connection. + * This is in violation of RFC 7230 but useful for + * Icecast. Use at your own risk. + */ + MHD_USE_ICECAST_CLIENT_UPLOADS = 1U << 19 }; diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c @@ -348,7 +348,7 @@ #define REQUEST_LACKS_HOST \ "<html>" \ "<head><title>&quot;Host:&quot; header required</title></head>" \ - "<body>HTTP/1.1 request without <b>&quot;Host:&quot;</b>.</body>"\ + "<body>HTTP/1.1 request without <b>&quot;Host:&quot;</b>.</body>" \ "</html>" #else @@ -457,7 +457,7 @@ #define ERROR_MSG_DATA_NOT_HANDLED_BY_APP \ "<html><head><title>Internal server error</title></head>" \ "<body>Please ask the developer of this Web server to carefully " \ - "read the GNU libmicrohttpd documentation about connection "\ + "read the GNU libmicrohttpd documentation about connection " \ "management and blocking.</body></html>" #else #define ERROR_MSG_DATA_NOT_HANDLED_BY_APP "" @@ -4048,7 +4048,22 @@ parse_connection_headers (struct MHD_Connection *connection) return; } - connection->rq.remaining_upload_size = 0; + if ( ((0 == (MHD_USE_ICECAST_CLIENT_UPLOADS & connection->daemon->options)) || + (! MHD_lookup_header_s_token_ci (connection, + MHD_HTTP_HEADER_CONNECTION, + "close")) ) ) + { + /* Normal case: either no upload allowed, or client has to provide + headers as per below */ + connection->rq.remaining_upload_size = 0; + } + else + { + /* Special Icecast case: client says nothing, but still uploads until + connection close. Only allowed with ICECAST option *and* if the + client at least announced that it will close the connection. */ + connection->rq.remaining_upload_size = MHD_SIZE_UNKNOWN; + } if (MHD_NO != MHD_lookup_connection_value_n (connection, MHD_HEADER_KIND,