1010import java .util .Optional ;
1111import java .util .function .Consumer ;
1212import java .util .function .Supplier ;
13+ import java .util .stream .Collectors ;
1314
1415import org .glassfish .jersey .client .authentication .HttpAuthenticationFeature ;
1516import org .glassfish .jersey .media .multipart .FormDataMultiPart ;
@@ -79,6 +80,13 @@ public static RestClientFactory factory(Client client) {
7980 return (aemConfig , target , correlationIdFn )->new JerseyRestClient (aemConfig , target , correlationIdFn , client );
8081 }
8182
83+ private static String constructCookiesValue (JerseyResponse .JerseyResponseCookies cookies ) {
84+ return cookies .cookies .entrySet ()
85+ .stream ()
86+ .map (entry -> entry .getKey () + "=" + entry .getValue ().getValue ())
87+ .collect (Collectors .joining ("; " ));
88+ }
89+
8290 @ Override
8391 public MultipartPayload .Builder multipartPayloadBuilder () {
8492 return new JerseyMultipartPayloadBuilder ();
@@ -113,7 +121,8 @@ public HttpHeaders headers() {
113121
114122 @ Override
115123 public Cookies getCookies () {
116- return new JerseyResponseCookies (response .getCookies ());
124+ Map <String , NewCookie > cookies = response .getCookies ();
125+ return new JerseyResponseCookies (cookies );
117126 }
118127
119128 private static Optional <Response > processResponse (jakarta .ws .rs .core .Response response , MediaType expectedMediaType ) throws RestClientException {
@@ -162,7 +171,7 @@ public boolean isEmpty() {
162171 @ Override
163172 public boolean isPresent () {
164173 return !isEmpty ();
165- }
174+ }
166175 }
167176 }
168177
@@ -178,12 +187,18 @@ private static String inputStreamtoString(InputStream inputStream) throws IOExce
178187 private final class JerseyMultipartPayload implements MultipartPayload {
179188 private final List <PayloadBuilder .NameValuePair > queryParams ;
180189 private final List <PayloadBuilder .NameValuePair > requestHeaders ;
190+ private final List <Cookies > cookiesList ;
181191 private final FormDataMultiPart multipart ;
182192
183- private JerseyMultipartPayload (FormDataMultiPart multipart , List <PayloadBuilder .NameValuePair > queryParams , List <PayloadBuilder .NameValuePair > requestHeaders ) {
193+ private JerseyMultipartPayload (FormDataMultiPart multipart ,
194+ List <PayloadBuilder .NameValuePair > queryParams ,
195+ List <PayloadBuilder .NameValuePair > requestHeaders ,
196+ List <Cookies > cookiesList
197+ ) {
184198 this .multipart = multipart ;
185199 this .queryParams = queryParams ;
186200 this .requestHeaders = requestHeaders ;
201+ this .cookiesList = cookiesList ;
187202 }
188203
189204 @ Override
@@ -200,6 +215,14 @@ public Optional<Response> postToServer(ContentType acceptContentType) throws Res
200215 for (var requestHeader : requestHeaders ) {
201216 invokeBuilder = invokeBuilder .header (requestHeader .name , requestHeader .value );
202217 }
218+ for (var cookies : cookiesList ) {
219+ // for(var newCookie : ((JerseyResponse.JerseyResponseCookies)cookies).cookies.values()) {
220+ // invokeBuilder = invokeBuilder.cookie(newCookie.getName(), newCookie.getValue());
221+ // }
222+ // For some reason, the Jersey client doesn't seem to be formatting cookies added via the cookie() method
223+ // correctly, so instead we are adding a Cookie header with the appropriate value.
224+ invokeBuilder .header ("Cookie" , constructCookiesValue ((JerseyResponse .JerseyResponseCookies ) cookies ));
225+ }
203226 try {
204227 return JerseyResponse .processResponse (invokeBuilder .post (Entity .entity (multipart , multipart .getMediaType ())), acceptMediaType );
205228 } catch (jakarta .ws .rs .ProcessingException e ) {
@@ -212,7 +235,6 @@ public Optional<Response> postToServer(ContentType acceptContentType) throws Res
212235 public void close () throws IOException {
213236 multipart .close ();
214237 }
215-
216238 }
217239
218240 /**
@@ -251,9 +273,19 @@ public JerseyMultipartPayloadBuilder addHeader(String name, String value) {
251273 return this ;
252274 }
253275
276+ @ Override
277+ public JerseyMultipartPayloadBuilder addCookies (Cookies cookies ) {
278+ super .addCookies (cookies );
279+ return this ;
280+ }
281+
254282 @ Override
255283 public MultipartPayload build () {
256- return new JerseyMultipartPayload (multipart , Collections .unmodifiableList (super .queryParams ), Collections .unmodifiableList (super .requestHeaders ));
284+ return new JerseyMultipartPayload (multipart ,
285+ Collections .unmodifiableList (super .queryParams ),
286+ Collections .unmodifiableList (super .requestHeaders ),
287+ Collections .unmodifiableList (super .cookies )
288+ );
257289 }
258290 }
259291
@@ -306,20 +338,31 @@ public JerseyGetRequestBuilder addHeader(String name, String value) {
306338 super .addHeader (name , value );
307339 return this ;
308340 }
341+
342+ @ Override
343+ public JerseyGetRequestBuilder addCookies (Cookies cookies ) {
344+ super .addCookies (cookies );
345+ return this ;
346+ }
309347
310348 @ Override
311349 public GetRequest build () {
312- return new JerseyGetRequest (Collections .unmodifiableList (super .queryParams ), Collections .unmodifiableList (super .requestHeaders ));
350+ return new JerseyGetRequest (Collections .unmodifiableList (super .queryParams ),
351+ Collections .unmodifiableList (super .requestHeaders ),
352+ Collections .unmodifiableList (super .cookies )
353+ );
313354 }
314355 }
315356
316357 private final class JerseyGetRequest implements GetRequest {
317358 private final List <PayloadBuilder .NameValuePair > queryParams ;
318359 private final List <PayloadBuilder .NameValuePair > requestHeaders ;
360+ private final List <Cookies > cookiesList ;
319361
320- JerseyGetRequest (List <PayloadBuilder .NameValuePair > queryParams , List <PayloadBuilder .NameValuePair > requestHeaders ) {
362+ JerseyGetRequest (List <PayloadBuilder .NameValuePair > queryParams , List <PayloadBuilder .NameValuePair > requestHeaders , List < Cookies > cookiesList ) {
321363 this .queryParams = queryParams ;
322364 this .requestHeaders = requestHeaders ;
365+ this .cookiesList = cookiesList ;
323366 }
324367
325368 @ Override
@@ -338,6 +381,14 @@ public Optional<Response> getFromServer(ContentType acceptContentType) throws Re
338381 for (var requestHeader : requestHeaders ) {
339382 invokeBuilder = invokeBuilder .header (requestHeader .name , requestHeader .value );
340383 }
384+ for (var cookies : cookiesList ) {
385+ // for(var newCookie : ((JerseyResponse.JerseyResponseCookies)cookies).cookies.values()) {
386+ // invokeBuilder = invokeBuilder.cookie(newCookie.getName(), newCookie.getValue());
387+ // }
388+ // For some reason, the Jersey client doesn't seem to be formatting cookies added via the cookie() method
389+ // correctly, so instead we are adding a Cookie header with the appropriate value.
390+ invokeBuilder .header ("Cookie" , constructCookiesValue ((JerseyResponse .JerseyResponseCookies ) cookies ));
391+ }
341392 try {
342393 return JerseyResponse .processResponse (invokeBuilder .get (), acceptMediaType );
343394 } catch (jakarta .ws .rs .ProcessingException e ) {
@@ -351,12 +402,20 @@ private class PayloadBuilder {
351402 private record NameValuePair (String name , String value ) {};
352403 private List <NameValuePair > queryParams = new ArrayList <>();
353404 private List <NameValuePair > requestHeaders = new ArrayList <>();
405+ private List <Cookies > cookies = new ArrayList <>();
354406
355407 public PayloadBuilder queryParam (String name , String value ) {
356408 queryParams .add (new NameValuePair (name , value ));
357409 return this ;
358410 }
359411
412+ public PayloadBuilder addCookies (Cookies cookies ) {
413+ if (cookies .isPresent ()) {
414+ this .cookies .add (cookies );
415+ }
416+ return this ;
417+ }
418+
360419 public PayloadBuilder addHeader (String name , String value ) {
361420 requestHeaders .add (new NameValuePair (name , value ));
362421 return this ;
0 commit comments