@SuppressWarnings({ "unchecked", "rawtypes" }) public void testTooLargeResponse() throws Exception { ContentTooLongException tooLong = new ContentTooLongException("too long!"); CloseableHttpAsyncClient httpClient = mock(CloseableHttpAsyncClient.class); when(httpClient.<HttpResponse>execute(any(HttpAsyncRequestProducer.class), any(HttpAsyncResponseConsumer.class), any(HttpClientContext.class), any(FutureCallback.class))).then(new Answer<Future<HttpResponse>>() { @Override public Future<HttpResponse> answer(InvocationOnMock invocationOnMock) throws Throwable { HeapBufferedAsyncResponseConsumer consumer = (HeapBufferedAsyncResponseConsumer) invocationOnMock.getArguments()[1]; FutureCallback callback = (FutureCallback) invocationOnMock.getArguments()[3]; assertEquals(new ByteSizeValue(100, ByteSizeUnit.MB).bytesAsInt(), consumer.getBufferLimit()); callback.failed(tooLong); return null; } }); RemoteScrollableHitSource source = sourceWithMockedClient(true, httpClient); AtomicBoolean called = new AtomicBoolean(); Consumer<Response> checkResponse = r -> called.set(true); Throwable e = expectThrows(RuntimeException.class, () -> source.doStartNextScroll(FAKE_SCROLL_ID, timeValueMillis(0), checkResponse)); // Unwrap the some artifacts from the test while (e.getMessage().equals("failed")) { e = e.getCause(); } // This next exception is what the user sees assertEquals("Remote responded with a chunk that was too large. Use a smaller batch size.", e.getMessage()); // And that exception is reported as being caused by the underlying exception returned by the client assertSame(tooLong, e.getCause()); assertFalse(called.get()); }
/** * Verifies the content of the {@link HttpRequest} that's internally created and passed through to the http client */ @SuppressWarnings("unchecked") public void testInternalHttpRequest() throws Exception { ArgumentCaptor<HttpAsyncRequestProducer> requestArgumentCaptor = ArgumentCaptor.forClass(HttpAsyncRequestProducer.class); int times = 0; for (String httpMethod : getHttpMethods()) { HttpUriRequest expectedRequest = performRandomRequest(httpMethod); verify(httpClient, times(++times)).<HttpResponse>execute(requestArgumentCaptor.capture(), any(HttpAsyncResponseConsumer.class), any(HttpClientContext.class), any(FutureCallback.class)); HttpUriRequest actualRequest = (HttpUriRequest)requestArgumentCaptor.getValue().generateRequest(); assertEquals(expectedRequest.getURI(), actualRequest.getURI()); assertEquals(expectedRequest.getClass(), actualRequest.getClass()); assertArrayEquals(expectedRequest.getAllHeaders(), actualRequest.getAllHeaders()); if (expectedRequest instanceof HttpEntityEnclosingRequest) { HttpEntity expectedEntity = ((HttpEntityEnclosingRequest) expectedRequest).getEntity(); if (expectedEntity != null) { HttpEntity actualEntity = ((HttpEntityEnclosingRequest) actualRequest).getEntity(); assertEquals(EntityUtils.toString(expectedEntity), EntityUtils.toString(actualEntity)); } } } }
@Before @SuppressWarnings("unchecked") public void createRestClient() throws IOException { CloseableHttpAsyncClient httpClient = mock(CloseableHttpAsyncClient.class); when(httpClient.<HttpResponse>execute(any(HttpAsyncRequestProducer.class), any(HttpAsyncResponseConsumer.class), any(HttpClientContext.class), any(FutureCallback.class))).thenAnswer(new Answer<Future<HttpResponse>>() { @Override public Future<HttpResponse> answer(InvocationOnMock invocationOnMock) throws Throwable { HttpAsyncRequestProducer requestProducer = (HttpAsyncRequestProducer) invocationOnMock.getArguments()[0]; HttpUriRequest request = (HttpUriRequest)requestProducer.generateRequest(); HttpHost httpHost = requestProducer.getTarget(); HttpClientContext context = (HttpClientContext) invocationOnMock.getArguments()[2]; assertThat(context.getAuthCache().get(httpHost), instanceOf(BasicScheme.class)); FutureCallback<HttpResponse> futureCallback = (FutureCallback<HttpResponse>) invocationOnMock.getArguments()[3]; //return the desired status code or exception depending on the path if (request.getURI().getPath().equals("/soe")) { futureCallback.failed(new SocketTimeoutException(httpHost.toString())); } else if (request.getURI().getPath().equals("/coe")) { futureCallback.failed(new ConnectTimeoutException(httpHost.toString())); } else if (request.getURI().getPath().equals("/ioe")) { futureCallback.failed(new IOException(httpHost.toString())); } else { int statusCode = Integer.parseInt(request.getURI().getPath().substring(1)); StatusLine statusLine = new BasicStatusLine(new ProtocolVersion("http", 1, 1), statusCode, ""); futureCallback.completed(new BasicHttpResponse(statusLine)); } return null; } }); int numHosts = RandomNumbers.randomIntBetween(getRandom(), 2, 5); httpHosts = new HttpHost[numHosts]; for (int i = 0; i < numHosts; i++) { httpHosts[i] = new HttpHost("localhost", 9200 + i); } failureListener = new HostsTrackingFailureListener(); restClient = new RestClient(httpClient, 10000, new Header[0], httpHosts, null, failureListener); }
@SuppressWarnings("rawtypes") public List<HttpAsyncResponseConsumer> makeConsumers(List<HttpAsyncResponseConsumer> list) { List<HttpAsyncResponseConsumer> ls = new ArrayList<HttpAsyncResponseConsumer>(); for (HttpAsyncResponseConsumer r : list) { ls.add(makeConsumer(r)); } return ls; }
private Future<Response> executeRequest(Request request, HttpRequestBase method, HttpContext context, HTTPCallback<HttpResponse> callback) { if (request.isDownload()) { HttpAsyncRequestProducer producer = HttpAsyncMethods.create(method); HttpAsyncResponseConsumer<HttpResponse> consumer = new BasicAsyncResponseConsumer(); return executeRequest(producer, consumer, context, callback); } else return executeRequest(method, context, callback); }
private <T> Future<T> executeAsync(HttpUriRequest request, HttpAsyncResponseConsumer<T> consumer) { if(this.auth != null) { this.auth.authenticateRequest(request); } request.addHeader("User-Agent", HttpClient.userAgent); HttpHost target = new HttpHost(request.getURI().getHost(), request.getURI().getPort()); return client.execute(new BasicAsyncRequestProducer(target, request), consumer, null); }
@Override public HttpAsyncResponseConsumer<HttpResponse> createHttpAsyncResponseConsumer() { return new HeapBufferedAsyncResponseConsumer(bufferLimit); }
private Future<Response> executeRequest(HttpAsyncRequestProducer producer, HttpAsyncResponseConsumer<HttpResponse> consumer, HttpContext httpContext, HTTPCallback<HttpResponse> callback) { client.execute(producer, consumer, httpContext, new HTTPCCallback(callback)); return callback.getFuture(); }
public <T> Future<T> get(String path, HttpAsyncResponseConsumer<T> consumer) { final HttpGet request = new HttpGet(getUrl(path)); return this.executeAsync(request, consumer); }
public <T> Future<T> post(String path, HttpEntity data, HttpAsyncResponseConsumer<T> consumer) { return post(getUrl(path), data, consumer, null); }
public <T> Future<T> post(String path, HttpEntity data, HttpAsyncResponseConsumer<T> consumer, Map<String, String> parameters) { final HttpPost request = new HttpPost(getUrl(path)); request.setEntity(data); addQueryParameters(request, parameters); return this.executeAsync(request, consumer); }
public <T> Future<T> put(String path, HttpEntity data, HttpAsyncResponseConsumer<T> consumer) { final HttpPut request = new HttpPut(getUrl(path)); request.setEntity(data); return this.executeAsync(request, consumer); }
public <T> Future<T> delete(String path, HttpAsyncResponseConsumer<T> consumer) { final HttpDelete request = new HttpDelete(getUrl(path)); return executeAsync(request, consumer); }
public <T> Future<T> head(String path, HttpAsyncResponseConsumer<T> consumer) { final HttpHead request = new HttpHead(getUrl(path)); return executeAsync(request, consumer); }
@Override public Future<HttpResponse> execute(final HttpAsyncClient httpClient) throws FileNotFoundException { final HttpAsyncResponseConsumer<HttpResponse> consumer = new BasicAsyncResponseConsumer(); final HttpAsyncRequestProducer producer = this.getProducer(); return httpClient.execute(producer, consumer, null); }
/** * Creates the {@link HttpAsyncResponseConsumer}, called once per request attempt. */ HttpAsyncResponseConsumer<HttpResponse> createHttpAsyncResponseConsumer();
/** * Retries given HTTP request. Called internally only, from the HttpFuture * * @param httpUriRequest the HttpUriRequest to retry * @param responseConsumer the response consumer * @return the resulting Future<HttpResponse> instance */ Future<HttpResponse> retryOperation( HttpUriRequest httpUriRequest, HttpAsyncResponseConsumer<HttpResponse> responseConsumer ) { return responseConsumer == null ? asyncClient.execute( httpUriRequest, null ) : asyncClient.execute( HttpAsyncMethods.create( httpUriRequest ), responseConsumer, null, null ); }
/** * Instantiates a new Http future. * * @param asyncHttpService async http service instance * @param httpUriRequest the http uri request * @param responseConsumer the response consumer * @param httpResponseFuture the http response future * @param body the body */ public HttpFuture( AsyncHttpService asyncHttpService, HttpUriRequest httpUriRequest, HttpAsyncResponseConsumer<HttpResponse> responseConsumer, Future<HttpResponse> httpResponseFuture, String body ) { this( asyncHttpService, httpUriRequest, httpResponseFuture, body ); this.responseConsumer = responseConsumer; }