Intro
During this month we received lots of contributions and user feedback.
Highlights
- JDK based provider
This release support a new AsyncHttpProvider based on JDK's URLConnection.
This provider can be used in environments that aren't supporting NIO.
AsyncHttpClient client = new AsyncHttpClient(new JDKAsyncHttpProvider(config));
- Authentication
The library now support 3 authentication scheme: Basic, Digest and NTLM.RequestBuilder r = client.prepareGet(url)
AuthScheme can be BASIC, DIGEST or NTLM.
.setRealm((new Realm.RealmBuilder())
.setScheme(AuthScheme)
.setPrincipal(user)
.setPassword(admin)
.setUsePreemptiveAuth(true).build());
- SSL Tunneling support
This release also adds support for SSL Tunneling.AsyncHttpClientConfig.Builder b = new AsyncHttpClientConfig.Builder();
b.setFollowRedirects(true);
ProxyServer ps = new ProxyServer(ProxyServer.Protocol.HTTPS, "127.0.0.1", port1);
b.setProxyServer(ps);
AsyncHttpClientConfig config = b.build();
AsyncHttpClient asyncHttpClient = new AsyncHttpClient(config);
RequestBuilder rb = new RequestBuilder("GET").setUrl(url);
Future<Response> responseFuture = asyncHttpClient.executeRequest(rb.build(), new AsyncCompletionHandlerBase() {
public void onThrowable(Throwable t) {
log.debug(t);
}
@Override
public Response onCompleted(Response response) throws Exception {
return response;
}
});
- WebDav
WebDav is now supported and can be used with two interfaces.- Low level
AsyncHttpClient c = new AsyncHttpClient();
Request mkcolRequest = new RequestBuilder("MKCOL").setUrl("http://127.0.0.1:8080/folder1").build();
Response response = c.executeRequest(mkcolRequest).get();
Request putRequest = new RequestBuilder("PUT").setUrl("http://127.0.0.1:8080/folder1/Test.txt").setBody("this is a test").build();
response = c.executeRequest(putRequest).get();
Request propFindRequest = new RequestBuilder("PROPFIND").setUrl("http://127.0.0.1:8080/folder1/Test.txt").build();
response = c.executeRequest(propFindRequest).get();
// Check the response.
response.getStatusCode(); //Will return 207
response.getResponseBody().contains("<status>HTTP/1.1 200 OK</status>"));
- High level
You can also use a special AsyncHandler which construct a response
based on the webdav response's code.AsyncHttpClient c = new AsyncHttpClient();
Request mkcolRequest = new RequestBuilder("MKCOL").setUrl("http://127.0.0.1:8080/folder1").build();
Response response = c.executeRequest(mkcolRequest).get();
assertEquals(response.getStatusCode(), 201);
Request propFindRequest = new RequestBuilder("PROPFIND").setUrl("http://127.0.0.1:8080/folder1/").build();
WebDavResponse webDavResponse = c.executeRequest(propFindRequest, new WebDavCompletionHandlerBase<WebDavResponse>() {
@Override
public WebDavResponse onCompleted(WebDavResponse response) throws Exception {
return response;
}
}).get();
webDavResponse.getStatusCode(); // will return 200.
- Low level
- Zero copy
Sometimes you need to just download some content, with out
copying/inspecting the bytes in memory, just download and store.File file = new File(url.toURI());
File tmp = new File(System.getProperty("java.io.tmpdir") + File.separator + "zeroCopy.txt");
final FileOutputStream stream = new FileOutputStream(tmp);
// Upload a file using setBody(File);
Future<Response> f = client.preparePost("http://127.0.0.1:" + port1 + "/").setBody(file).execute(new AsyncHandler<Response>() {
public void onThrowable(Throwable t) {}
public STATE onBodyPartReceived(HttpResponseBodyPart bodyPart) throws Exception {
bodyPart.writeTo(stream);
// Copy the bytes directly to a File. In our case it is an FileInputStream
return STATE.CONTINUE;
}
public STATE onStatusReceived(HttpResponseStatus responseStatus) throws Exception {
return STATE.CONTINUE;
}
public STATE onHeadersReceived(HttpResponseHeaders headers) throws Exception {
return STATE.CONTINUE;
}
public Response onCompleted() throws Exception {
return null;
}
});
Response resp = f.get();
stream.close();
- Automatic HTTPS redirects
Another new feature is we do support redirect from http to HTTPS automatically:AsyncHttpClientConfig cg = new AsyncHttpClientConfig.Builder().setFollowRedirects(true).build();
If the server redirect us to https, we will follow the new url
AsyncHttpClient c = new AsyncHttpClient(cg);
Response response = c.preparePost(url).execute().get();
without any issue.
Changelog
- Bug fixes
- Parameter encoding issue
Test case by Martin Traverso.
- fix redirect loop issue
Patch provided by Jenny Loomis.
- Per request follow redirects
Patch provided by Erwan Loisant.
- Fix Idle timeout
Patch provided by felixtrepanier.
- Parameter encoding issue
- New features
- SSL failure leaks channel
Test case and a fix provided by Michael Pilquist.
- SSL failure leaks channel