summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java54
1 files changed, 8 insertions, 46 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
index 2c26a302ece..76702a1d4e0 100644
--- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
+++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
@@ -17,7 +17,6 @@ import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.container.jdisc.LoggingRequestHandler;
import com.yahoo.container.jdisc.RequestHandlerSpec;
import com.yahoo.container.jdisc.VespaHeaders;
-import com.yahoo.io.IOUtils;
import com.yahoo.jdisc.Metric;
import com.yahoo.jdisc.Request;
import com.yahoo.language.process.Embedder;
@@ -43,14 +42,13 @@ import com.yahoo.search.searchchain.SearchChainRegistry;
import com.yahoo.search.statistics.ElapsedTime;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.ObjectTraverser;
-import com.yahoo.slime.SlimeUtils;
import com.yahoo.yolean.Exceptions;
import com.yahoo.yolean.trace.TraceNode;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executor;
@@ -490,23 +488,9 @@ public class SearchHandler extends LoggingRequestHandler {
|| ! JSON_CONTENT_TYPE.equals(getMediaType(request)))
return request.propertyMap();
- Inspector inspector;
- try {
- // Use an 4k buffer, that should be plenty for most json requests to pass in a single chunk
- byte[] byteArray = IOUtils.readBytes(request.getData(), 4096);
- inspector = SlimeUtils.jsonToSlime(byteArray).get();
- if (inspector.field("error_message").valid()) {
- throw new IllegalInputException("Illegal query: " + inspector.field("error_message").asString() + " at: '" +
- new String(inspector.field("offending_input").asData(), StandardCharsets.UTF_8) + "'");
- }
-
- } catch (IOException e) {
- throw new RuntimeException("Problem reading POSTed data", e);
- }
+ Map<String, String> requestMap = new Json2SingleLevelMap(request.getData()).parse();
// Add fields from JSON to the request map
- Map<String, String> requestMap = new HashMap<>();
- createRequestMapping(inspector, requestMap, "");
requestMap.putAll(request.propertyMap());
if (requestMap.containsKey("yql") && (requestMap.containsKey("select.where") || requestMap.containsKey("select.grouping")) )
@@ -517,35 +501,13 @@ public class SearchHandler extends LoggingRequestHandler {
return requestMap;
}
+ @Deprecated // TODO: Remove on Vespa 9
public void createRequestMapping(Inspector inspector, Map<String, String> map, String parent) {
- inspector.traverse((ObjectTraverser) (key, value) -> {
- String qualifiedKey = parent + key;
- switch (value.type()) {
- case BOOL:
- map.put(qualifiedKey, Boolean.toString(value.asBool()));
- break;
- case DOUBLE:
- map.put(qualifiedKey, Double.toString(value.asDouble()));
- break;
- case LONG:
- map.put(qualifiedKey, Long.toString(value.asLong()));
- break;
- case STRING:
- map.put(qualifiedKey , value.asString());
- break;
- case ARRAY:
- map.put(qualifiedKey, value.toString()); // XXX: Causes parsing the JSON twice (Query.setPropertiesFromRequestMap)
- break;
- case OBJECT:
- if (qualifiedKey.equals("select.where") || qualifiedKey.equals("select.grouping")) {
- map.put(qualifiedKey, value.toString()); // XXX: Causes parsing the JSON twice (Query.setPropertiesFromRequestMap)
- break;
- }
- createRequestMapping(value, map, qualifiedKey + ".");
- break;
- }
-
- });
+ try {
+ new Json2SingleLevelMap(new ByteArrayInputStream(inspector.toString().getBytes(StandardCharsets.UTF_8))).parse(map, parent);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed creating request mapping for parent '" + parent + "'", e);
+ }
}
@Override