Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

2,794 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Async Http Client (@AsyncHttpClient on twitter)

Javadoc

Gettingstarted, and use WebSockets

Async Http Client library purpose is to allow Java applications to easily execute HTTP requests and asynchronously process the HTTP responses. The library also supports the WebSocket Protocol. The Async HTTP Client library is simple to use.

Installation

First, in order to add it to your Maven project, simply add this dependency:

<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>

You can also download the artifact

Maven Search

AHC is an abstraction layer that can work on top of the bare JDK, Netty and Grizzly. Note that the JDK implementation is very limited and you should REALLY use the other real providers.

You then have to add the Netty or Grizzly jars in the classpath.

For Netty:

<dependency>
<groupId>io.netty</groupId>
<artifactId>netty</artifactId>
<version>LATEST_NETTY_3_VERSION</version>
</dependency>

For Grizzly:

<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>connection-pool</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>
<dependency>
<groupId>org.glassfish.grizzly</groupId>
<artifactId>grizzly-websockets</artifactId>
<version>LATEST_GRIZZLY_VERSION</version>
</dependency>

Check migration guide for migrating from 1.8 to 1.9.

Usage

Then in your code you can simply do

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Response> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute();
Responser = f.get();

Note that in this case all the content must be read fully in memory, even if you used getResponseBodyAsStream() method on returned Response object.

You can also accomplish asynchronous (non-blocking) operation without using a Future if you want to receive and process the response in your handler:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
asyncHttpClient.prepareGet("http://www.ning.com/").execute(newAsyncCompletionHandler<Response>(){
@OverridepublicResponseonCompleted(Responseresponse) throwsException{
// Do something with the Response// ...returnresponse;
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});

(this will also fully read Response in memory before calling onCompleted)

You can also mix Future with AsyncHandler to only retrieve part of the asynchronous response

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientasyncHttpClient = newAsyncHttpClient();
Future<Integer> f = asyncHttpClient.prepareGet("http://www.ning.com/").execute(
newAsyncCompletionHandler<Integer>(){
@OverridepublicIntegeronCompleted(Responseresponse) throwsException{
// Do something with the Responsereturnresponse.getStatusCode();
}
@OverridepublicvoidonThrowable(Throwablet){
// Something wrong happened.
}
});
intstatusCode = f.get();

which is something you want to do for large responses: this way you can process content as soon as it becomes available, piece by piece, without having to buffer it all in memory.

You have full control on the Response life cycle, so you can decide at any moment to stop processing what the server is sending back:

importcom.ning.http.client.*;
importjava.util.concurrent.Future;
AsyncHttpClientc = newAsyncHttpClient();
Future<String> f = c.prepareGet("http://www.ning.com/").execute(newAsyncHandler<String>() {
privateByteArrayOutputStreambytes = newByteArrayOutputStream();
@OverridepublicSTATEonStatusReceived(HttpResponseStatusstatus) throwsException {
intstatusCode = status.getStatusCode();
// The Status have been read// If you don't want to read the headers,body or stop processing the responseif (statusCode >= 500) {
returnSTATE.ABORT;
}
}
@OverridepublicSTATEonHeadersReceived(HttpResponseHeadersh) throwsException {
Headersheaders = h.getHeaders();
// The headers have been read// If you don't want to read the body, or stop processing the responsereturnSTATE.ABORT;
}
@OverridepublicSTATEonBodyPartReceived(HttpResponseBodyPartbodyPart) throwsException {
bytes.write(bodyPart.getBodyPartBytes());
returnSTATE.CONTINUE;
}
@OverridepublicStringonCompleted() throwsException {
// Will be invoked once the response has been fully read or a ResponseComplete exception// has been thrown.// NOTE: should probably use Content-Encoding from headersreturnbytes.toString("UTF-8");
}
@OverridepublicvoidonThrowable(Throwablet) {
}
});
StringbodyResponse = f.get();

Configuration

Finally, you can also configure the AsyncHttpClient via its AsyncHttpClientConfig object:

AsyncHttpClientConfigcf = newAsyncHttpClientConfig.Builder()
S.setProxyServer(newProxyServer("127.0.0.1", 38080)).build();
AsyncHttpClientc = newAsyncHttpClient(cf);

WebSocket

Async Http Client also support WebSocket by simply doing:

WebSocketwebsocket = c.prepareGet(getTargetUrl())
.execute(newWebSocketUpgradeHandler.Builder().addWebSocketListener(
newWebSocketTextListener() {
@OverridepublicvoidonMessage(Stringmessage) {
}
@OverridepublicvoidonOpen(WebSocketwebsocket) {
websocket.sendTextMessage("...").sendMessage("...");
}
@OverridepublicvoidonClose(WebSocketwebsocket) {
latch.countDown();
}
@OverridepublicvoidonError(Throwablet) {
}
}).build()).get();

The library uses Java non blocking I/O for supporting asynchronous operations. The default asynchronous provider is build on top of Netty, but the library exposes a configurable provider SPI which allows to easily plug in other frameworks like Grizzly

AsyncHttpClientConfigconfig = newAsyncHttpClientConfig.Builder().build();
AsyncHttpClientclient = newAsyncHttpClient(newGrizzlyAsyncHttpProvider(config), config);

User Group

Keep up to date on the library development by joining the Asynchronous HTTP Client discussion group

Google Group

Contributing

Of course, Pull Requests are welcome.

Here a the few rules we'd like you to respect if you do so:

  • Only edit the code related to the suggested change, so DON'T automatically format the classes you've edited.
  • Respect the formatting rules:
    • Ident with 4 spaces
    • Use a 140 chars line max length
    • Don't use * imports
    • Stick to the org, com, javax, java imports order
  • Your PR can contain multiple commits when submitting, but once it's been reviewed, we'll ask you to squash them into a single one
  • Regarding licensing:
    • You must be the original author of the code you suggest.
    • If not, you have to prove that the original code was published under Apache License 2 and properly mention original copyrights.

About

Asynchronous Http and WebSocket Client library for Java

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages