Skip to content

Commit 9dcab64

Browse files
committed
✨ Added support for cookies into JerseyRestClient
Still needs to be added to SpringRestClient.
1 parent b1e32be commit 9dcab64

6 files changed

Lines changed: 251 additions & 20 deletions

File tree

rest-services/client/src/main/java/com/_4point/aem/docservices/rest_services/client/RestClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ default Builder addStringVersion(String fieldName, List<?> fieldData) {
159159
}
160160
Builder queryParam(String name, String value);
161161
Builder addHeader(String name, String value);
162+
Builder addCookies(Cookies cookies);
162163
MultipartPayload build();
163164
}
164165
}
@@ -190,6 +191,7 @@ public interface GetRequest {
190191
public interface Builder {
191192
Builder queryParam(String name, String value);
192193
Builder addHeader(String name, String value);
194+
Builder addCookies(Cookies cookies);
193195
GetRequest build();
194196
}
195197
}

rest-services/client/src/test/java/com/_4point/aem/docservices/rest_services/client/RestClientTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.junit.jupiter.params.provider.EnumSource;
1515

1616
import com._4point.aem.docservices.rest_services.client.RestClient.ContentType;
17+
import com._4point.aem.docservices.rest_services.client.RestClient.Cookies;
1718
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload;
1819
import com._4point.aem.docservices.rest_services.client.RestClient.MultipartPayload.Builder;
1920
import com._4point.aem.fluentforms.api.Document;
@@ -69,6 +70,11 @@ public Builder addHeader(String name, String value) {
6970
public MultipartPayload build() {
7071
throw new UnsupportedOperationException("Not implemented");
7172
}
73+
74+
@Override
75+
public Builder addCookies(Cookies cookies) {
76+
throw new UnsupportedOperationException("Not implemented");
77+
}
7278
};
7379

7480
private final MockBuilder underTest = new MockBuilder();

rest-services/client/src/test/java/com/_4point/aem/docservices/rest_services/client/docassurance/RestServicesDocAssuranceServiceAdapterTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public MultipartPayload.Builder add(String fieldName, byte[] fieldData, ContentT
225225
public MultipartPayload.Builder add(String fieldName, String fieldData) {
226226
throw new UnsupportedOperationException("This version of add() should never be called.");
227227
}
228+
229+
@Override
230+
public MultipartPayload.Builder addCookies(Cookies cookies) {
231+
throw new UnsupportedOperationException("This version of add() should never be called.");
232+
}
228233
};
229234
}
230235

rest-services/jersey-client/src/main/java/com/_4point/aem/docservices/rest_services/client/jersey/JerseyRestClient.java

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Optional;
1111
import java.util.function.Consumer;
1212
import java.util.function.Supplier;
13+
import java.util.stream.Collectors;
1314

1415
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
1516
import 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

Comments
 (0)