aboutsummaryrefslogtreecommitdiffstats
path: root/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-12-01 14:13:13 +0100
committerHarald Musum <musum@verizonmedia.com>2020-12-01 14:13:13 +0100
commit9c3c3967f9574c08da66b5d2bea26e6c298f0546 (patch)
tree32fcd726dad3c760c658852f6790857ad1c57027 /clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http
parent008477111ac92e2eec81596a5037a205bbea53ff (diff)
Move code in clustercontroller-apputils into clustercontroller-apps
Code in clustercontroller-apputils is now only used from clustercontroller-apps, so those two modules can be merged
Diffstat (limited to 'clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http')
-rw-r--r--clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscHttpRequestHandler.java128
-rw-r--r--clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscMetricWrapper.java52
-rw-r--r--clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/package-info.java5
3 files changed, 185 insertions, 0 deletions
diff --git a/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscHttpRequestHandler.java b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscHttpRequestHandler.java
new file mode 100644
index 00000000000..f518fe23fe6
--- /dev/null
+++ b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscHttpRequestHandler.java
@@ -0,0 +1,128 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.clustercontroller.apputil.communication.http;
+
+import com.yahoo.container.jdisc.LoggingRequestHandler;
+import com.yahoo.jdisc.HeaderFields;
+import com.yahoo.jdisc.Response;
+import com.yahoo.jdisc.handler.CompletionHandler;
+import com.yahoo.text.Utf8;
+import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpRequest;
+import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpRequestHandler;
+import com.yahoo.vespa.clustercontroller.utils.communication.http.HttpResult;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+import java.util.logging.Logger;
+
+/**
+ * Note. This class is tested through apache http instance test, using this as other endpoint.
+ *
+ * @author Haakon Humberset
+ * @author Harald Musum
+ * @author Vegard Sjonfjell
+ */
+public class JDiscHttpRequestHandler extends LoggingRequestHandler {
+
+ private static final Logger log = Logger.getLogger(JDiscHttpRequestHandler.class.getName());
+ private final HttpRequestHandler requestHandler;
+
+ public JDiscHttpRequestHandler(HttpRequestHandler handler, LoggingRequestHandler.Context parentCtx) {
+ super(parentCtx);
+ this.requestHandler = handler;
+ }
+
+ static class EmptyCompletionHandler implements CompletionHandler {
+ @Override
+ public void completed() { }
+ @Override
+ public void failed(Throwable throwable) { }
+ }
+
+ @Override
+ public com.yahoo.container.jdisc.HttpResponse handle(com.yahoo.container.jdisc.HttpRequest request) {
+ final HttpRequest legacyRequest = new HttpRequest();
+ final com.yahoo.jdisc.http.HttpRequest jDiscRequest = request.getJDiscRequest();
+
+ legacyRequest.setScheme(request.getUri().getScheme());
+ legacyRequest.setHost(request.getUri().getHost());
+ setOperation(legacyRequest, request.getMethod());
+ legacyRequest.setPort(request.getUri().getPort());
+ legacyRequest.setPath(request.getUri().getPath());
+ copyPostData(request, legacyRequest);
+ copyRequestHeaders(legacyRequest, jDiscRequest);
+ copyParameters(legacyRequest, jDiscRequest);
+ legacyRequest.setTimeout(Duration.ofMinutes(60).toMillis());
+
+ try {
+ final HttpResult result = requestHandler.handleRequest(legacyRequest);
+ log.fine("Got result " + result.toString(true));
+ return copyResponse(result);
+ } catch (Exception e) {
+ log.warning("Caught exception while handling request: " + e.getMessage());
+ return new com.yahoo.container.jdisc.HttpResponse(500) {
+ @Override
+ public void render(OutputStream outputStream) throws IOException {
+ outputStream.write(Utf8.toBytes(e.getMessage()));
+ }
+ };
+ }
+ }
+
+ static HttpRequest setOperation(HttpRequest request, com.yahoo.jdisc.http.HttpRequest.Method method) {
+ switch (method) {
+ case GET: return request.setHttpOperation(HttpRequest.HttpOp.GET);
+ case POST: return request.setHttpOperation(HttpRequest.HttpOp.POST);
+ case PUT: return request.setHttpOperation(HttpRequest.HttpOp.PUT);
+ case DELETE: return request.setHttpOperation(HttpRequest.HttpOp.DELETE);
+ default: throw new IllegalStateException("Unhandled method " + method);
+ }
+ }
+
+ private com.yahoo.container.jdisc.HttpResponse copyResponse(final HttpResult result) {
+ return new com.yahoo.container.jdisc.HttpResponse(result.getHttpReturnCode()) {
+ @Override
+ public void render(OutputStream outputStream) throws IOException {
+ outputStream.write(Utf8.toBytes(result.getContent().toString()));
+ }
+
+ @Override
+ public void complete(){
+ copyResponseHeaders(result, getJdiscResponse());
+ }
+ };
+ }
+
+ private void copyPostData(com.yahoo.container.jdisc.HttpRequest request, HttpRequest legacyRequest) {
+ try {
+ legacyRequest.setPostContent(new String(request.getData().readAllBytes(), StandardCharsets.UTF_8));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void copyParameters(HttpRequest legacyRequest, com.yahoo.jdisc.http.HttpRequest jDiscRequest) {
+ for (String key : jDiscRequest.parameters().keySet()) {
+ for (String value : jDiscRequest.parameters().get(key)) {
+ legacyRequest.addUrlOption(key, value);
+ }
+ }
+ }
+
+ private static void copyRequestHeaders(HttpRequest legacyRequest, com.yahoo.jdisc.http.HttpRequest jDiscRequest) {
+ for (String key : jDiscRequest.headers().keySet()) {
+ for (String value : jDiscRequest.headers().get(key)) {
+ legacyRequest.addHttpHeader(key, value);
+ }
+ }
+ }
+
+ private static HeaderFields copyResponseHeaders(HttpResult result, Response response) {
+ HeaderFields headers = new HeaderFields();
+ for (HttpRequest.KeyValuePair keyValuePair : result.getHeaders()) {
+ response.headers().put((keyValuePair.getKey()), keyValuePair.getValue());
+ }
+ return headers;
+ }
+
+}
diff --git a/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscMetricWrapper.java b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscMetricWrapper.java
new file mode 100644
index 00000000000..559eaee4821
--- /dev/null
+++ b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/JDiscMetricWrapper.java
@@ -0,0 +1,52 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.clustercontroller.apputil.communication.http;
+
+import com.yahoo.jdisc.Metric;
+import com.yahoo.vespa.clustercontroller.utils.util.MetricReporter;
+
+import java.util.logging.Logger;
+
+public class JDiscMetricWrapper implements MetricReporter {
+
+ private final Object lock = new Object();
+ private Metric m;
+
+ private static class ContextWrapper implements MetricReporter.Context {
+ Metric.Context wrappedContext;
+
+ public ContextWrapper(Metric.Context wrapped) {
+ this.wrappedContext = wrapped;
+ }
+ }
+
+ public JDiscMetricWrapper(Metric m) {
+ this.m = m;
+ }
+
+ public void updateMetricImplementation(Metric m) {
+ synchronized (lock) {
+ this.m = m;
+ }
+ }
+
+ public void set(String s, Number number, MetricReporter.Context context) {
+ synchronized (lock) {
+ ContextWrapper cw = (ContextWrapper) context;
+ m.set(s, number, cw == null ? null : cw.wrappedContext);
+ }
+ }
+
+ public void add(String s, Number number, MetricReporter.Context context) {
+ synchronized (lock) {
+ ContextWrapper cw = (ContextWrapper) context;
+ m.add(s, number, cw == null ? null : cw.wrappedContext);
+ }
+ }
+
+ public MetricReporter.Context createContext(java.util.Map<java.lang.String,?> stringMap) {
+ synchronized (lock) {
+ return new ContextWrapper(m.createContext(stringMap));
+ }
+ }
+
+}
diff --git a/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/package-info.java b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/package-info.java
new file mode 100644
index 00000000000..5d09603bea6
--- /dev/null
+++ b/clustercontroller-apps/src/main/java/com/yahoo/vespa/clustercontroller/apputil/communication/http/package-info.java
@@ -0,0 +1,5 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+package com.yahoo.vespa.clustercontroller.apputil.communication.http;
+
+import com.yahoo.osgi.annotation.ExportPackage;