Skip to content

Commit 4246c37

Browse files
authored
fix: Date and LocalDateTime serialization in post data (#1150)
1 parent ec5f960 commit 4246c37

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

playwright/src/main/java/com/microsoft/playwright/impl/Serialization.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@
3232
import java.net.URL;
3333
import java.nio.charset.StandardCharsets;
3434
import java.nio.file.Path;
35+
import java.text.DateFormat;
36+
import java.text.SimpleDateFormat;
3537
import java.time.Instant;
3638
import java.time.LocalDateTime;
3739
import java.time.ZoneId;
40+
import java.time.ZoneOffset;
41+
import java.time.format.DateTimeFormatter;
3842
import java.util.*;
3943
import java.util.regex.Pattern;
4044

@@ -43,6 +47,8 @@
4347

4448
class Serialization {
4549
private static final Gson gson = new GsonBuilder().disableHtmlEscaping()
50+
.registerTypeAdapter(Date.class, new DateSerializer())
51+
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer())
4652
.registerTypeAdapter(SameSiteAttribute.class, new SameSiteAdapter().nullSafe())
4753
.registerTypeAdapter(BrowserChannel.class, new ToLowerCaseAndDashSerializer<BrowserChannel>())
4854
.registerTypeAdapter(ColorScheme.class, new ToLowerCaseAndDashSerializer<ColorScheme>())
@@ -468,5 +474,29 @@ public SameSiteAttribute read(JsonReader in) throws IOException {
468474
return SameSiteAttribute.valueOf(value.toUpperCase());
469475
}
470476
}
477+
478+
private static DateFormat iso8601Format() {
479+
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
480+
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
481+
return dateFormat;
482+
}
483+
private static final DateFormat dateFormat = iso8601Format();
484+
485+
private static class DateSerializer implements JsonSerializer<Date> {
486+
@Override
487+
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
488+
return new JsonPrimitive(dateFormat.format(src));
489+
}
490+
}
491+
492+
private static class LocalDateTimeSerializer implements JsonSerializer<LocalDateTime> {
493+
@Override
494+
public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) {
495+
ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(src);
496+
Instant instant = src.toInstant(offset);
497+
return new JsonPrimitive(dateFormat.format(Date.from(instant)));
498+
}
499+
}
500+
471501
}
472502

playwright/src/test/java/com/microsoft/playwright/TestBrowserContextFetch.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import java.io.*;
1010
import java.nio.charset.StandardCharsets;
1111
import java.nio.file.Path;
12+
import java.text.ParseException;
13+
import java.time.LocalDateTime;
14+
import java.time.ZoneId;
1215
import java.util.*;
1316
import java.util.concurrent.ExecutionException;
1417
import java.util.concurrent.Future;
@@ -479,6 +482,28 @@ void shouldOverrideRequestParameters() throws ExecutionException, InterruptedExc
479482
assertEquals("data", new String(req.get().postBody));
480483
}
481484

485+
public static class TestData {
486+
public String name;
487+
public LocalDateTime localDateTime;
488+
public Date date;
489+
public LocalDateTime nullLocalDateTime;
490+
public Date nullDate;
491+
}
492+
493+
@Test
494+
void shouldSerializeDateAndLocalDateTime() throws ExecutionException, InterruptedException, ParseException {
495+
Request pageReq = page.waitForRequest("**/*", () -> page.navigate(server.EMPTY_PAGE));
496+
Future<Server.Request> req = server.futureRequest("/empty.html");
497+
TestData testData = new TestData();
498+
testData.name = "foo";
499+
long currentMillis = 1671776098818L;
500+
testData.date = new Date(currentMillis);
501+
testData.localDateTime = testData.date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
502+
context.request().fetch(pageReq, RequestOptions.create().setMethod("POST").setData(testData));
503+
assertEquals("{\"name\":\"foo\",\"localDateTime\":\"2022-12-23T06:14:58.818Z\",\"date\":\"2022-12-23T06:14:58.818Z\"}",
504+
new String(req.get().postBody));
505+
}
506+
482507
@Test
483508
void shouldSupportApplicationXWwwFormUrlencoded() throws ExecutionException, InterruptedException {
484509
Future<Server.Request> req = server.futureRequest("/empty.html");

0 commit comments

Comments
 (0)