Skip to content

Commit dd3c735

Browse files
committed
Add Response.getLocal/RemoteAddress, close AsyncHttpClient#854
1 parent 4cf37a9 commit dd3c735

File tree

13 files changed

+135
-18
lines changed

13 files changed

+135
-18
lines changed

api/src/main/java/org/asynchttpclient/HttpResponseStatus.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.asynchttpclient;
1818

19+
import java.net.SocketAddress;
1920
import java.util.List;
2021

2122
import org.asynchttpclient.uri.Uri;
@@ -44,8 +45,8 @@ public final Uri getUri() {
4445

4546
/**
4647
* Prepare a {@link Response}
47-
*
48-
* @param headers {@link HttpResponseHeaders}
48+
*
49+
* @param headers {@link HttpResponseHeaders}
4950
* @param bodyParts list of {@link HttpResponseBodyPart}
5051
* @param config the client config
5152
* @return a {@link Response}
@@ -93,4 +94,20 @@ public final Uri getUri() {
9394
* @return protocol name + version
9495
*/
9596
public abstract String getProtocolText();
97+
98+
/**
99+
* Get remote address client initiated request to.
100+
*
101+
* @return remote address client initiated request to, may be {@code null}
102+
* if asynchronous provider is unable to provide the remote address
103+
*/
104+
public abstract SocketAddress getRemoteAddress();
105+
106+
/**
107+
* Get local address client initiated request from.
108+
*
109+
* @return local address client initiated request from, may be {@code null}
110+
* if asynchronous provider is unable to provide the local address
111+
*/
112+
public abstract SocketAddress getLocalAddress();
96113
}

