diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-04-24 18:17:17 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-04-24 18:26:36 +0200 |
commit | 9e0d7b273fd0cd717bb18aa00e6e9a64ef9bbd7b (patch) | |
tree | 04ada46037d2eced41afa5a869d156bef8fb137e /jdisc_http_service | |
parent | 133b9554c589e9bede4ec351b08e4b17e59650d7 (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')
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(); - } -} |