From 365d3f3c6c706539f142294d2f92fbe568cf12cb Mon Sep 17 00:00:00 2001 From: Ismail Ismailov Date: Tue, 21 Sep 2021 08:14:46 +0200 Subject: [PATCH 1/2] Fix when request body is empty string --- .../java/org/zalando/logbook/json/JsonPathBodyFilters.java | 2 +- .../org/zalando/logbook/json/JsonPathBodyFiltersTest.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java b/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java index d4ceec862..0e5dc20d4 100644 --- a/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java +++ b/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java @@ -95,7 +95,7 @@ private static class JsonPathBodyFilter implements BodyFilter { public String filter( @Nullable final String contentType, final String body) { - if (JSON.test(contentType)) { + if (!body.isEmpty() && JSON.test(contentType)) { final DocumentContext original = CONTEXT.parse(body); return operation.filter(original).jsonString(); } diff --git a/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java b/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java index 8e806eb4c..622b4cfd8 100644 --- a/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java +++ b/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java @@ -232,4 +232,11 @@ void doesNotFailOnMissingPath() { assertThat(unit.filter("application/json", student)) .isEqualToIgnoringWhitespace(student); } + + @Test + void doesNotFailOnEmptyBody() { + final BodyFilter unit = jsonPath("$.id").replace(compile("\\s+"), "XXX"); + + unit.filter(type, ""); + } } \ No newline at end of file From c702ffc15cac859035c4935ee9c31367b577c752 Mon Sep 17 00:00:00 2001 From: Ismail Ismailov Date: Tue, 28 Sep 2021 08:36:06 +0200 Subject: [PATCH 2/2] Handle exceptions during body parsing --- .../logbook/json/JsonPathBodyFilters.java | 12 +++++++-- .../logbook/json/JsonPathBodyFiltersTest.java | 26 ++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java b/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java index ee56d3fa7..19a8364e7 100644 --- a/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java +++ b/logbook-json/src/main/java/org/zalando/logbook/json/JsonPathBodyFilters.java @@ -12,6 +12,7 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apiguardian.api.API; import org.zalando.logbook.BodyFilter; @@ -28,6 +29,7 @@ import static org.zalando.logbook.json.JsonMediaType.JSON; @API(status = EXPERIMENTAL) +@Slf4j @NoArgsConstructor(access = PRIVATE) public final class JsonPathBodyFilters { @@ -97,12 +99,18 @@ private static class JsonPathBodyFilter implements BodyFilter { public String filter( @Nullable final String contentType, final String body) { - if (!body.isEmpty() && JSON.test(contentType)) { + if (body.isEmpty() || !JSON.test(contentType)) { + return body; + } + + try { final DocumentContext original = CONTEXT.parse(body); return operation.filter(original).jsonString(); + } catch (Exception e) { + log.trace("The body could not be filtered, the following exception {} has been thrown", e.getClass()); + return body; } - return body; } @Nullable diff --git a/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java b/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java index 734883248..8ec9f7d3f 100644 --- a/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java +++ b/logbook-json/src/test/java/org/zalando/logbook/json/JsonPathBodyFiltersTest.java @@ -241,13 +241,6 @@ void doesNotFailOnMissingPath() { .isEqualToIgnoringWhitespace(student); } - @Test - void doesNotFailOnEmptyBody() { - final BodyFilter unit = jsonPath("$.id").replace(compile("\\s+"), "XXX"); - - unit.filter(type, ""); - } - @Test void replacesValuesDynamicallyWhenBodyIsUnwrappedArray() throws IOException { String cars = Resources.toString(getResource("cars-unwrapped-array.json"), UTF_8); @@ -259,4 +252,23 @@ void replacesValuesDynamicallyWhenBodyIsUnwrappedArray() throws IOException { .assertEquals("$.[1].name", "BMW") .assertEquals("$.[2].name", "FIAT"); } + + @Test + void doesNotFailWhenBodyIsEmpty() { + final BodyFilter unit = jsonPath("$.id").replace(compile("\\s+"), "XXX"); + + String actual = unit.filter(type, ""); + + assertThat(actual).isEmpty(); + } + + @Test + void shouldReturnSameBodyWhenBodyIsInvalidJson() { + String invalidBody = "{\"id\": 1, \"name\": \"Alice\",}"; + final BodyFilter unit = jsonPath("$.id").replace(compile("\\s+"), "XXX"); + + String actual = unit.filter(type, invalidBody); + + assertThat(actual).isEqualTo(invalidBody); + } } \ No newline at end of file