@Test(groups = "standalone", enabled = false)
  public void testProxyActivationProperty()
      throws IOException, ExecutionException, TimeoutException, InterruptedException {
    // FIXME not threadsafe!
    Properties originalProps = new Properties();
    originalProps.putAll(System.getProperties());
    System.setProperty(ProxyUtils.PROXY_HOST, "127.0.0.1");
    System.setProperty(ProxyUtils.PROXY_PORT, String.valueOf(port1));
    System.setProperty(ProxyUtils.PROXY_NONPROXYHOSTS, "localhost");
    System.setProperty(
        AsyncHttpClientConfigDefaults.ASYNC_CLIENT_CONFIG_ROOT + "useProxyProperties", "true");
    AsyncHttpClientConfigHelper.reloadProperties();

    try (AsyncHttpClient client = asyncHttpClient()) {
      String proxifiedTarget = "http://127.0.0.1:1234/";
      Future<Response> f = client.prepareGet(proxifiedTarget).execute();
      Response resp = f.get(3, TimeUnit.SECONDS);
      assertNotNull(resp);
      assertEquals(resp.getStatusCode(), HttpServletResponse.SC_OK);
      assertEquals(resp.getHeader("target"), "/");

      String nonProxifiedTarget = "http://localhost:1234/";
      f = client.prepareGet(nonProxifiedTarget).execute();
      try {
        resp = f.get(3, TimeUnit.SECONDS);
        fail("should not be able to connect");
      } catch (ExecutionException e) {
        // ok, no proxy used
      }
    } finally {
      System.setProperties(originalProps);
    }
  }
  @Test(groups = "standalone")
  public void testObserveMultiple() {
    final TestSubscriber<Response> tester = new TestSubscriber<>();

    try (AsyncHttpClient client = asyncHttpClient()) {
      Observable<Response> o1 =
          AsyncHttpObservable.observe(() -> client.prepareGet("http://gatling.io"));
      Observable<Response> o2 =
          AsyncHttpObservable.observe(
              () -> client.prepareGet("http://www.wisc.edu").setFollowRedirect(true));
      Observable<Response> o3 =
          AsyncHttpObservable.observe(
              () -> client.prepareGet("http://www.umn.edu").setFollowRedirect(true));
      Observable<Response> all = Observable.merge(o1, o2, o3);
      all.subscribe(tester);
      tester.awaitTerminalEvent();
      tester.assertTerminalEvent();
      tester.assertCompleted();
      tester.assertNoErrors();
      List<Response> responses = tester.getOnNextEvents();
      assertNotNull(responses);
      assertEquals(responses.size(), 3);
      for (Response response : responses) {
        assertEquals(response.getStatusCode(), 200);
      }
    } catch (Exception e) {
      Thread.currentThread().interrupt();
    }
  }
  @Test(groups = {"standalone", "default_provider"})
  public void basicByteBufferTest() throws Exception {
    AsyncHttpClient c = getAsyncHttpClient(null);
    try {
      File largeFile = createTempFile(1024 * 100 * 10);
      final AtomicInteger byteReceived = new AtomicInteger();

      try {
        Response response =
            c.preparePut(getTargetUrl())
                .setBody(largeFile)
                .execute(
                    new AsyncCompletionHandlerAdapter() {
                      @Override
                      public STATE onBodyPartReceived(final HttpResponseBodyPart content)
                          throws Exception {
                        byteReceived.addAndGet(content.getBodyByteBuffer().capacity());
                        return super.onBodyPartReceived(content);
                      }
                    })
                .get();

        assertNotNull(response);
        assertEquals(response.getStatusCode(), 200);
        assertEquals(byteReceived.get(), largeFile.length());
        assertEquals(response.getResponseBody().length(), largeFile.length());

      } catch (IOException ex) {
        fail("Should have timed out");
      }
    } finally {
      c.close();
    }
  }
 @Test(groups = "standalone")
 public void testGlobalProxy()
     throws IOException, ExecutionException, TimeoutException, InterruptedException {
   try (AsyncHttpClient client =
       asyncHttpClient(config().setProxyServer(proxyServer("localhost", port1)))) {
     String target = "http://localhost:1234/";
     Future<Response> f = client.prepareGet(target).execute();
     Response resp = f.get(3, TimeUnit.SECONDS);
     assertNotNull(resp);
     assertEquals(resp.getStatusCode(), HttpServletResponse.SC_OK);
     assertEquals(resp.getHeader("target"), "/");
   }
 }
 @Test(groups = {"standalone", "default_provider"})
 public void Expect100Continue() throws Exception {
   try (AsyncHttpClient client = getAsyncHttpClient(null)) {
     Future<Response> f =
         client
             .preparePut("http://127.0.0.1:" + port1 + "/")
             .setHeader("Expect", "100-continue")
             .setBody(SIMPLE_TEXT_FILE)
             .execute();
     Response resp = f.get();
     assertNotNull(resp);
     assertEquals(resp.getStatusCode(), HttpServletResponse.SC_OK);
     assertEquals(resp.getResponseBody(), SIMPLE_TEXT_FILE_STRING);
   }
 }
  // @Test(groups = { "standalone", "default_provider" })
  public void relativeLocationUrl() throws Exception {
    isSet.getAndSet(false);

    AsyncHttpClient c = getAsyncHttpClient(null);
    try {
      Response response =
          c.preparePost(getTargetUrl())
              .setFollowRedirect(true)
              .setHeader("X-redirect", "/foo/test")
              .execute()
              .get();
      assertNotNull(response);
      assertEquals(response.getStatusCode(), 302);
      assertEquals(response.getUri().toString(), getTargetUrl());
    } finally {
      c.close();
    }
  }
  // @Test(groups = { "online", "default_provider" })
  public void notRedirected302Test() throws Exception {
    isSet.getAndSet(false);
    AsyncHttpClientConfig cg = new AsyncHttpClientConfig.Builder().setFollowRedirect(true).build();
    AsyncHttpClient c = getAsyncHttpClient(cg);
    try {
      Response response =
          c.prepareGet(getTargetUrl())
              .setFollowRedirect(false)
              .setHeader("X-redirect", "http://www.microsoft.com/")
              .execute()
              .get();

      assertNotNull(response);
      assertEquals(response.getStatusCode(), 302);
    } finally {
      c.close();
    }
  }
  @Test(groups = {"standalone", "default_provider"})
  public void testOmitErrorBody() throws Exception {
    SimpleAsyncHttpClient client =
        new SimpleAsyncHttpClient.Builder()
            .setProviderClass(getProviderClass())
            .setUrl(getTargetUrl() + "/nonexistent")
            .setErrorDocumentBehaviour(ErrorDocumentBehaviour.OMIT)
            .build();
    try {
      ByteArrayOutputStream o = new ByteArrayOutputStream(10);
      Future<Response> future = client.get(new OutputStreamBodyConsumer(o));

      System.out.println("waiting for response");
      Response response = future.get();
      assertEquals(response.getStatusCode(), 404);
      assertEquals(o.toString(), "");
      assertEquals(response.getResponseBody(), "");
    } finally {
      client.close();
    }
  }
  // @Test(groups = { "standalone", "default_provider" })
  public void redirected302InvalidTest() throws Exception {
    isSet.getAndSet(false);
    AsyncHttpClient c = getAsyncHttpClient(null);
    try {
      // If the test hit a proxy, no ConnectException will be thrown and instead of 404 will be
      // returned.
      Response response =
          c.preparePost(getTargetUrl())
              .setFollowRedirect(true)
              .setHeader("X-redirect", String.format("http://127.0.0.1:%d/", port2))
              .execute()
              .get();

      assertNotNull(response);
      assertEquals(response.getStatusCode(), 404);
    } catch (ExecutionException ex) {
      assertEquals(ex.getCause().getClass(), ConnectException.class);
    } finally {
      c.close();
    }
  }
  // @Test(groups = "standalone")
  public void testUseProxySelector()
      throws IOException, ExecutionException, TimeoutException, InterruptedException {
    ProxySelector originalProxySelector = ProxySelector.getDefault();
    ProxySelector.setDefault(
        new ProxySelector() {
          public List<Proxy> select(URI uri) {
            if (uri.getHost().equals("127.0.0.1")) {
              return Arrays.asList(
                  new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", port1)));
            } else {
              return Arrays.asList(Proxy.NO_PROXY);
            }
          }

          public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {}
        });

    try (AsyncHttpClient client = asyncHttpClient(config().setUseProxySelector(true))) {
      String proxifiedTarget = "http://127.0.0.1:1234/";
      Future<Response> f = client.prepareGet(proxifiedTarget).execute();
      Response resp = f.get(3, TimeUnit.SECONDS);
      assertNotNull(resp);
      assertEquals(resp.getStatusCode(), HttpServletResponse.SC_OK);
      assertEquals(resp.getHeader("target"), "/");

      String nonProxifiedTarget = "http://localhost:1234/";
      f = client.prepareGet(nonProxifiedTarget).execute();
      try {
        f.get(3, TimeUnit.SECONDS);
        fail("should not be able to connect");
      } catch (ExecutionException e) {
        // ok, no proxy used
      }
    } finally {
      // FIXME not threadsafe
      ProxySelector.setDefault(originalProxySelector);
    }
  }
  // @Test(groups = { "online", "default_provider" })
  public void redirected302Test() throws Exception {
    isSet.getAndSet(false);
    AsyncHttpClient c = getAsyncHttpClient(null);
    try {
      Response response =
          c.prepareGet(getTargetUrl())
              .setFollowRedirect(true)
              .setHeader("X-redirect", "http://www.microsoft.com/")
              .execute()
              .get();

      assertNotNull(response);
      assertEquals(response.getStatusCode(), 200);

      String anyMicrosoftPage = "http://www.microsoft.com[^:]*:80";
      String baseUrl = getBaseUrl(response.getUri());

      assertTrue(
          baseUrl.matches(anyMicrosoftPage),
          "response does not show redirection to " + anyMicrosoftPage);
    } finally {
      c.close();
    }
  }