From a4df483b5580fbc45269d5e5f6a9e20a545ccb5f Mon Sep 17 00:00:00 2001 From: A13501350 <18516149786@163.com> Date: Thu, 15 Oct 2026 00:09:49 +0800 Subject: [PATCH] IIS: preserve duplicate request/response headers with same name Fixes #2991 Unknown headers were copied into headers_in/headers_out with apr_table_setn(), so each duplicate overwrote the previous entry and only the last value survived. HTTP.SYS already exposes every duplicate as a separate HTTP_UNKNOWN_HEADER entry, so switch both loops to apr_table_addn() to keep all values. This also makes duplicate Set-Cookie values reachable: HTTP.SYS keeps one value in the known header slot and pushes the rest into the unknown header list, where they were previously lost (and also clobbered the known slot value, since known headers are transferred first). --- iis/mymodule.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/iis/mymodule.cpp b/iis/mymodule.cpp index dfaee4b2cb..0aba237af1 100644 --- a/iis/mymodule.cpp +++ b/iis/mymodule.cpp @@ -512,7 +512,7 @@ CMyHttpModule::OnSendResponse( for(int i = 0; i < pRawHttpResponse->Headers.UnknownHeaderCount; i++) { - apr_table_setn(r->headers_out, + apr_table_addn(r->headers_out, ZeroTerminate(pRawHttpResponse->Headers.pUnknownHeaders[i].pName, pRawHttpResponse->Headers.pUnknownHeaders[i].NameLength, r->pool), ZeroTerminate(pRawHttpResponse->Headers.pUnknownHeaders[i].pRawValue, pRawHttpResponse->Headers.pUnknownHeaders[i].RawValueLength, r->pool)); } @@ -921,7 +921,7 @@ CMyHttpModule::OnBeginRequest( for(int i = 0; i < req->Headers.UnknownHeaderCount; i++) { - apr_table_setn(r->headers_in, + apr_table_addn(r->headers_in, ZeroTerminate(req->Headers.pUnknownHeaders[i].pName, req->Headers.pUnknownHeaders[i].NameLength, r->pool), ZeroTerminate(req->Headers.pUnknownHeaders[i].pRawValue, req->Headers.pUnknownHeaders[i].RawValueLength, r->pool)); }