@@ -133,6 +133,69 @@ class HttpUtilsTest {
133133 .isEqualTo(" theme=dark;[Filtered];[Filtered]; empty=; sessionId=[Filtered]" )
134134 }
135135
136+ @Test
137+ fun `cookie filter replaces comma-separated malformed cookies` () {
138+ assertThat(
139+ HttpUtils .filterCookies(
140+ " theme=dark, sessionId=secret" ,
141+ KeyValueCollectionBehavior .denyList(),
142+ emptyList(),
143+ )
144+ )
145+ .isEqualTo(" [Filtered]" )
146+ }
147+
148+ @Test
149+ fun `cookie filter replaces space-separated malformed cookies` () {
150+ assertThat(
151+ HttpUtils .filterCookies(
152+ " theme=dark sessionId=secret" ,
153+ KeyValueCollectionBehavior .denyList(),
154+ emptyList(),
155+ )
156+ )
157+ .isEqualTo(" [Filtered]" )
158+ }
159+
160+ @Test
161+ fun `cookie filter preserves valid names and values` () {
162+ val cookies =
163+ " plain=abc123; empty=; base64=YWJjZA==; quoted=\" dark\" ; quoted-empty=\"\" ; encoded=hello%2Fworld; !#\$ %&'*+-.^_`|~=!#\$ %&'()*+-./:<=>?@[]^_`{|}~"
164+
165+ assertThat(
166+ HttpUtils .filterCookies(
167+ cookies,
168+ KeyValueCollectionBehavior .denyList(),
169+ emptyList(),
170+ )
171+ )
172+ .isEqualTo(cookies)
173+ }
174+
175+ @Test
176+ fun `cookie filter replaces comma-separated malformed cookies in quoted values` () {
177+ assertThat(
178+ HttpUtils .filterCookies(
179+ " theme=\" dark, sessionId=secret\" " ,
180+ KeyValueCollectionBehavior .denyList(),
181+ emptyList(),
182+ )
183+ )
184+ .isEqualTo(" [Filtered]" )
185+ }
186+
187+ @Test
188+ fun `cookie filter replaces space-separated malformed cookies in quoted values` () {
189+ assertThat(
190+ HttpUtils .filterCookies(
191+ " theme=\" dark sessionId=secret\" " ,
192+ KeyValueCollectionBehavior .denyList(),
193+ emptyList(),
194+ )
195+ )
196+ .isEqualTo(" [Filtered]" )
197+ }
198+
136199 @Test
137200 fun `cookie allow list never exposes malformed pairs` () {
138201 assertThat(
0 commit comments