summaryrefslogtreecommitdiffstats
path: root/jdisc_http_service
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-04-24 18:17:17 +0200
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-04-24 18:26:36 +0200
commit9e0d7b273fd0cd717bb18aa00e6e9a64ef9bbd7b (patch)
tree04ada46037d2eced41afa5a869d156bef8fb137e /jdisc_http_service
parent133b9554c589e9bede4ec351b08e4b17e59650d7 (diff)
Remove HttpClient from jdisc_http_service
The unit tests for HttpClient have been disabled for 3 years, and multiple tests were failing after enabling them. I could not find any use of HttpClient in Vespa. The com.yahoo.jdisc.http.client was not marked as public API.
Diffstat (limited to 'jdisc_http_service')
-rw-r--r--jdisc_http_service/pom.xml10
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/AsyncResponseHandler.java187
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequest.java26
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequestContent.java99
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequest.java36
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestBody.java48
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestContent.java124
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequest.java25
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequestContent.java65
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyResponse.java121
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/HttpClient.java261
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ProxyServerFactory.java33
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/RequestBuilderFactory.java37
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/FilterException.java12
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilter.java14
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilterContext.java79
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridge.java24
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/package-info.java4
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/package-info.java4
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/core/HeaderFieldsUtil.java142
-rw-r--r--jdisc_http_service/src/main/java/com/yahoo/jdisc/http/test/ClientTestDriver.java119
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AbstractClientTestCase.java230
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AsyncResponseHandlerTestCase.java60
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientErrorTestCase.java17
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientThreadingTestCase.java108
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/EmptyResponseTestCase.java40
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/HttpClientTestCase.java578
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ProxyServerFactoryTestCase.java42
-rw-r--r--jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridgeTestCase.java79
29 files changed, 0 insertions, 2624 deletions
diff --git a/jdisc_http_service/pom.xml b/jdisc_http_service/pom.xml
index b58f72c0cc6..3ab541f2434 100644
--- a/jdisc_http_service/pom.xml
+++ b/jdisc_http_service/pom.xml
@@ -22,16 +22,6 @@
<classifier>no_aop</classifier>
</dependency>
<dependency>
- <groupId>com.ning</groupId>
- <artifactId>async-http-client</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
</dependency>
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/AsyncResponseHandler.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/AsyncResponseHandler.java
deleted file mode 100644
index 19f65633419..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/AsyncResponseHandler.java
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHandler;
-import com.ning.http.client.FluentCaseInsensitiveStringsMap;
-import com.ning.http.client.HttpResponseBodyPart;
-import com.ning.http.client.HttpResponseHeaders;
-import com.ning.http.client.HttpResponseStatus;
-import com.ning.http.client.Response;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.Timer;
-import com.yahoo.jdisc.handler.CompletionHandler;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.HttpResponse;
-
-import java.net.ConnectException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- * @since 2.0
- */
-class AsyncResponseHandler implements AsyncHandler<Response> {
-
- private final CompletionHandler abortionHandler = new AbortionHandler();
- private final Request request;
- private final ResponseHandler responseHandler;
- private final Metric metric;
- private final Metric.Context metricCtx;
- private final Timer timer;
- private int statusCode;
- private String statusText;
- private ContentChannel content;
- private boolean aborted = false;
- private long requestCreationTime;
- private long transferStartTime;
-
- public AsyncResponseHandler(Request request, ResponseHandler responseHandler, Metric metric,
- Metric.Context metricCtx)
- {
- this.request = request;
- this.responseHandler = responseHandler;
- this.metric = metric;
- this.metricCtx = metricCtx;
- this.timer = request.container().getInstance(Timer.class);
- metric.add(HttpClient.Metrics.NUM_REQUESTS, 1, metricCtx);
- this.requestCreationTime = timer.currentTimeMillis();
- }
-
- @Override
- public void onThrowable(Throwable t) {
- abort(t);
- }
-
- @Override
- public STATE onStatusReceived(HttpResponseStatus status) throws Exception {
- if (aborted) {
- return STATE.ABORT;
- }
- long latency = timer.currentTimeMillis() - request.creationTime(TimeUnit.MILLISECONDS);
- metric.set(HttpClient.Metrics.REQUEST_LATENCY, latency, metricCtx);
- metric.add(HttpClient.Metrics.NUM_RESPONSES, 1, metricCtx);
- statusCode = status.getStatusCode();
- statusText = status.getStatusText();
-
- metric.add(HttpClient.Metrics.NUM_BYTES_RECEIVED, ((Integer.SIZE)/8) + statusText.getBytes().length, metricCtx); // status code is an integer
- return STATE.CONTINUE;
- }
-
- @Override
- public STATE onHeadersReceived(HttpResponseHeaders headers) throws Exception {
- this.transferStartTime = timer.currentTimeMillis();
-
- if (aborted) {
- return STATE.ABORT;
- }
- HttpResponse response = HttpResponse.newInstance(statusCode, statusText);
-
- FluentCaseInsensitiveStringsMap headerMap = headers.getHeaders();
- response.headers().addAll(headerMap);
- content = responseHandler.handleResponse(response);
-
- metric.add(HttpClient.Metrics.NUM_BYTES_RECEIVED, headerMap.size(), metricCtx);
-
- return STATE.CONTINUE;
- }
-
- @Override
- public STATE onBodyPartReceived(HttpResponseBodyPart part) throws Exception {
- if (aborted) {
- return STATE.ABORT;
- }
- metric.add(HttpClient.Metrics.NUM_BYTES_RECEIVED, part.getBodyPartBytes().length, metricCtx);
-
- content.write(part.getBodyByteBuffer(), abortionHandler);
- return STATE.CONTINUE;
- }
-
- @Override
- public Response onCompleted() throws Exception {
- long now = timer.currentTimeMillis();
- metric.set(HttpClient.Metrics.TRANSFER_LATENCY, now - transferStartTime, metricCtx);
- metric.set(HttpClient.Metrics.TOTAL_LATENCY, now - requestCreationTime, metricCtx);
-
- if (aborted) {
- return null;
- }
- content.close(abortionHandler);
- return EmptyResponse.INSTANCE;
- }
-
- /**
- * Returns the original request associated with this handler. Note: It is the caller's responsibility to ensure
- * that the request is properly retained and released.
- */
- public Request getRequest() {
- return request;
- }
-
- private void abort(Throwable t) {
- if (aborted) {
- return;
- }
- aborted = true;
- updateErrorMetric(t);
- if (content == null) {
- dispatchErrorResponse(t);
- }
- if (content != null) {
- terminateContent();
- }
- }
-
- private void updateErrorMetric(Throwable t) {
- try {
- if (t instanceof ConnectException) {
- metric.add(HttpClient.Metrics.CONNECTION_EXCEPTIONS, 1, metricCtx);
- } else if (t instanceof TimeoutException) {
- metric.add(HttpClient.Metrics.TIMEOUT_EXCEPTIONS, 1, metricCtx);
- } else {
- metric.add(HttpClient.Metrics.OTHER_EXCEPTIONS, 1, metricCtx);
- }
- } catch (Exception e) {
- // ignore
- }
- }
-
- private void dispatchErrorResponse(Throwable t) {
- int status;
- if (t instanceof ConnectException) {
- status = com.yahoo.jdisc.Response.Status.SERVICE_UNAVAILABLE;
- } else if (t instanceof TimeoutException) {
- status = com.yahoo.jdisc.Response.Status.REQUEST_TIMEOUT;
- } else {
- status = com.yahoo.jdisc.Response.Status.BAD_REQUEST;
- }
- try {
- content = responseHandler.handleResponse(HttpResponse.newError(request, status, t));
- } catch (Exception e) {
- // ignore
- }
- }
-
- private void terminateContent() {
- try {
- content.close(null);
- } catch (Exception e) {
- // ignore
- }
- }
-
- private class AbortionHandler implements CompletionHandler {
-
- @Override
- public void completed() {
-
- }
-
- @Override
- public void failed(Throwable t) {
- abort(t);
- }
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequest.java
deleted file mode 100644
index 4b4b48dd05b..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.HttpRequest;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-final class BufferedRequest {
-
- private BufferedRequest() {
- // hide
- }
-
- public static ContentChannel executeRequest(AsyncHttpClient ningClient, Request request, HttpRequest.Method method,
- ResponseHandler handler, Metric metric, Metric.Context ctx)
- {
- return new BufferedRequestContent(ningClient, request, method,
- new AsyncResponseHandler(request, handler, metric, ctx));
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequestContent.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequestContent.java
deleted file mode 100644
index c09dcef98f4..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/BufferedRequestContent.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.RequestBuilder;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.CompletionHandler;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.core.HeaderFieldsUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- * @since 2.0
- */
-class BufferedRequestContent implements ContentChannel {
-
- private final AsyncHttpClient client;
- private final AsyncResponseHandler handler;
- private final Request request;
- private final HttpRequest.Method method;
- private final List<CompletionHandler> writeCompletions = new LinkedList<>();
- private final Object contentLock = new Object();
- private ByteArrayOutputStream content = new ByteArrayOutputStream();
-
- public BufferedRequestContent(AsyncHttpClient client, Request request, HttpRequest.Method method,
- AsyncResponseHandler handler) {
- this.client = client;
- this.request = request;
- this.method = method;
- this.handler = handler;
- }
-
- @Override
- public void write(ByteBuffer buf, CompletionHandler writeCompletion) {
- Objects.requireNonNull(buf, "buf");
- synchronized (contentLock) {
- if (content == null) {
- throw new IllegalStateException("ContentChannel closed.");
- }
- for (int i = 0, len = buf.remaining(); i < len; ++i) {
- content.write(buf.get());
- }
- if (writeCompletion != null) {
- writeCompletions.add(writeCompletion);
- }
- }
- }
-
- @Override
- public void close(CompletionHandler closeCompletion) {
- byte[] content;
- synchronized (contentLock) {
- content = this.content.toByteArray();
- this.content = null;
- }
- try {
- executeRequest(content);
- for (CompletionHandler writeCompletion : writeCompletions) {
- writeCompletion.completed();
- }
- if (closeCompletion != null) {
- closeCompletion.completed();
- }
- } catch (Exception e) {
- for (CompletionHandler writeCompletion : writeCompletions) {
- tryFail(writeCompletion, e);
- }
- if (closeCompletion != null) {
- tryFail(closeCompletion, e);
- }
- }
- }
-
- private void tryFail(CompletionHandler handler, Throwable t) {
- try {
- handler.failed(t);
- } catch (Exception e) {
- // ignore
- }
- }
-
- private void executeRequest(final byte[] body) throws IOException {
- RequestBuilder builder = RequestBuilderFactory.newInstance(request, method);
- HeaderFieldsUtil.copyTrailers(request, builder);
- if (body.length > 0) {
- builder.setContentLength(body.length);
- builder.setBody(body);
- }
- client.executeRequest(builder.build(), handler);
- }
-} \ No newline at end of file
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequest.java
deleted file mode 100644
index 6da40f3c443..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.RequestBuilder;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.HttpRequest;
-
-import java.io.IOException;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-final class ChunkedRequest {
-
- private ChunkedRequest() {
- // hide
- }
-
- public static ContentChannel executeRequest(AsyncHttpClient ningClient, Request request, HttpRequest.Method method,
- ResponseHandler handler, Metric metric, Metric.Context ctx)
- {
- RequestBuilder builder = RequestBuilderFactory.newInstance(request, method);
- ChunkedRequestContent content = new ChunkedRequestContent(request);
- builder.setBody(content);
- try {
- ningClient.executeRequest(builder.build(), new AsyncResponseHandler(request, handler, metric, ctx));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return content;
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestBody.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestBody.java
deleted file mode 100644
index 9142910a91d..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestBody.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.Body;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-class ChunkedRequestBody implements Body {
-
- private final ChunkedRequestContent content;
- private ByteBuffer currentBuf;
-
- public ChunkedRequestBody(ChunkedRequestContent content) {
- this.content = content;
- }
-
- @Override
- public long getContentLength() {
- return -1; // unknown
- }
-
- @Override
- public long read(ByteBuffer dst) throws IOException {
- if (content.isEndOfInput()) {
- return -1;
- }
- if (currentBuf == null || currentBuf.remaining() == 0) {
- currentBuf = content.nextChunk();
- }
- if (currentBuf == null) {
- return 0;
- }
- int len = Math.min(currentBuf.remaining(), dst.remaining());
- for (int i = 0; i < len; ++i) {
- dst.put(currentBuf.get());
- }
- return len;
- }
-
- @Override
- public void close() throws IOException {
-
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestContent.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestContent.java
deleted file mode 100644
index 265315d3eb8..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ChunkedRequestContent.java
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.Body;
-import com.ning.http.client.BodyGenerator;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.CompletionHandler;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.http.core.HeaderFieldsUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.LinkedList;
-import java.util.Objects;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-class ChunkedRequestContent implements BodyGenerator, ContentChannel {
-
- private static final byte[] LAST_CHUNK = "0\r\n".getBytes(StandardCharsets.UTF_8);
- private static final byte[] CRLF_BYTES = "\r\n".getBytes(StandardCharsets.UTF_8);
- private final AtomicReference<ChunkedRequestBody> body = new AtomicReference<>(new ChunkedRequestBody(this));
- private final AtomicBoolean writerClosed = new AtomicBoolean(false);
- private final Queue<Entry> writeQueue = new ConcurrentLinkedQueue<>();
- private final Queue<ByteBuffer> readQueue = new LinkedList<>();
- private final Request request;
- private boolean readerClosed = false;
-
- public ChunkedRequestContent(Request request) {
- this.request = request;
- }
-
- @Override
- public Body createBody() throws IOException {
- // this is called by Netty, and presumably has to be thread-safe since Netty assigns thread by connection --
- // retries are necessarily done using new connections
- Body body = this.body.getAndSet(null);
- if (body == null) {
- throw new UnsupportedOperationException("ChunkedRequestContent does not support retries.");
- }
- return body;
- }
-
- @Override
- public void write(ByteBuffer buf, CompletionHandler handler) {
- // this can be called by any JDisc thread, and needs to be thread-safe
- Objects.requireNonNull(buf, "buf");
- if (writerClosed.get()) {
- throw new IllegalStateException("ChunkedRequestContent is closed.");
- }
- writeQueue.add(new Entry(buf, handler));
- }
-
- @Override
- public void close(CompletionHandler handler) {
- // this can be called by any JDisc thread, and needs to be thread-safe
- if (writerClosed.getAndSet(true)) {
- throw new IllegalStateException("ChunkedRequestContent already closed.");
- }
- writeQueue.add(new Entry(null, handler));
- }
-
- public ByteBuffer nextChunk() {
- // this method is only called by the ChunkedRequestBody, which in turns is only called by the thread assigned to
- // the underlying Netty connection -- it does not need to be thread-safe
- if (!readQueue.isEmpty()) {
- ByteBuffer buf = readQueue.poll();
- if (buf == null) {
- readerClosed = true;
- }
- return buf;
- }
- if (writeQueue.isEmpty()) {
- return null;
- }
- Entry entry = writeQueue.poll();
- try {
- entry.handler.completed();
- } catch (Exception e) {
- // TODO: fail and close write queue
- // TODO: rethrow e to make ning abort request
- }
- if (entry.buf != null) {
- readQueue.add(ByteBuffer.wrap(Integer.toHexString(entry.buf.remaining()).getBytes(StandardCharsets.UTF_8)));
- readQueue.add(ByteBuffer.wrap(CRLF_BYTES));
- readQueue.add(entry.buf);
- readQueue.add(ByteBuffer.wrap(CRLF_BYTES));
- } else {
- readQueue.add(ByteBuffer.wrap(LAST_CHUNK));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- HeaderFieldsUtil.copyTrailers(request, out);
- byte[] buf = out.toByteArray();
- if (buf.length > 0) {
- readQueue.add(ByteBuffer.wrap(buf));
- }
- readQueue.add(ByteBuffer.wrap(CRLF_BYTES));
- readQueue.add(null);
- }
- return readQueue.poll();
- }
-
- public boolean isEndOfInput() {
- // only called by the assigned Netty thread, does not need to be thread-safe
- return readerClosed;
- }
-
- private static class Entry {
-
- final ByteBuffer buf;
- final CompletionHandler handler;
-
- Entry(ByteBuffer buf, CompletionHandler handler) {
- this.buf = buf;
- this.handler = handler;
- }
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequest.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequest.java
deleted file mode 100644
index 30a3809e30a..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.HttpRequest;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-final class EmptyRequest {
-
- private EmptyRequest() {
- // hide
- }
-
- public static ContentChannel executeRequest(AsyncHttpClient ningClient, Request request, HttpRequest.Method method,
- ResponseHandler handler, Metric metric, Metric.Context ctx) {
- return new EmptyRequestContent(ningClient, request, method,
- new AsyncResponseHandler(request, handler, metric, ctx));
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequestContent.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequestContent.java
deleted file mode 100644
index fc29bc9da6e..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyRequestContent.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.RequestBuilder;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.CompletionHandler;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.core.HeaderFieldsUtil;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-class EmptyRequestContent implements ContentChannel {
-
- private final AtomicBoolean closed = new AtomicBoolean(false);
- private final AsyncHttpClient client;
- private final AsyncResponseHandler handler;
- private final Request request;
- private final HttpRequest.Method method;
-
- public EmptyRequestContent(AsyncHttpClient client, Request request, HttpRequest.Method method,
- AsyncResponseHandler handler) {
- this.client = client;
- this.request = request;
- this.method = method;
- this.handler = handler;
- }
-
- @Override
- public void write(ByteBuffer buf, CompletionHandler handler) {
- throw new UnsupportedOperationException("Request does not support a message-body.");
- }
-
- @Override
- public void close(CompletionHandler handler) {
- if (closed.getAndSet(true)) {
- if (handler != null) {
- handler.completed();
- }
- return;
- }
- try {
- executeRequest();
- handler.completed();
- } catch (Exception e) {
- try {
- handler.failed(e);
- } catch (Exception f) {
- // ignore
- }
- }
- }
-
- private void executeRequest() throws IOException {
- RequestBuilder builder = RequestBuilderFactory.newInstance(request, method);
- HeaderFieldsUtil.copyTrailers(request, builder);
- client.executeRequest(builder.build(), handler);
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyResponse.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyResponse.java
deleted file mode 100644
index 48ac46f199c..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/EmptyResponse.java
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.cookie.Cookie;
-import com.ning.http.client.FluentCaseInsensitiveStringsMap;
-import com.ning.http.client.Response;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- * @since 2.0
- */
-final class EmptyResponse implements Response {
-
- public static final EmptyResponse INSTANCE = new EmptyResponse();
-
- private EmptyResponse() {
- // hide
- }
-
- @Override
- public int getStatusCode() {
- return 0;
- }
-
- @Override
- public String getStatusText() {
- return null;
- }
-
- @Override
- public ByteBuffer getResponseBodyAsByteBuffer() {
- return ByteBuffer.allocate(0);
- }
-
- @Override
- public byte[] getResponseBodyAsBytes() throws IOException {
- return new byte[0];
- }
-
- @Override
- public InputStream getResponseBodyAsStream() throws IOException {
- return null;
- }
-
- @Override
- public String getResponseBodyExcerpt(int maxLength, String charset) throws IOException {
- return null;
- }
-
- @Override
- public String getResponseBody(String charset) throws IOException {
- return null;
- }
-
- @Override
- public String getResponseBodyExcerpt(int maxLength) throws IOException {
- return null;
- }
-
- @Override
- public String getResponseBody() throws IOException {
- return null;
- }
-
- @Override
- public URI getUri() throws MalformedURLException {
- return null;
- }
-
- @Override
- public String getContentType() {
- return null;
- }
-
- @Override
- public String getHeader(String name) {
- return null;
- }
-
- @Override
- public List<String> getHeaders(String name) {
- return null;
- }
-
- @Override
- public FluentCaseInsensitiveStringsMap getHeaders() {
- return null;
- }
-
- @Override
- public boolean isRedirected() {
- return false;
- }
-
- @Override
- public List<Cookie> getCookies() {
- return null;
- }
-
- @Override
- public boolean hasResponseStatus() {
- return false;
- }
-
- @Override
- public boolean hasResponseHeaders() {
- return false;
- }
-
- @Override
- public boolean hasResponseBody() {
- return false;
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/HttpClient.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/HttpClient.java
deleted file mode 100644
index 5480e8fca87..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/HttpClient.java
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.google.inject.Inject;
-import com.ning.http.client.AsyncHandler;
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.AsyncHttpClientConfig;
-import com.ning.http.client.filter.FilterContext;
-import com.ning.http.client.filter.FilterException;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.http.HttpHeaders;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.SecretStore;
-import com.yahoo.jdisc.http.client.filter.ResponseFilter;
-import com.yahoo.jdisc.http.client.filter.core.ResponseFilterBridge;
-import com.yahoo.jdisc.http.ssl.JKSKeyStore;
-import com.yahoo.jdisc.http.ssl.SslContextFactory;
-import com.yahoo.jdisc.http.ssl.SslKeyStore;
-import com.yahoo.jdisc.service.AbstractClientProvider;
-import com.yahoo.vespa.defaults.Defaults;
-
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import java.net.URI;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-public class HttpClient extends AbstractClientProvider {
-
- public interface Metrics {
-
- String NUM_REQUESTS = "clientRequests";
- String NUM_RESPONSES = "clientResponses";
- String REQUEST_LATENCY = "clientRequestLatency";
- String CONNECTION_EXCEPTIONS = "clientConnectExceptions";
- String TIMEOUT_EXCEPTIONS = "clientTimeoutExceptions";
- String OTHER_EXCEPTIONS = "clientOtherExceptions";
- String NUM_BYTES_RECEIVED = "ClientBytesReceived";
- String NUM_BYTES_SENT = "ClientBytesSent";
- String TOTAL_LATENCY = "ClientTotalResponseLatency";
- String TRANSFER_LATENCY = "ClientDataTransferLatency";
- }
-
- private static final String HTTP = "http";
- private static final String HTTPS = "https";
-
- private final ConcurrentMap<String, Metric.Context> metricCtx = new ConcurrentHashMap<>();
- private final Object metricCtxLock = new Object();
- private final AsyncHttpClient ningClient;
- private final Metric metric;
- private final boolean chunkedEncodingEnabled;
-
- protected HttpClient(HttpClientConfig config, ThreadFactory threadFactory, Metric metric,
- HostnameVerifier hostnameVerifier, SSLContext sslContext,
- List<ResponseFilter> responseFilters) {
- this.ningClient = newNingClient(config, threadFactory, hostnameVerifier, sslContext, responseFilters);
- this.metric = metric;
- this.chunkedEncodingEnabled = config.chunkedEncodingEnabled();
- }
-
- /** Create a client which cannot look up secrets for use in requests */
- public HttpClient(HttpClientConfig config, ThreadFactory threadFactory, Metric metric,
- HostnameVerifier hostnameVerifier, List<ResponseFilter> responseFilters) {
- this(config, threadFactory, metric, hostnameVerifier, resolveSslContext(config.ssl(), new ThrowingSecretStore()), responseFilters);
- }
-
- @Inject
- public HttpClient(HttpClientConfig config, ThreadFactory threadFactory, Metric metric,
- HostnameVerifier hostnameVerifier, List<ResponseFilter> responseFilters, SecretStore secretStore) {
- this(config, threadFactory, metric, hostnameVerifier, resolveSslContext(config.ssl(), secretStore), responseFilters);
- }
-
- @Override
- public ContentChannel handleRequest(Request request, ResponseHandler handler) {
- Metric.Context ctx = newMetricContext(request.getUri());
- String uriScheme = request.getUri().getScheme();
-
- switch (uriScheme) {
- case HTTP:
- case HTTPS:
- HttpRequest.Method method = resolveMethod(request);
- metric.add(Metrics.NUM_BYTES_SENT, request.headers().size(), ctx);
-
- if (!hasMessageBody(method)) {
- return EmptyRequest.executeRequest(ningClient, request, method, handler, metric, ctx);
- }
- if (isChunkedEncodingEnabled(request, method)) {
- return ChunkedRequest.executeRequest(ningClient, request, method, handler, metric, ctx);
- }
- return BufferedRequest.executeRequest(ningClient, request, method, handler, metric, ctx);
- default:
- throw new UnsupportedOperationException("Unknown protocol: " + uriScheme);
- }
- }
-
- @Override
- protected void destroy() {
- ningClient.close();
- }
-
- private HttpRequest.Method resolveMethod(Request request) {
- if (request instanceof HttpRequest) {
- return ((HttpRequest)request).getMethod();
- }
- return HttpRequest.Method.POST;
- }
-
- private boolean hasMessageBody(HttpRequest.Method method) {
- return method != HttpRequest.Method.TRACE;
- }
-
- private boolean isChunkedEncodingEnabled(Request request, HttpRequest.Method method) {
- if (!chunkedEncodingEnabled) {
- return false;
- }
- if (method == HttpRequest.Method.GET || method == HttpRequest.Method.HEAD) {
- return false;
- }
- if (request.headers().isTrue(HttpHeaders.Names.X_DISABLE_CHUNKING)) {
- return false;
- }
- if (request.headers().containsKey(HttpHeaders.Names.CONTENT_LENGTH)) {
- return false;
- }
- if (request instanceof HttpRequest && ((HttpRequest)request).getVersion() == HttpRequest.Version.HTTP_1_0) {
- return false;
- }
- return true;
- }
-
- private Metric.Context newMetricContext(URI uri) {
- String key = uri.getScheme() + "://" + uri.getHost() + (uri.getPort() != -1 ? ":" + uri.getPort() : "");
- Metric.Context ctx = metricCtx.get(key);
- if (ctx == null) {
- synchronized (metricCtxLock) {
- ctx = metricCtx.get(key);
- if (ctx == null) {
- Map<String, Object> props = new HashMap<>();
- props.put("requestUri", key);
-
- ctx = metric.createContext(props);
- if (ctx == null) {
- ctx = NullContext.INSTANCE;
- }
- metricCtx.put(key, ctx);
- }
- }
- }
- if (ctx == NullContext.INSTANCE) {
- return null;
- }
- return ctx;
- }
-
- private static SSLContext resolveSslContext(HttpClientConfig.Ssl config, SecretStore secretStore) {
- if (!config.enabled()) {
- return null;
- }
- SslKeyStore keyStore = new JKSKeyStore(Paths.get(Defaults.getDefaults().underVespaHome(config.keyStorePath())));
- SslKeyStore trustStore = new JKSKeyStore(Paths.get(Defaults.getDefaults().underVespaHome(config.trustStorePath())));
-
- String password = secretStore.getSecret(config.keyDBKey());
- keyStore.setKeyStorePassword(password);
- trustStore.setKeyStorePassword(password);
- SslContextFactory sslContextFactory = SslContextFactory.newInstance(
- config.algorithm(),
- config.protocol(),
- keyStore,
- trustStore);
- return sslContextFactory.getServerSSLContext();
- }
-
-
- @SuppressWarnings("deprecation")
- private static AsyncHttpClient newNingClient(HttpClientConfig config, ThreadFactory threadFactory,
- HostnameVerifier hostnameVerifier, SSLContext sslContext,
- List<ResponseFilter> responseFilters) {
- AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
- builder.setAllowPoolingConnection(config.connectionPoolEnabled());
- builder.setAllowSslConnectionPool(config.sslConnectionPoolEnabled());
- builder.setCompressionEnabled(config.compressionEnabled());
- builder.setConnectionTimeoutInMs((int)(config.connectionTimeout() * 1000));
- builder.setExecutorService(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2,
- threadFactory));
- builder.setFollowRedirects(config.followRedirects());
- builder.setHostnameVerifier(hostnameVerifier);
- builder.setIOThreadMultiplier(2);
- builder.setIdleConnectionInPoolTimeoutInMs((int)(config.idleConnectionInPoolTimeout() * 1000));
- builder.setIdleConnectionTimeoutInMs((int)(config.idleConnectionTimeout() * 1000));
- builder.setMaxRequestRetry(config.chunkedEncodingEnabled() ? 0 : config.maxNumRetries());
- builder.setMaximumConnectionsPerHost(config.maxNumConnectionsPerHost());
- builder.setMaximumConnectionsTotal(config.maxNumConnections());
- builder.setMaximumNumberOfRedirects(config.maxNumRedirects());
- if (!config.proxyServer().isEmpty()) {
- builder.setProxyServer(ProxyServerFactory.newInstance(URI.create(config.proxyServer())));
- }
- builder.setRemoveQueryParamsOnRedirect(config.removeQueryParamsOnRedirect());
- builder.setRequestCompressionLevel(config.compressionLevel());
- builder.setRequestTimeoutInMs((int)(config.requestTimeout() * 1000));
- builder.setSSLContext(sslContext);
- builder.setUseProxyProperties(config.useProxyProperties());
- builder.setUseRawUrl(config.useRawUri());
- builder.setUserAgent(config.userAgent());
- builder.setWebSocketIdleTimeoutInMs((int)(config.idleWebSocketTimeout() * 1000));
-
- for (final ResponseFilter responseFilter : responseFilters) {
- builder.addResponseFilter(new com.ning.http.client.filter.ResponseFilter() {
- @Override
- @SuppressWarnings("rawtypes")
- public FilterContext filter(FilterContext filterContext) throws FilterException {
- /*
- * TODO: returned ResponseFilterContext is ignored right now.
- * For now, we return the input filterContext until there is a need for custom filterContext
- * (which will complicate the code quite a bit since we are abstracting the Ning client)
- */
- Request request = null;
- AsyncHandler<?> handler = filterContext.getAsyncHandler();
- if (handler instanceof AsyncResponseHandler) {
- request = ((AsyncResponseHandler)handler).getRequest();
- }
- try {
- // We do not retain the request here since this is executed before the response handler
- responseFilter.filter(ResponseFilterBridge.toResponseFilterContext(filterContext, request));
- } catch (com.yahoo.jdisc.http.client.filter.FilterException e) {
- throw new FilterException(e.getMessage());
- }
- return filterContext;
- }
- }
- );
- }
- return new AsyncHttpClient(builder.build());
- }
-
- private static class NullContext implements Metric.Context {
-
- static final NullContext INSTANCE = new NullContext();
- }
-
- private static final class ThrowingSecretStore implements SecretStore {
-
- @Override
- public String getSecret(String key) {
- throw new UnsupportedOperationException("A secret store is not available");
- }
-
- }
-
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ProxyServerFactory.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ProxyServerFactory.java
deleted file mode 100644
index 37c7ce2ac67..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/ProxyServerFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.ProxyServer;
-
-import java.net.URI;
-import java.util.Locale;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- * @since 2.0
- */
-final class ProxyServerFactory {
-
- private ProxyServerFactory() {
- // hide
- }
-
- public static ProxyServer newInstance(URI uri) {
- if (uri == null) {
- return null;
- }
- String userInfo = uri.getUserInfo();
- String username = null, password = null;
- if (userInfo != null) {
- String[] arr = userInfo.split(":", 2);
- username = arr[0];
- password = arr.length > 1 ? arr[1] : null;
- }
- return new ProxyServer(ProxyServer.Protocol.valueOf(uri.getScheme().toUpperCase(Locale.US)),
- uri.getHost(), uri.getPort(), username, password);
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/RequestBuilderFactory.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/RequestBuilderFactory.java
deleted file mode 100644
index b304ba8a1b2..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/RequestBuilderFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.RequestBuilder;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.core.HeaderFieldsUtil;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-final class RequestBuilderFactory {
-
- private RequestBuilderFactory() {
- // hide
- }
-
- public static RequestBuilder newInstance(Request request, HttpRequest.Method method) {
- RequestBuilder builder = new RequestBuilder();
- if (request instanceof HttpRequest) {
- HttpRequest httpRequest = (HttpRequest)request;
- builder.setProxyServer(ProxyServerFactory.newInstance(httpRequest.getProxyServer()));
-
- Long timeout = httpRequest.getConnectionTimeout(TimeUnit.MILLISECONDS);
- if (timeout != null) {
- // TODO: Uncomment the next line once ticket 5536510 has been resolved.
- // builder.setConnectTimeout(timeout);
- }
- }
- builder.setMethod(method.name());
- builder.setUrl(request.getUri().toString());
- HeaderFieldsUtil.copyHeaders(request, builder);
- return builder;
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/FilterException.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/FilterException.java
deleted file mode 100644
index b9cb5c3fac3..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/FilterException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client.filter;
-
-/**
- * @author <a href="mailto:alain@yahoo-inc.com">Alain Wan Buen Cheong</a>
- */
-public class FilterException extends Exception {
-
- public FilterException(String msg) {
- super(msg);
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilter.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilter.java
deleted file mode 100644
index 5fffc8312d7..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilter.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client.filter;
-
-/**
- * This interface can be implemented to define custom behavior that gets invoked before the response bytes are processed.
- * Authorization, proxy authentication and redirects processing all happen after the filters get executed.
- *
- * @author <a href="mailto:alain@yahoo-inc.com">Alain Wan Buen Cheong</a>
- */
-public interface ResponseFilter {
-
- public ResponseFilterContext filter(ResponseFilterContext filterContext) throws FilterException;
-
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilterContext.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilterContext.java
deleted file mode 100644
index 4f956220398..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/ResponseFilterContext.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client.filter;
-
-import com.google.common.collect.ImmutableMap;
-import com.ning.http.client.FluentCaseInsensitiveStringsMap;
-
-import java.net.URI;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author <a href="mailto:alain@yahoo-inc.com">Alain Wan Buen Cheong</a>
- */
-public class ResponseFilterContext {
-
- private final FluentCaseInsensitiveStringsMap headers = new FluentCaseInsensitiveStringsMap();
- private final Map<String, Object> requestContext;
- private int statusCode;
- private URI uri;
-
- private ResponseFilterContext(Builder builder) {
- this.statusCode = builder.statusCode;
- this.uri = builder.uri;
- this.headers.putAll(builder.headers);
- requestContext = ImmutableMap.copyOf(builder.requestContext);
- }
-
- public URI getRequestURI() {
- return uri;
- }
-
- public Map<String, Object> getRequestContext() { return requestContext; }
-
- public String getResponseFirstHeader(String key) {
- return headers.getFirstValue(key);
- }
-
- public int getResponseStatusCode() {
- return statusCode;
- }
-
- public static class Builder {
-
- private final FluentCaseInsensitiveStringsMap headers = new FluentCaseInsensitiveStringsMap();
- private final Map<String, Object> requestContext = new HashMap<>();
- private int statusCode;
- private URI uri;
-
- public Builder() {
- }
-
- public Builder statusCode(int statusCode) {
- this.statusCode = statusCode;
- return this;
- }
-
- public Builder headers(FluentCaseInsensitiveStringsMap headers) {
- this.headers.putAll(headers);
- return this;
- }
-
- public Builder uri(URI uri) {
- this.uri = uri;
- return this;
- }
-
- public Builder requestContext(Map<String, Object> requestContext) {
- this.requestContext.putAll(requestContext);
- return this;
- }
-
- public ResponseFilterContext build() {
- return new ResponseFilterContext(this);
- }
-
- }
-
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridge.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridge.java
deleted file mode 100644
index 6d895ad0f93..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridge.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client.filter.core;
-
-import com.ning.http.client.filter.FilterContext;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.http.client.filter.ResponseFilterContext;
-
-import java.util.Collections;
-
-/**
- * @author <a href="mailto:alain@yahoo-inc.com">Alain Wan Buen Cheong</a>
- */
-public class ResponseFilterBridge {
-
- public static ResponseFilterContext toResponseFilterContext(FilterContext<?> filterContext, Request request) {
- return new ResponseFilterContext.Builder()
- .uri(filterContext.getRequest().getURI())
- .statusCode(filterContext.getResponseStatus().getStatusCode())
- .headers(filterContext.getResponseHeaders().getHeaders())
- .requestContext(request == null ? Collections.<String, Object>emptyMap() : request.context())
- .build();
- }
-
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/package-info.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/package-info.java
deleted file mode 100644
index 4ce70c28623..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/filter/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-@ExportPackage
-package com.yahoo.jdisc.http.client.filter;
-import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/package-info.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/package-info.java
deleted file mode 100644
index 5d5ec2c1ab8..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/client/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-@ExportPackage
-package com.yahoo.jdisc.http.client;
-import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/core/HeaderFieldsUtil.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/core/HeaderFieldsUtil.java
deleted file mode 100644
index 065276962f7..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/core/HeaderFieldsUtil.java
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.core;
-
-import com.ning.http.client.RequestBuilder;
-import com.yahoo.jdisc.HeaderFields;
-import org.jboss.netty.handler.codec.http.HttpChunkTrailer;
-import org.jboss.netty.handler.codec.http.HttpHeaders;
-import org.jboss.netty.handler.codec.http.HttpMessage;
-import org.jboss.netty.handler.codec.http.HttpResponse;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-public class HeaderFieldsUtil {
-
- private static final byte[] DELIM_BYTES = ": ".getBytes(StandardCharsets.UTF_8);
- private static final byte[] CRLF_BYTES = "\r\n".getBytes(StandardCharsets.UTF_8);
- private static final Set<String> IGNORED_HEADERS = new HashSet<>(Arrays.asList(
- HttpHeaders.Names.CONTENT_LENGTH,
- HttpHeaders.Names.TRANSFER_ENCODING));
-
- public static void copyHeaders(com.yahoo.jdisc.Response src, HttpResponse dst) {
- copyHeaderFields(src.headers(), newSimpleHeaders(dst));
- }
-
- public static void copyHeaders(com.yahoo.jdisc.Request src, RequestBuilder dst) {
- copyHeaderFields(src.headers(), newSimpleHeaders(dst));
- }
-
- public static void copyTrailers(com.yahoo.jdisc.Response src, HttpResponse dst) {
- copyTrailers(src, newSimpleHeaders(dst));
- }
-
- public static void copyTrailers(com.yahoo.jdisc.Response src, HttpChunkTrailer dst) {
- copyTrailers(src, newSimpleHeaders(dst));
- }
-
- public static void copyTrailers(com.yahoo.jdisc.Request src, RequestBuilder dst) {
- copyTrailers(src, newSimpleHeaders(dst));
- }
-
- public static void copyTrailers(com.yahoo.jdisc.Request src, ByteArrayOutputStream dst) {
- copyTrailers(src, newSimpleHeaders(dst));
- }
-
- @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
- public static void copyTrailers(com.yahoo.jdisc.Request src, SimpleHeaders dst) {
- if (!(src instanceof com.yahoo.jdisc.http.HttpRequest)) {
- return;
- }
- final HeaderFields trailers = ((com.yahoo.jdisc.http.HttpRequest)src).trailers();
- synchronized (trailers) {
- copyHeaderFields(trailers, dst);
- }
- }
-
- @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
- public static void copyTrailers(com.yahoo.jdisc.Response src, SimpleHeaders dst) {
- if (!(src instanceof com.yahoo.jdisc.http.HttpResponse)) {
- return;
- }
- final HeaderFields trailers = ((com.yahoo.jdisc.http.HttpResponse)src).trailers();
- synchronized (trailers) {
- copyHeaderFields(trailers, dst);
- }
- }
-
- private static void copyHeaderFields(HeaderFields src, SimpleHeaders dst) {
- for (Map.Entry<String, List<String>> entry : src.entrySet()) {
- String key = entry.getKey();
- if (key != null && !IGNORED_HEADERS.contains(key)) {
- if (entry.getValue() == null) {
- dst.addHeader(key, "");
- continue;
- }
- for (String value : entry.getValue()) {
- dst.addHeader(key, value != null ? value : "");
- }
- }
- }
- }
-
- private static SimpleHeaders newSimpleHeaders(final RequestBuilder dst) {
- return new SimpleHeaders() {
-
- @Override
- public void addHeader(String name, String value) {
- dst.addHeader(name, value);
- }
- };
- }
-
- private static SimpleHeaders newSimpleHeaders(final ByteArrayOutputStream dst) {
- return new SimpleHeaders() {
-
- @Override
- public void addHeader(String name, String value) {
- safeWrite(name.getBytes(StandardCharsets.UTF_8));
- safeWrite(DELIM_BYTES);
- safeWrite(value.getBytes(StandardCharsets.UTF_8));
- safeWrite(CRLF_BYTES);
- }
-
- void safeWrite(byte[] buf) {
- dst.write(buf, 0, buf.length);
- }
- };
- }
-
- private static SimpleHeaders newSimpleHeaders(final HttpMessage dst) {
- return new SimpleHeaders() {
-
- @Override
- public void addHeader(String name, String value) {
- dst.addHeader(name, value);
- }
- };
- }
-
- private static SimpleHeaders newSimpleHeaders(final HttpChunkTrailer dst) {
- return new SimpleHeaders() {
-
- @Override
- public void addHeader(String name, String value) {
- dst.addHeader(name, value);
- }
- };
- }
-
- private static interface SimpleHeaders {
-
- public void addHeader(String name, String value);
- }
-}
diff --git a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/test/ClientTestDriver.java b/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/test/ClientTestDriver.java
deleted file mode 100644
index 1a5553fb608..00000000000
--- a/jdisc_http_service/src/main/java/com/yahoo/jdisc/http/test/ClientTestDriver.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.test;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-import com.ning.http.util.AllowAllHostnameVerifier;
-import com.yahoo.jdisc.application.ContainerBuilder;
-import com.yahoo.jdisc.http.client.HttpClient;
-import com.yahoo.jdisc.http.client.HttpClientConfig;
-import com.yahoo.jdisc.http.client.filter.ResponseFilter;
-import com.yahoo.jdisc.service.CurrentContainer;
-import com.yahoo.jdisc.test.TestDriver;
-
-import javax.net.ssl.HostnameVerifier;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
- */
-public class ClientTestDriver {
-
- private final TestDriver driver;
- private final HttpClient client;
- private final RemoteServer server;
-
- private ClientTestDriver(TestDriver driver, HttpClient client) throws IOException {
- this.driver = driver;
- this.client = client;
- this.server = RemoteServer.newInstance();
- }
-
- public CurrentContainer currentContainer() {
- return driver;
- }
-
- public boolean close() {
- if (!server.close(60, TimeUnit.SECONDS)) {
- return false;
- }
- client.release();
- return driver.close();
- }
-
- public HttpClient client() {
- return client;
- }
-
- public RemoteServer server() {
- return server;
- }
-
- public static ClientTestDriver newInstance(Module... guiceModules) throws IOException {
- return newInstance(new HttpClientConfig.Builder().sslConnectionPoolEnabled(false),
- guiceModules);
- }
-
- public static ClientTestDriver newInstance(HttpClientConfig.Builder config, Module... guiceModules)
- throws IOException {
- Module[] lst = new Module[guiceModules.length + 2];
- lst[0] = newDefaultModule();
- lst[lst.length - 1] = newConfigModule(config);
- System.arraycopy(guiceModules, 0, lst, 1, guiceModules.length);
- return newInstanceImpl(HttpClient.class, lst);
- }
-
- private static ClientTestDriver newInstanceImpl(Class<? extends HttpClient> clientClass,
- Module... guiceModules) throws IOException {
- TestDriver driver = TestDriver.newSimpleApplicationInstanceWithoutOsgi(guiceModules);
- ContainerBuilder builder = driver.newContainerBuilder();
- HttpClient client = builder.guiceModules().getInstance(clientClass);
- builder.serverBindings().bind("*://*/*", client);
- driver.activateContainer(builder);
- try {
- client.start();
- } catch (RuntimeException e) {
- client.release();
- driver.close();
- throw e;
- }
- return new ClientTestDriver(driver, client);
- }
-
- public static Module newDefaultModule() {
- return new AbstractModule() {
-
- @Override
- protected void configure() {
- bind(HostnameVerifier.class).to(AllowAllHostnameVerifier.class);
- bind(new TypeLiteral<List<ResponseFilter>>() { }).toInstance(Collections.<ResponseFilter>emptyList());
- }
- };
- }
-
- public static Module newConfigModule(final HttpClientConfig.Builder config) {
- return new AbstractModule() {
-
- @Override
- protected void configure() {
- bind(HttpClientConfig.class).toInstance(new HttpClientConfig(config));
- }
- };
- }
-
- public static Module newFilterModule(final ResponseFilter... filters) {
- return new AbstractModule() {
-
- @Override
- protected void configure() {
- bind(new TypeLiteral<List<ResponseFilter>>() { }).toInstance(Arrays.asList(filters));
- }
- };
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AbstractClientTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AbstractClientTestCase.java
deleted file mode 100644
index 1d5ab557cd1..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AbstractClientTestCase.java
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.yahoo.jdisc.HeaderFields;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.handler.BufferedContentChannel;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.RequestDispatch;
-import com.yahoo.jdisc.http.HttpResponse;
-import com.yahoo.jdisc.http.test.RemoteServer;
-import com.yahoo.jdisc.service.CurrentContainer;
-
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import static com.yahoo.jdisc.http.AssertHttp.assertChunk;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertNotNull;
-import static org.testng.AssertJUnit.assertTrue;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-abstract class AbstractClientTestCase {
-
- protected static void assertRequest(CurrentContainer container, RemoteServer server, String requestUri,
- HeaderFields requestHeaders, Iterable<ByteBuffer> requestContent,
- Iterable<String> expectedRequestChunks, Iterable<String> responseChunks,
- int expectedStatus, String expectedMessage,
- HeaderFields expectedResponseHeaders,
- Iterable<ByteBuffer> expectedResponseContent,
- Map<String,Object> context) throws Exception {
- MyRequestDispatch dispatch = new MyRequestDispatch(container, server.newRequestUri(requestUri),
- requestHeaders, requestContent, context);
- dispatch.dispatch();
- assertRequest(server, expectedRequestChunks, responseChunks, dispatch);
- assertResponse(dispatch.get(60, TimeUnit.SECONDS), expectedStatus, expectedMessage,
- expectedResponseHeaders);
- assertContent(expectedResponseContent, dispatch.responseContent.toReadable());
- }
-
- protected static void assertRequest(CurrentContainer container, RemoteServer server, String requestUri,
- HeaderFields requestHeaders, Iterable<ByteBuffer> requestContent,
- Iterable<String> expectedRequestChunks, Iterable<String> responseChunks,
- int expectedStatus, String expectedMessage,
- HeaderFields expectedResponseHeaders,
- Iterable<ByteBuffer> expectedResponseContent) throws Exception {
-
- assertRequest(container, server, requestUri, requestHeaders, requestContent, expectedRequestChunks,
- responseChunks, expectedStatus, expectedMessage, expectedResponseHeaders, expectedResponseContent,
- Collections.<String, Object>emptyMap());
- }
-
- protected static void assertRequest(RemoteServer server, Iterable<String> expectedRequestChunks,
- Iterable<String> responseChunks, Future<Response> futureResponse)
- throws Exception {
- RemoteServer.Connection cnt = awaitConnection(server, futureResponse);
- assertNotNull(cnt);
- for (String expected : expectedRequestChunks) {
- assertChunk(expected, cnt.readChunk());
- }
- for (String chunk : responseChunks) {
- cnt.writeChunk(chunk);
- }
- cnt.close();
- }
-
- protected static RemoteServer.Connection awaitConnection(RemoteServer server, Future<Response> futureResponse)
- throws Exception {
- RemoteServer.Connection cnt = null;
- for (int i = 0; i < 6000; ++i) {
- cnt = server.awaitConnection(10, TimeUnit.MILLISECONDS);
- if (cnt != null) {
- break;
- }
- if (futureResponse.isDone()) {
- HttpResponse response = (HttpResponse)futureResponse.get();
- System.err.println("Unexpected " + response.getStatus() + " response: " + response.getMessage());
- Throwable t = response.getError();
- if (t instanceof Exception) {
- throw (Exception)t;
- } else if (t instanceof Error) {
- throw (Error)t;
- } else {
- throw new RuntimeException(t);
- }
- }
- }
- return cnt;
- }
-
- protected static void assertResponse(Response response, int expectedStatus, String expectedMessage,
- HeaderFields expectedHeaders) {
- assertTrue(response instanceof HttpResponse);
- HttpResponse httpResponse = (HttpResponse)response;
- assertEquals(expectedStatus, httpResponse.getStatus());
- assertEquals(expectedMessage, httpResponse.getMessage());
-
- HeaderFields headers = response.headers();
- for (Map.Entry<String, String> entry : expectedHeaders.entries()) {
- assertTrue(headers.contains(entry.getKey(), entry.getValue()));
- }
- }
-
- protected static void assertContent(Iterable<ByteBuffer> expected, Iterable<ByteBuffer> actual) {
- Iterator<ByteBuffer> expectedIt = expected.iterator();
- Iterator<ByteBuffer> actualIt = actual.iterator();
- while (expectedIt.hasNext()) {
- assertTrue(actualIt.hasNext());
- assertEquals(expectedIt.next(), actualIt.next());
- }
- assertFalse(actualIt.hasNext());
- }
-
- protected static String requestUri(String uri) {
- return uri;
- }
-
- protected static HeaderFields requestHeaders(HeaderEntry... entries) {
- return asHeaders(entries);
- }
-
- protected static Iterable<ByteBuffer> requestContent(String... chunks) {
- return asContent(chunks);
- }
-
- protected static Iterable<String> expectedRequestChunks(String... chunks) {
- return Arrays.asList(chunks);
- }
-
- protected static Iterable<String> responseChunks(String... chunks) {
- return Arrays.asList(chunks);
- }
-
- protected static int expectedResponseStatus(int status) {
- return status;
- }
-
- protected static String expectedResponseMessage(String message) {
- return message;
- }
-
- protected static HeaderFields expectedResponseHeaders(HeaderEntry... entries) {
- return asHeaders(entries);
- }
-
- protected static Iterable<ByteBuffer> expectedResponseContent(String... chunks) {
- return asContent(chunks);
- }
-
- protected static HeaderEntry newHeader(String key, String val) {
- return new HeaderEntry(key, val);
- }
-
- protected static HeaderFields asHeaders(HeaderEntry... entries) {
- HeaderFields ret = new HeaderFields();
- for (HeaderEntry entry : entries) {
- ret.add(entry.key, entry.val);
- }
- return ret;
- }
-
- protected static Iterable<ByteBuffer> asContent(String... chunks) {
- List<ByteBuffer> ret = new LinkedList<>();
- for (String chunk : chunks) {
- ret.add(ByteBuffer.wrap(chunk.getBytes(StandardCharsets.UTF_8)));
- }
- return ret;
- }
-
- protected static class MyRequestDispatch extends RequestDispatch {
-
- final Map<String, Object> context = new HashMap<>();
- final CurrentContainer container;
- final URI requestUri;
- final HeaderFields requestHeaders;
- final Iterable<ByteBuffer> requestContent;
- final BufferedContentChannel responseContent = new BufferedContentChannel();
-
- MyRequestDispatch(CurrentContainer container, URI requestUri, HeaderFields requestHeaders,
- Iterable<ByteBuffer> requestContent, Map<String, Object> context) {
- this.container = container;
- this.requestUri = requestUri;
- this.requestHeaders = requestHeaders;
- this.requestContent = requestContent;
- this.context.putAll(context);
- }
-
- @Override
- protected Request newRequest() {
- Request request = new Request(container, requestUri);
- request.headers().addAll(requestHeaders);
- request.context().putAll(context);
- return request;
- }
-
- @Override
- protected Iterable<ByteBuffer> requestContent() {
- return requestContent;
- }
-
- @Override
- public ContentChannel handleResponse(Response response) {
- return responseContent;
- }
- }
-
- protected static class HeaderEntry {
-
- final String key;
- final String val;
-
- HeaderEntry(String key, String val) {
- this.key = key;
- this.val = val;
- }
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AsyncResponseHandlerTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AsyncResponseHandlerTestCase.java
deleted file mode 100644
index 30cdd7acfe2..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/AsyncResponseHandlerTestCase.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.AsyncHandler;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.ReadableContentChannel;
-import com.yahoo.jdisc.handler.ResponseHandler;
-import com.yahoo.jdisc.test.NonWorkingRequest;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertNull;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
- */
-public class AsyncResponseHandlerTestCase {
-
- @Test(enabled = false)
- public void requireThatOnThrowableAbortsHandler() throws Exception {
- AsyncResponseHandler handler = new AsyncResponseHandler(NonWorkingRequest.newInstance("http://localhost/"),
- new MyResponseHandler(), new MyMetric(),
- new Metric.Context() { });
- handler.onThrowable(new Throwable());
- assertEquals(AsyncHandler.STATE.ABORT, handler.onStatusReceived(null));
- assertEquals(AsyncHandler.STATE.ABORT, handler.onHeadersReceived(null));
- assertEquals(AsyncHandler.STATE.ABORT, handler.onBodyPartReceived(null));
- assertNull(handler.onCompleted());
- }
-
- private static class MyResponseHandler implements ResponseHandler {
-
- @Override
- public ContentChannel handleResponse(Response response) {
- return new ReadableContentChannel();
- }
- }
-
- private static class MyMetric implements Metric {
-
- @Override
- public void set(String key, Number val, Context ctx) {
-
- }
-
- @Override
- public void add(String key, Number val, Context ctx) {
-
- }
-
- @Override
- public Context createContext(Map<String, ?> properties) {
- return null;
- }
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientErrorTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientErrorTestCase.java
deleted file mode 100644
index 84e758e868e..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientErrorTestCase.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import org.testng.annotations.Test;
-
-import static org.testng.AssertJUnit.assertTrue;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-public class ClientErrorTestCase {
-
- @Test(enabled = false)
- public void requireNothing() {
- assertTrue(true);
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientThreadingTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientThreadingTestCase.java
deleted file mode 100644
index 17140a88369..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ClientThreadingTestCase.java
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.google.inject.AbstractModule;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.application.ContainerThread;
-import com.yahoo.jdisc.handler.ContentChannel;
-import com.yahoo.jdisc.handler.RequestDispatch;
-import com.yahoo.jdisc.http.test.ClientTestDriver;
-import org.testng.annotations.Test;
-
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-
-import static org.testng.AssertJUnit.assertTrue;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-public class ClientThreadingTestCase extends AbstractClientTestCase {
-
- @Test(enabled = false)
- public void requireThatDefaultThreadFactoryCreatesContainerThreads() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance(new HttpClientConfig.Builder());
- ThreadAwareDispatch dispatch = new ThreadAwareDispatch(driver, "/foo.html");
- assertDispatch(dispatch);
- assertTrue(dispatch.latch.await(60, TimeUnit.SECONDS));
- assertTrue(dispatch.thread instanceof ContainerThread);
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatThreadFactoryIsUsed() throws Exception {
- final MyThreadFactory factory = new MyThreadFactory();
- ClientTestDriver driver = ClientTestDriver.newInstance(new AbstractModule() {
-
- @Override
- protected void configure() {
- bind(ThreadFactory.class).toInstance(factory);
- }
- });
- ThreadAwareDispatch dispatch = new ThreadAwareDispatch(driver, "/foo.html");
- assertDispatch(dispatch);
- assertTrue(dispatch.latch.await(60, TimeUnit.SECONDS));
- assertTrue(factory.threads.contains(dispatch.thread));
- assertTrue(driver.close());
- }
-
- private static void assertDispatch(ThreadAwareDispatch dispatch) throws Exception {
- dispatch.dispatch();
- assertRequest(dispatch.driver.server(),
- expectedRequestChunks("POST " + dispatch.requestUri + " HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- dispatch);
- assertResponse(dispatch.get(60, TimeUnit.SECONDS),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders());
- }
-
- private static class ThreadAwareDispatch extends RequestDispatch {
-
- final CountDownLatch latch = new CountDownLatch(1);
- final ClientTestDriver driver;
- final String requestUri;
- Thread thread;
-
- ThreadAwareDispatch(ClientTestDriver driver, String requestUri) {
- this.driver = driver;
- this.requestUri = requestUri;
- }
-
- @Override
- protected Request newRequest() {
- return new Request(driver.currentContainer(), driver.server().newRequestUri(requestUri));
- }
-
- @Override
- public ContentChannel handleResponse(Response response) {
- thread = Thread.currentThread();
- latch.countDown();
- return null;
- }
- }
-
- private static class MyThreadFactory implements ThreadFactory {
-
- final BlockingQueue<Thread> threads = new LinkedBlockingQueue<>();
-
- @Override
- public Thread newThread(Runnable task) {
- Thread thread = new Thread(task);
- threads.add(thread);
- return thread;
- }
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/EmptyResponseTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/EmptyResponseTestCase.java
deleted file mode 100644
index 62b9612e59b..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/EmptyResponseTestCase.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertFalse;
-
-/**
- * @author <a href="mailto:vikasp@yahoo-inc.com">Vikas Panwar</a>
- */
-public class EmptyResponseTestCase {
- @Test(enabled = false)
- public void testGetterSetters() throws IOException {
- EmptyResponse underTest = EmptyResponse.INSTANCE;
-
- assertEquals(0, underTest.getStatusCode());
- assertNull(underTest.getStatusText());
- assertEquals(0, underTest.getResponseBodyAsByteBuffer().remaining());
- assertEquals(0, underTest.getResponseBodyAsBytes().length);
- assertNull(underTest.getResponseBodyAsStream());
- assertNull(underTest.getResponseBody());
- assertNull(underTest.getResponseBodyExcerpt(10, ""));
- assertNull(underTest.getResponseBodyExcerpt(10));
- assertNull(underTest.getResponseBody());
- assertNull(underTest.getUri());
- assertNull(underTest.getContentType());
- assertNull(underTest.getHeader(""));
- assertNull(underTest.getHeaders(""));
- assertNull(underTest.getHeaders());
- assertFalse(underTest.isRedirected());
- assertNull(underTest.getCookies());
- assertFalse(underTest.hasResponseStatus());
- assertFalse(underTest.hasResponseHeaders());
- assertFalse(underTest.hasResponseBody());
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/HttpClientTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/HttpClientTestCase.java
deleted file mode 100644
index 751b696399e..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/HttpClientTestCase.java
+++ /dev/null
@@ -1,578 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.google.inject.AbstractModule;
-import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.Request;
-import com.yahoo.jdisc.Response;
-import com.yahoo.jdisc.application.MetricConsumer;
-import com.yahoo.jdisc.handler.RequestDispatch;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.HttpResponse;
-import com.yahoo.jdisc.http.client.filter.FilterException;
-import com.yahoo.jdisc.http.client.filter.ResponseFilter;
-import com.yahoo.jdisc.http.client.filter.ResponseFilterContext;
-import com.yahoo.jdisc.http.test.ClientTestDriver;
-import com.yahoo.jdisc.http.test.RemoteServer;
-import org.testng.annotations.Test;
-
-import java.net.URI;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static com.yahoo.jdisc.http.test.ClientTestDriver.newFilterModule;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertNotNull;
-import static org.testng.AssertJUnit.assertSame;
-import static org.testng.AssertJUnit.assertTrue;
-import static org.testng.AssertJUnit.fail;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
- */
-public class HttpClientTestCase extends AbstractClientTestCase {
-
- private static final int NUM_REQUESTS = 10;
-
- @Test(enabled = false)
- public void requireThatRequestCanBeSent() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /foo.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatRequestHeadersAreSent() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(newHeader("foo", "bar")),
- requestContent(),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "foo: bar\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatRequestContentIsSent() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent("foo", "bar"),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "Content-Length: 6\r\n" +
- "\r\n" +
- "foobar"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatRequestContentCanBeChunked() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance(new HttpClientConfig.Builder()
- .chunkedEncodingEnabled(true));
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent("foo", "bar"),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "\r\n",
- "3\r\nfoo\r\n",
- "3\r\nbar\r\n",
- "0\r\n\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatGetRequestsAreNeverChunked() throws Exception {
- final ClientTestDriver driver = ClientTestDriver.newInstance(new HttpClientConfig.Builder()
- .chunkedEncodingEnabled(true));
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- Future<Response> future = new RequestDispatch() {
-
- @Override
- protected Request newRequest() {
- return HttpRequest.newServerRequest(driver.currentContainer(),
- driver.server().newRequestUri("/status.html"),
- HttpRequest.Method.GET);
- }
- }.dispatch();
- assertRequest(driver.server(),
- expectedRequestChunks("GET /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- future);
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatTraceRequestsDoNotAcceptContent() throws Exception {
- final ClientTestDriver driver = ClientTestDriver.newInstance(new HttpClientConfig.Builder()
- .chunkedEncodingEnabled(true));
- RequestDispatch dispatch = new RequestDispatch() {
-
- @Override
- protected Request newRequest() {
- return HttpRequest.newServerRequest(driver.currentContainer(),
- driver.server().newRequestUri("/status.html"),
- HttpRequest.Method.TRACE);
- }
-
- @Override
- protected Iterable<ByteBuffer> requestContent() {
- return Arrays.asList(ByteBuffer.allocate(69));
- }
- };
- try {
- dispatch.dispatch();
- fail();
- } catch (UnsupportedOperationException e) {
-
- }
- assertRequest(driver.server(),
- expectedRequestChunks("TRACE /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- dispatch);
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatResponseCodeIsRead() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 69 foo\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(69),
- expectedResponseMessage("foo"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatResponseHeadersAreRead() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "foo: bar\r\n" +
- "baz: cox\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(newHeader("foo", "bar"), newHeader("baz", "cox")),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatResponseContentIsRead() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "Content-Length: 6\r\n" +
- "\r\n" +
- "foobar"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent("foobar"));
- }
- assertTrue(driver.close());
- }
-
- private void requireThatChunkedResponseContentIsRead() throws Exception {
- ClientTestDriver driver = ClientTestDriver.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/status.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /status.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "Connection: keep-alive\r\n" +
- "\r\n",
- "3\r\nfoo\r\n",
- "3\r\nbar\r\n",
- "0\r\n\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent("foo", "bar"));
- }
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatRequestTimeoutCanOccur() throws Exception {
- final ClientTestDriver driver = ClientTestDriver.newInstance();
- Response response = new RequestDispatch() {
-
- @Override
- protected Request newRequest() {
- Request request = new Request(driver.currentContainer(), driver.server().connectionSpec());
- request.setTimeout(1, TimeUnit.MILLISECONDS);
- return request;
- }
- }.dispatch().get(60, TimeUnit.SECONDS);
- assertNotNull(response);
- assertEquals(Response.Status.REQUEST_TIMEOUT, response.getStatus());
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatConnectionTimeoutCanOccur() throws Exception {
- final ClientTestDriver driver = ClientTestDriver.newInstance();
- Response response = new RequestDispatch() {
-
- @Override
- protected Request newRequest() {
- HttpRequest request = HttpRequest.newServerRequest(driver.currentContainer(),
- driver.server().connectionSpec());
- request.setConnectionTimeout(1, TimeUnit.MILLISECONDS);
- return request;
- }
- }.dispatch().get(60, TimeUnit.SECONDS);
- assertTrue(response instanceof HttpResponse);
- HttpResponse httpResponse = (HttpResponse)response;
- assertEquals(Response.Status.REQUEST_TIMEOUT, httpResponse.getStatus());
- assertEquals("java.util.concurrent.TimeoutException: No response received after 1", httpResponse.getMessage());
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatMetricContextIsCachedPerServer() throws Exception {
- MyMetric metric = new MyMetric(new Metric.Context() {
-
- });
- ClientTestDriver driver = ClientTestDriver.newInstance(metric);
- RemoteServer server1 = driver.server();
- RemoteServer server2 = RemoteServer.newInstance();
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), server1,
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /foo.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- assertRequest(driver.currentContainer(), server2,
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /foo.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- assertTrue(server2.close(60, TimeUnit.SECONDS));
- assertEquals(2, metric.numContexts.get());
- assertTrue(metric.numCalls.get() > 0);
- }
-
- @Test(enabled = false)
- public void requireThatNullMetricContextIsLegal() throws Exception {
- MyMetric metric = new MyMetric(null);
- ClientTestDriver driver = ClientTestDriver.newInstance(metric);
- for (int i = 0; i < NUM_REQUESTS; ++i) {
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /foo.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent());
- }
- assertTrue(driver.close());
- assertEquals(1, metric.numContexts.get());
- assertTrue(metric.numCalls.get() > 0);
- }
-
- @Test(enabled = false)
- public void requireThatUnsupportedURISchemeThrowsException() throws Exception {
- final ClientTestDriver driver = ClientTestDriver.newInstance(new HttpClientConfig.Builder()
- .chunkedEncodingEnabled(true)
- .connectionPoolEnabled(false));
-
- try {
- new RequestDispatch() {
- @Override
- public Request newRequest() {
- return HttpRequest.newServerRequest(
- driver.currentContainer(),
- URI.create("ftp://localhost/"),
- HttpRequest.Method.GET);
- }
- }.dispatch();
- fail();
- } catch (UnsupportedOperationException e) {
- assertEquals("Unknown protocol: ftp", e.getMessage());
- }
-
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatResponseFilterIsInvoked() throws Exception {
- final CountDownLatch filterInvokeCount = new CountDownLatch(2);
- final StringBuffer responseBuffer = new StringBuffer();
- ResponseFilter[] filters = new ResponseFilter[2];
- filters[0] = (new ResponseFilter() {
-
- @Override
- public ResponseFilterContext filter(ResponseFilterContext filterContext) {
- filterInvokeCount.countDown();
- return filterContext;
- }
- });
- filters[1] = (new ResponseFilter() {
-
- @Override
- public ResponseFilterContext filter(ResponseFilterContext filterContext) {
- filterInvokeCount.countDown();
- responseBuffer.append(filterContext.getRequestURI().getHost())
- .append(filterContext.getRequestURI().getPath())
- .append(filterContext.getResponseStatusCode())
- .append(filterContext.getResponseFirstHeader("Content-Type"))
- .append(filterContext.getRequestContext().get("key1"))
- .append(filterContext.getRequestContext().get("key2"));
- return filterContext;
- }
- });
- Map<String, Object> context = new HashMap<>();
- context.put("key1", "value1");
- context.put("key2", "value2");
- ClientTestDriver driver = ClientTestDriver.newInstance(newFilterModule(filters));
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks("POST /foo.html HTTP/1.1\r\n" +
- "Host: .+\r\n" +
- "Connection: keep-alive\r\n" +
- "Accept: .+/.+\r\n" +
- "User-Agent: JDisc/1.0\r\n" +
- "\r\n"),
- responseChunks("HTTP/1.1 200 OK\r\n" +
- "Content-Type: text/plain; charset=UTF-8\r\n" +
- "\r\n"),
- expectedResponseStatus(200),
- expectedResponseMessage("OK"),
- expectedResponseHeaders(),
- expectedResponseContent(),
- context);
-
- filterInvokeCount.await(60, TimeUnit.SECONDS);
- assertEquals(0, filterInvokeCount.getCount());
- assertEquals("localhost/foo.html200text/plain; charset=UTF-8value1value2", responseBuffer.toString());
- assertTrue(driver.close());
- }
-
- @Test(enabled = false)
- public void requireThatResponseFilterHandlesFilterExceptionProperly() throws Exception {
- ResponseFilter filter = new ResponseFilter() {
-
- @Override
- public ResponseFilterContext filter(ResponseFilterContext filterContext) throws FilterException {
- throw new FilterException("Request aborted.");
- }
- };
- ClientTestDriver driver = ClientTestDriver.newInstance(newFilterModule(filter));
- assertRequest(driver.currentContainer(), driver.server(),
- requestUri("/foo.html"),
- requestHeaders(),
- requestContent(),
- expectedRequestChunks(),
- responseChunks("HTTP/1.1 400 \r\n" +
- "\r\n"),
- expectedResponseStatus(400),
- expectedResponseMessage("Request aborted."),
- expectedResponseHeaders(),
- expectedResponseContent());
- assertTrue(driver.close());
- }
-
- private static class MyMetric extends AbstractModule implements MetricConsumer {
-
- final AtomicInteger numContexts = new AtomicInteger(0);
- final AtomicInteger numCalls = new AtomicInteger(0);
- final Metric.Context context;
-
- MyMetric(Metric.Context context) {
- this.context = context;
- }
-
- @Override
- protected void configure() {
- bind(MetricConsumer.class).toInstance(this);
- }
-
- @Override
- public void set(String key, Number val, Metric.Context context) {
- assertSame(this.context, context);
- numCalls.incrementAndGet();
- }
-
- @Override
- public void add(String key, Number val, Metric.Context context) {
- assertSame(this.context, context);
- numCalls.incrementAndGet();
- }
-
- @Override
- public Metric.Context createContext(Map<String, ?> properties) {
- numContexts.incrementAndGet();
- return context;
- }
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ProxyServerFactoryTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ProxyServerFactoryTestCase.java
deleted file mode 100644
index 7f5e22e48da..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/ProxyServerFactoryTestCase.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client;
-
-import com.ning.http.client.ProxyServer;
-import org.testng.annotations.Test;
-
-import java.net.URI;
-
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertNull;
-
-/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen Hult</a>
- */
-public class ProxyServerFactoryTestCase {
-
- @Test(enabled = false)
- public void requireThatProxyServerFactoryWorks() {
- assertNull(ProxyServerFactory.newInstance(null));
-
- ProxyServer proxy = ProxyServerFactory.newInstance(URI.create("http://localhost:1234"));
- assertEquals(ProxyServer.Protocol.HTTP, proxy.getProtocol());
- assertEquals("localhost", proxy.getHost());
- assertEquals(1234, proxy.getPort());
- assertNull(proxy.getPrincipal());
- assertNull(proxy.getPassword());
-
- proxy = ProxyServerFactory.newInstance(URI.create("http://foo@localhost:1234"));
- assertEquals(ProxyServer.Protocol.HTTP, proxy.getProtocol());
- assertEquals("localhost", proxy.getHost());
- assertEquals(1234, proxy.getPort());
- assertEquals("foo", proxy.getPrincipal());
- assertNull(proxy.getPassword());
-
- proxy = ProxyServerFactory.newInstance(URI.create("https://foo:bar@localhost:1234"));
- assertEquals(ProxyServer.Protocol.HTTPS, proxy.getProtocol());
- assertEquals("localhost", proxy.getHost());
- assertEquals(1234, proxy.getPort());
- assertEquals("foo", proxy.getPrincipal());
- assertEquals("bar", proxy.getPassword());
- }
-}
diff --git a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridgeTestCase.java b/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridgeTestCase.java
deleted file mode 100644
index b2154349549..00000000000
--- a/jdisc_http_service/src/test/java/com/yahoo/jdisc/http/client/filter/core/ResponseFilterBridgeTestCase.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.jdisc.http.client.filter.core;
-
-import com.ning.http.client.FluentCaseInsensitiveStringsMap;
-import com.ning.http.client.HttpResponseHeaders;
-import com.ning.http.client.HttpResponseStatus;
-import com.ning.http.client.Request;
-import com.ning.http.client.filter.FilterContext;
-import com.yahoo.jdisc.http.HttpRequest;
-import com.yahoo.jdisc.http.client.filter.ResponseFilterContext;
-import org.testng.annotations.Test;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.testng.AssertJUnit.assertEquals;
-
-/**
- * @author <a href="mailto:alain@yahoo-inc.com">Alain Wan Buen Cheong</a>
- */
-public class ResponseFilterBridgeTestCase {
-
- @Test(enabled = false)
- public void requireThatResponseFilterBridgeConvertsFieldsProperly() throws MalformedURLException, URISyntaxException {
- ResponseFilterContext responseFilterContext = ResponseFilterBridge.toResponseFilterContext(
- constructFilterContext(),
- constructRequest()
- );
-
- assertEquals("http://localhost:8080/echo", responseFilterContext.getRequestURI().toString());
- assertEquals(200, responseFilterContext.getResponseStatusCode());
- assertEquals("v1", responseFilterContext.getResponseFirstHeader("k1"));
- assertEquals("v2", responseFilterContext.getResponseFirstHeader("k2"));
- Map<String, Object> customParams = responseFilterContext.getRequestContext();
- assertEquals("cv1", customParams.get("c1"));
- assertEquals("cv2", customParams.get("c2"));
-
- }
-
- private HttpRequest constructRequest() {
- HttpRequest request = mock(HttpRequest.class);
- Map<String, Object> customParams = new HashMap<>();
- customParams.put("c1", "cv1");
- customParams.put("c2", "cv2");
- when(request.context()).thenReturn(customParams);
- return request;
- }
-
- private FilterContext<?> constructFilterContext() throws MalformedURLException, URISyntaxException {
- FilterContext.FilterContextBuilder<?> builder = new FilterContext.FilterContextBuilder<>();
-
- Request request = mock(Request.class);
- URL url = new URL("http://localhost:8080/echo");
- URI reqURI = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(),
- url.getQuery(), url.getRef());
- when(request.getURI()).thenReturn(reqURI);
-
- HttpResponseStatus responseStatus = mock(HttpResponseStatus.class);
- when(responseStatus.getStatusCode()).thenReturn(200);
-
- HttpResponseHeaders responseHeaders = mock(HttpResponseHeaders.class);
- FluentCaseInsensitiveStringsMap headers = new FluentCaseInsensitiveStringsMap();
- headers.add("k1", "v1", "v12", "v13");
- headers.add("k2", "v2");
- when(responseHeaders.getHeaders()).thenReturn(headers);
-
- builder.request(request);
- builder.responseStatus(responseStatus);
- builder.responseHeaders(responseHeaders);
-
- return builder.build();
- }
-}