Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,17 @@ public MutableHttpRequest<B> cookie(Cookie cookie) {

private void updateCookies() {
headers.remove(HttpHeaders.COOKIE);
StringBuilder sb = new StringBuilder();
int count = 0;
for (Cookie cookie : cookies.getAll()) {
headers.add(HttpHeaders.COOKIE, ClientCookieEncoder.INSTANCE.encode(cookie));
if (count > 0) {
sb.append("; ");
}
sb.append(ClientCookieEncoder.INSTANCE.encode(cookie));
count++;
}
if (sb.length() > 0) {
headers.set(HttpHeaders.COOKIE, sb.toString());
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.micronaut.http.cookie;

import io.micronaut.http.HttpHeaders;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.cookie.Cookie;
import io.micronaut.http.client.netty.NettyClientHttpRequestFactory;
import io.micronaut.http.simple.SimpleHttpRequestFactory;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CookieHeaderSingleValueTest {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test should be placed in where other cookie related tests are keep in the io.micronaut.http.cookie package of the micronaut-http module

Copy link
Author

@Jarvx Jarvx Oct 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay. I'll move it to the folder http/src/test/ . Please understand that it's not easy to find perfect test case for me at the moment. I'll need your feedback for this information.


private static final Set<Cookie> COOKIES = new LinkedHashSet<Cookie>() {{
add(Cookie.of("a", "1"));
add(Cookie.of("b", "2"));
add(Cookie.of("a", "3"));
}};

private static String normalize(String header) {
if (header == null) {
return "";
}
// remove all whitespace for deterministic comparison (some implementations include a space after semicolon)
return header.replaceAll("\\s+", "").trim();
}

private static List<String> headerValues(MutableHttpRequest<?> request, String name) {
Iterable<String> it = request.getHeaders().getAll(name);
return StreamSupport.stream(it.spliterator(), false).collect(Collectors.toList());
}

@Test
public void simpleRequestAddsCookiesIntoSingleHeader() {
MutableHttpRequest<?> request = new SimpleHttpRequestFactory().get("/");
// ensure starting clean
request.getHeaders().remove(HttpHeaders.COOKIE);

for (Cookie c : COOKIES) {
request.cookie(c);
}

List<String> all = headerValues(request, HttpHeaders.COOKIE);
assertEquals(1, all.size(), "Expected exactly one Cookie header value for SimpleHttpRequest");

String header = request.getHeaders().get(HttpHeaders.COOKIE);
assertEquals("a=3;b=2", normalize(header));
}

@Test
public void nettyClientRequestAddsCookiesIntoSingleHeader() {
MutableHttpRequest<?> request = new NettyClientHttpRequestFactory().get("/");
// ensure starting clean
request.getHeaders().remove(HttpHeaders.COOKIE);

for (Cookie c : COOKIES) {
request.cookie(c);
}

List<String> all = headerValues(request, HttpHeaders.COOKIE);
assertEquals(1, all.size(), "Expected exactly one Cookie header value for NettyClientHttpRequest");

String header = request.getHeaders().get(HttpHeaders.COOKIE);
assertEquals("a=3;b=2", normalize(header));
}

@Test
public void addingCookiesTwiceKeepsSingleHeaderWithLastValueWin() {
MutableHttpRequest<?> request = new SimpleHttpRequestFactory().get("/");
request.getHeaders().remove(HttpHeaders.COOKIE);

for (Cookie c : COOKIES) {
request.cookie(c);
}
// add again to exercise mutation
for (Cookie c : COOKIES) {
request.cookie(c);
}

List<String> all = headerValues(request, HttpHeaders.COOKIE);
assertEquals(1, all.size(), "Expected exactly one Cookie header value after repeated additions");

String header = request.getHeaders().get(HttpHeaders.COOKIE);
assertEquals("a=3;b=2", normalize(header));
}
}