diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-06-28 21:32:21 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-06-28 21:32:21 +0200 |
commit | 91301d6a6672c812e2ea0bb78fc1517d2d18dfb0 (patch) | |
tree | a7ea8439dd0fb0575ccec3ecf810797bd2bc2d4b /vespa-feed-client | |
parent | 0e888703ca92c8fe7a4a55e607e8e5a883c6bf4e (diff) |
Parse tracese properly
Diffstat (limited to 'vespa-feed-client')
-rw-r--r-- | vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java | 20 | ||||
-rw-r--r-- | vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java | 42 |
2 files changed, 52 insertions, 10 deletions
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java index 6e0d9aa5ec2..95208d06208 100644 --- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java +++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.JsonToken; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.StringJoiner; @@ -129,14 +130,27 @@ class HttpFeedClient implements FeedClient { if (parser.nextToken() != JsonToken.START_OBJECT) throw new ResultParseException( documentId, - "Expected '" + JsonToken.START_OBJECT + "', but found '" + parser.currentToken() + "' in: " - + new String(response.body(), UTF_8)); + "Expected '" + JsonToken.START_OBJECT + "', but found '" + parser.currentToken() + "' in: " + + new String(response.body(), UTF_8)); String name; while ((name = parser.nextFieldName()) != null) { switch (name) { case "message": message = parser.nextTextValue(); break; - case "trace": trace = parser.nextTextValue(); break; + case "trace": { + if (parser.nextToken() != JsonToken.START_ARRAY) + throw new ResultParseException(documentId, + "Expected 'trace' to be an array, but got '" + parser.currentToken() + "' in: " + + new String(response.body(), UTF_8)); + int start = (int) parser.getTokenLocation().getByteOffset(); + int depth = 1; + while (depth > 0) switch (parser.nextToken()) { + case START_ARRAY: ++depth; break; + case END_ARRAY: --depth; break; + } + int end = (int) parser.getTokenLocation().getByteOffset() + 1; + trace = new String(response.body(), start, end - start, UTF_8); + }; break; default: parser.nextToken(); } } diff --git a/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java b/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java index dd0ead799ff..fe079270f9b 100644 --- a/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java +++ b/vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java @@ -79,8 +79,22 @@ class HttpFeedClientTest { ("{\n" + " \"pathId\": \"/document/v1/ns/type/docid/0\",\n" + " \"id\": \"id:ns:type::0\",\n" + - " \"message\": \"Relax, take it easy,\",\n" + - " \"trace\": \"for there is nothing that we can do.\"\n" + + " \"message\": \"Relax, take it easy.\",\n" + + " \"trace\": [\n" + + " {\n" + + " \"message\": \"For there is nothing that we can do.\"\n" + + " },\n" + + " {\n" + + " \"fork\": [\n" + + " {\n" + + " \"message\": \"Relax, take is easy.\"\n" + + " },\n" + + " {\n" + + " \"message\": \"Blame it on me or blame it on you.\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ]\n" + "}").getBytes(UTF_8)); return CompletableFuture.completedFuture(response); } @@ -95,8 +109,22 @@ class HttpFeedClientTest { .get(); assertEquals(Result.Type.conditionNotMet, result.type()); assertEquals(id, result.documentId()); - assertEquals(Optional.of("Relax, take it easy,"), result.resultMessage()); - assertEquals(Optional.of("for there is nothing that we can do."), result.traceMessage()); + assertEquals(Optional.of("Relax, take it easy."), result.resultMessage()); + assertEquals(Optional.of("[\n" + + " {\n" + + " \"message\": \"For there is nothing that we can do.\"\n" + + " },\n" + + " {\n" + + " \"fork\": [\n" + + " {\n" + + " \"message\": \"Relax, take is easy.\"\n" + + " },\n" + + " {\n" + + " \"message\": \"Blame it on me or blame it on you.\"\n" + + " }\n" + + " ]\n" + + " }\n" + + " ]"), result.traceMessage()); // Put is a POST, and a Vespa error is a ResultException. dispatch.set((documentId, request) -> { @@ -111,7 +139,7 @@ class HttpFeedClientTest { " \"pathId\": \"/document/v1/ns/type/docid/0\",\n" + " \"id\": \"id:ns:type::0\",\n" + " \"message\": \"Ooops! ... I did it again.\",\n" + - " \"trace\": \"I played with your heart. Got lost in the game.\"\n" + + " \"trace\": [ { \"message\": \"I played with your heart. Got lost in the game.\" } ]\n" + "}").getBytes(UTF_8)); return CompletableFuture.completedFuture(response); } @@ -132,7 +160,7 @@ class HttpFeedClientTest { .get()); assertTrue(expected.getCause() instanceof ResultException); assertEquals("Ooops! ... I did it again.", expected.getCause().getMessage()); - assertEquals("I played with your heart. Got lost in the game.", ((ResultException) expected.getCause()).getTrace().get()); + assertEquals("[ { \"message\": \"I played with your heart. Got lost in the game.\" } ]", ((ResultException) expected.getCause()).getTrace().get()); // Handler error is a FeedException. @@ -148,7 +176,7 @@ class HttpFeedClientTest { " \"pathId\": \"/document/v1/ns/type/docid/0\",\n" + " \"id\": \"id:ns:type::0\",\n" + " \"message\": \"Alla ska i jorden.\",\n" + - " \"trace\": \"Din tid den kom, och senn så for den. \"\n" + + " \"trace\": [ { \"message\": \"Din tid den kom, och senn så for den.\" } ]\n" + "}").getBytes(UTF_8)); return CompletableFuture.completedFuture(response); } |