api/src/main/java/org/asynchttpclient/Response.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import java.io.IOException;
2323
import java.io.InputStream;
24+
import java.net.SocketAddress;
2425
import java.nio.ByteBuffer;
2526
import java.nio.charset.Charset;
2627
import java.util.ArrayList;
@@ -182,6 +183,22 @@ public interface Response {
182183
*/
183184
boolean hasResponseBody();
184185

186+
/**
187+
* Get remote address client initiated request to.
188+
*
189+
* @return remote address client initiated request to, may be {@code null}
190+
* if asynchronous provider is unable to provide the remote address
191+
*/
192+
SocketAddress getRemoteAddress();
193+
194+
/**
195+
* Get local address client initiated request from.
196+
*
197+
* @return local address client initiated request from, may be {@code null}
198+
* if asynchronous provider is unable to provide the local address
199+
*/
200+
SocketAddress getLocalAddress();
201+
185202
public static class ResponseBuilder {
186203
private final List<HttpResponseBodyPart> bodyParts = new ArrayList<>();
187204
private HttpResponseStatus status;

api/src/main/java/org/asynchttpclient/providers/ResponseBase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.asynchttpclient.uri.Uri;
1212
import org.asynchttpclient.util.AsyncHttpProviderUtils;
1313

14+
import java.net.SocketAddress;
1415
import java.nio.charset.Charset;
1516
import java.util.Collections;
1617
import java.util.List;
@@ -55,6 +56,16 @@ public final Uri getUri() {
5556
return status.getUri();
5657
}
5758

59+
@Override
60+
public SocketAddress getRemoteAddress() {
61+
return status.getRemoteAddress();
62+
}
63+
64+
@Override
65+
public SocketAddress getLocalAddress() {
66+
return status.getLocalAddress();
67+
}
68+
5869
@Override
5970
public final String getContentType() {
6071
return headers != null ? getHeader("Content-Type") : null;

api/src/main/java/org/asynchttpclient/webdav/WebDavCompletionHandlerBase.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.io.IOException;
1717
import java.io.InputStream;
18+
import java.net.SocketAddress;
1819
import java.nio.ByteBuffer;
1920
import java.nio.charset.Charset;
2021
import java.util.ArrayList;
@@ -228,6 +229,16 @@ public boolean hasResponseHeaders() {
228229
public boolean hasResponseBody() {
229230
return wrappedResponse.hasResponseBody();
230231
}
232+
233+
@Override
234+
public SocketAddress getRemoteAddress() {
235+
return wrappedResponse.getRemoteAddress();
236+
}
237+
238+
@Override
239+
public SocketAddress getLocalAddress() {
240+
return wrappedResponse.getLocalAddress();
241+
}
231242
};
232243
}
233244

@@ -260,6 +271,16 @@ public int getProtocolMinorVersion() {
260271
public String getProtocolText() {
261272
return wrapped.getStatusText();
262273
}
274+
275+
@Override
276+
public SocketAddress getRemoteAddress() {
277+
return wrapped.getRemoteAddress();
278+
}
279+
280+
@Override
281+
public SocketAddress getLocalAddress() {
282+
return wrapped.getLocalAddress();
283+
}
263284
}
264285

265286
private Document readXMLResponse(InputStream stream) {

api/src/main/java/org/asynchttpclient/webdav/WebDavResponse.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.io.IOException;
1616
import java.io.InputStream;
17+
import java.net.SocketAddress;
1718
import java.nio.ByteBuffer;
1819
import java.nio.charset.Charset;
1920
import java.util.List;
@@ -114,6 +115,14 @@ public boolean hasResponseBody() {
114115
return response.hasResponseBody();
115116
}
116117

118+
public SocketAddress getRemoteAddress() {
119+
return response.getRemoteAddress();
120+
}
121+
122+
public SocketAddress getLocalAddress() {
123+
return response.getLocalAddress();
124+
}
125+
117126
public Document getBodyAsXML() {
118127
return document;
119128
}

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/handler/HttpProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ private boolean handleHttpResponse(final HttpResponse response,//
430430

431431
future.setKeepAlive(connectionStrategy.keepAlive(httpRequest, response));
432432

433-
NettyResponseStatus status = new NettyResponseStatus(future.getUri(), config, response);
433+
NettyResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
434434
int statusCode = response.getStatus().getCode();
435435
Request request = future.getRequest();
436436
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/handler/WebSocketProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void handle(Channel channel, NettyResponseFuture<?> future, Object e) thr
7474

7575
if (e instanceof HttpResponse) {
7676
HttpResponse response = (HttpResponse) e;
77-
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response);
77+
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
7878
HttpResponseHeaders responseHeaders = new NettyResponseHeaders(response.headers());
7979

8080
if (exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {

providers/netty3/src/main/java/org/asynchttpclient/providers/netty3/response/NettyResponseStatus.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package org.asynchttpclient.providers.netty3.response;
1515

16+
import java.net.SocketAddress;
1617
import java.util.List;
1718

1819
import org.asynchttpclient.AsyncHttpClientConfig;
@@ -21,6 +22,7 @@
2122
import org.asynchttpclient.HttpResponseStatus;
2223
import org.asynchttpclient.Response;
2324
import org.asynchttpclient.uri.Uri;
25+
import org.jboss.netty.channel.Channel;
2426
import org.jboss.netty.handler.codec.http.HttpResponse;
2527

2628
/**
@@ -29,10 +31,19 @@
2931
public class NettyResponseStatus extends HttpResponseStatus {
3032

3133
private final HttpResponse response;
34+
private final SocketAddress remoteAddress;
35+
private final SocketAddress localAddress;
3236

33-
public NettyResponseStatus(Uri uri, AsyncHttpClientConfig config, HttpResponse response) {
37+
public NettyResponseStatus(Uri uri, AsyncHttpClientConfig config, HttpResponse response, Channel channel) {
3438
super(uri, config);
3539
this.response = response;
40+
if (channel != null) {
41+
remoteAddress = channel.getRemoteAddress();
42+
localAddress = channel.getLocalAddress();
43+
} else {
44+
remoteAddress = null;
45+
localAddress = null;
46+
}
3647
}
3748

3849
/**
@@ -77,4 +88,14 @@ public String getProtocolText() {
7788
public Response prepareResponse(HttpResponseHeaders headers, List<HttpResponseBodyPart> bodyParts) {
7889
return new NettyResponse(this, headers, bodyParts);
7990
}
91+
92+
@Override
93+
public SocketAddress getRemoteAddress() {
94+
return remoteAddress;
95+
}
96+
97+
@Override
98+
public SocketAddress getLocalAddress() {
99+
return localAddress;
100+
}
80101
}

providers/netty3/src/test/java/org/asynchttpclient/providers/netty3/NettyAsyncResponseTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void testCookieParseExpires() {
4242
Date date = new Date(System.currentTimeMillis() + 60000);
4343
final String cookieDef = String.format("efmembercheck=true; expires=%s; path=/; domain=.eclipse.org", sdf.format(date));
4444

45-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
45+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
4646
@Override
4747
public FluentCaseInsensitiveStringsMap getHeaders() {
4848
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);
@@ -60,7 +60,7 @@ public FluentCaseInsensitiveStringsMap getHeaders() {
6060
@Test(groups = "standalone")
6161
public void testCookieParseMaxAge() {
6262
final String cookieDef = "efmembercheck=true; max-age=60; path=/; domain=.eclipse.org";
63-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
63+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
6464
@Override
6565
public FluentCaseInsensitiveStringsMap getHeaders() {
6666
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);
@@ -76,7 +76,7 @@ public FluentCaseInsensitiveStringsMap getHeaders() {
7676
@Test(groups = "standalone")
7777
public void testCookieParseWeirdExpiresValue() {
7878
final String cookieDef = "efmembercheck=true; expires=60; path=/; domain=.eclipse.org";
79-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
79+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
8080
@Override
8181
public FluentCaseInsensitiveStringsMap getHeaders() {
8282
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/handler/HttpProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ private boolean handleHttpResponse(final HttpResponse response, final Channel ch
424424

425425
future.setKeepAlive(connectionStrategy.keepAlive(httpRequest, response));
426426

427-
NettyResponseStatus status = new NettyResponseStatus(future.getUri(), config, response);
427+
NettyResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
428428
int statusCode = response.getStatus().code();
429429
Request request = future.getRequest();
430430
Realm realm = request.getRealm() != null ? request.getRealm() : config.getRealm();

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/handler/WebSocketProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void call() throws Exception {
8484
WebSocketUpgradeHandler handler = WebSocketUpgradeHandler.class.cast(future.getAsyncHandler());
8585
Request request = future.getRequest();
8686

87-
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response);
87+
HttpResponseStatus status = new NettyResponseStatus(future.getUri(), config, response, channel);
8888
HttpResponseHeaders responseHeaders = new NettyResponseHeaders(response.headers());
8989

9090
if (exitAfterProcessingFilters(channel, future, handler, status, responseHeaders)) {

providers/netty4/src/main/java/org/asynchttpclient/providers/netty4/response/NettyResponseStatus.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,38 @@
1313
*/
1414
package org.asynchttpclient.providers.netty4.response;
1515

16+
import io.netty.channel.Channel;
17+
import io.netty.handler.codec.http.HttpResponse;
18+
19+
import java.net.SocketAddress;
20+
import java.util.List;
21+
1622
import org.asynchttpclient.AsyncHttpClientConfig;
1723
import org.asynchttpclient.HttpResponseBodyPart;
1824
import org.asynchttpclient.HttpResponseHeaders;
1925
import org.asynchttpclient.HttpResponseStatus;
2026
import org.asynchttpclient.Response;
2127
import org.asynchttpclient.uri.Uri;
2228

23-
import io.netty.handler.codec.http.HttpResponse;
24-
25-
import java.util.List;
26-
2729
/**
2830
* A class that represent the HTTP response' status line (code + text)
2931
*/
3032
public class NettyResponseStatus extends HttpResponseStatus {
3133

3234
private final HttpResponse response;
35+
private final SocketAddress remoteAddress;
36+
private final SocketAddress localAddress;
3337

34-
public NettyResponseStatus(Uri uri, AsyncHttpClientConfig config, HttpResponse response) {
38+
public NettyResponseStatus(Uri uri, AsyncHttpClientConfig config, HttpResponse response, Channel channel) {
3539
super(uri, config);
3640
this.response = response;
41+
if (channel != null) {
42+
remoteAddress = channel.remoteAddress();
43+
localAddress = channel.localAddress();
44+
} else {
45+
remoteAddress = null;
46+
localAddress = null;
47+
}
3748
}
3849

3950
@Override
@@ -78,4 +89,14 @@ public int getProtocolMinorVersion() {
7889
public String getProtocolText() {
7990
return response.getProtocolVersion().text();
8091
}
92+
93+
@Override
94+
public SocketAddress getRemoteAddress() {
95+
return remoteAddress;
96+
}
97+
98+
@Override
99+
public SocketAddress getLocalAddress() {
100+
return localAddress;
101+
}
81102
}

providers/netty4/src/test/java/org/asynchttpclient/providers/netty4/NettyAsyncResponseTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void testCookieParseExpires() {
4242
Date date = new Date(System.currentTimeMillis() + 60000);
4343
final String cookieDef = String.format("efmembercheck=true; expires=%s; path=/; domain=.eclipse.org", sdf.format(date));
4444

45-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
45+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
4646
@Override
4747
public FluentCaseInsensitiveStringsMap getHeaders() {
4848
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);
@@ -60,7 +60,7 @@ public FluentCaseInsensitiveStringsMap getHeaders() {
6060
@Test(groups = "standalone")
6161
public void testCookieParseMaxAge() {
6262
final String cookieDef = "efmembercheck=true; max-age=60; path=/; domain=.eclipse.org";
63-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
63+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
6464
@Override
6565
public FluentCaseInsensitiveStringsMap getHeaders() {
6666
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);
@@ -76,7 +76,7 @@ public FluentCaseInsensitiveStringsMap getHeaders() {
7676
@Test(groups = "standalone")
7777
public void testCookieParseWeirdExpiresValue() {
7878
final String cookieDef = "efmembercheck=true; expires=60; path=/; domain=.eclipse.org";
79-
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null), new HttpResponseHeaders() {
79+
NettyResponse response = new NettyResponse(new NettyResponseStatus(null, null, null, null), new HttpResponseHeaders() {
8080
@Override
8181
public FluentCaseInsensitiveStringsMap getHeaders() {
8282
return new FluentCaseInsensitiveStringsMap().add("Set-Cookie", cookieDef);

0 commit comments

Comments
 (0)