aboutsummaryrefslogtreecommitdiffstats
path: root/vespa-feed-client
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-06-28 21:32:21 +0200
committerJon Marius Venstad <venstad@gmail.com>2021-06-28 21:32:21 +0200
commit91301d6a6672c812e2ea0bb78fc1517d2d18dfb0 (patch)
treea7ea8439dd0fb0575ccec3ecf810797bd2bc2d4b /vespa-feed-client
parent0e888703ca92c8fe7a4a55e607e8e5a883c6bf4e (diff)
Parse tracese properly
Diffstat (limited to 'vespa-feed-client')
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/HttpFeedClient.java20
-rw-r--r--vespa-feed-client/src/test/java/ai/vespa/feed/client/HttpFeedClientTest.java42
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);
}