Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit c481b53

Browse files
author
Marek Potociar
committed
Implemented JERSEY-2530.
- Added support for proxy in Grizzly async client connector. Change-Id: I946e16c4393040359417e3e64602c24080762e0d Signed-off-by: Marek Potociar <[email protected]>
1 parent f076822 commit c481b53

File tree

3 files changed

+71
-6
lines changed

3 files changed

+71
-6
lines changed

connectors/grizzly-connector/src/main/java/org/glassfish/jersey/grizzly/connector/GrizzlyConnector.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import java.net.URI;
4646
import java.util.List;
4747
import java.util.Map;
48+
import java.util.Properties;
4849
import java.util.concurrent.ExecutionException;
4950
import java.util.concurrent.ExecutorService;
5051
import java.util.concurrent.Executors;
@@ -78,10 +79,12 @@
7879
import com.ning.http.client.HttpResponseBodyPart;
7980
import com.ning.http.client.HttpResponseHeaders;
8081
import com.ning.http.client.HttpResponseStatus;
82+
import com.ning.http.client.ProxyServerSelector;
8183
import com.ning.http.client.Request;
8284
import com.ning.http.client.RequestBuilder;
8385
import com.ning.http.client.providers.grizzly.FeedableBodyGenerator;
8486
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
87+
import com.ning.http.util.ProxyUtils;
8588

8689
import jersey.repackaged.com.google.common.util.concurrent.SettableFuture;
8790

@@ -121,6 +124,30 @@ class GrizzlyConnector implements Connector {
121124

122125
builder.setRequestTimeoutInMs(ClientProperties.getValue(config.getProperties(),
123126
ClientProperties.READ_TIMEOUT, 0));
127+
128+
Object proxyUri;
129+
proxyUri = config.getProperty(ClientProperties.PROXY_URI);
130+
if (proxyUri != null) {
131+
final URI u = getProxyUri(proxyUri);
132+
final Properties proxyProperties = new Properties();
133+
proxyProperties.setProperty(ProxyUtils.PROXY_PROTOCOL, u.getScheme());
134+
proxyProperties.setProperty(ProxyUtils.PROXY_HOST, u.getHost());
135+
proxyProperties.setProperty(ProxyUtils.PROXY_PORT, String.valueOf(u.getPort()));
136+
137+
final String userName = ClientProperties.getValue(
138+
config.getProperties(), ClientProperties.PROXY_USERNAME, String.class);
139+
if (userName != null) {
140+
proxyProperties.setProperty(ProxyUtils.PROXY_USER, userName);
141+
142+
final String password = ClientProperties.getValue(
143+
config.getProperties(), ClientProperties.PROXY_PASSWORD, String.class);
144+
if (password != null) {
145+
proxyProperties.setProperty(ProxyUtils.PROXY_PASSWORD, password);
146+
}
147+
}
148+
ProxyServerSelector proxyServerSelector = ProxyUtils.createProxyServerSelector(proxyProperties);
149+
builder.setProxyServerSelector(proxyServerSelector);
150+
}
124151
} else {
125152
executorService = Executors.newCachedThreadPool();
126153
builder.setExecutorService(executorService);
@@ -133,11 +160,23 @@ class GrizzlyConnector implements Connector {
133160
if (client.getHostnameVerifier() != null) {
134161
builder.setHostnameVerifier(client.getHostnameVerifier());
135162
}
163+
136164
AsyncHttpClientConfig asyncClientConfig = builder.build();
137165

138166
this.grizzlyClient = new AsyncHttpClient(new GrizzlyAsyncHttpProvider(asyncClientConfig), asyncClientConfig);
139167
}
140168

169+
@SuppressWarnings("ChainOfInstanceofChecks")
170+
private static URI getProxyUri(final Object proxy) {
171+
if (proxy instanceof URI) {
172+
return (URI) proxy;
173+
} else if (proxy instanceof String) {
174+
return URI.create((String) proxy);
175+
} else {
176+
throw new ProcessingException(LocalizationMessages.WRONG_PROXY_URI_TYPE(ClientProperties.PROXY_URI));
177+
}
178+
}
179+
141180
/**
142181
* Get the underlying Grizzly {@link com.ning.http.client.AsyncHttpClient} instance.
143182
*
@@ -339,7 +378,7 @@ private com.ning.http.client.Request translate(final ClientRequest requestContex
339378
builder = builder.setBody(entityBytes);
340379
} else if (entityProcessing == RequestEntityProcessing.CHUNKED) {
341380
final FeedableBodyGenerator bodyGenerator = new FeedableBodyGenerator();
342-
final Integer chunkSize = requestContext.resolveProperty(ClientProperties.CHUNKED_ENCODING_SIZE, Integer.valueOf(0));
381+
final Integer chunkSize = requestContext.resolveProperty(ClientProperties.CHUNKED_ENCODING_SIZE, 0);
343382
if (chunkSize > 0) {
344383
bodyGenerator.setMaxPendingBytes(chunkSize);
345384
}

connectors/grizzly-connector/src/main/java/org/glassfish/jersey/grizzly/connector/GrizzlyConnectorProvider.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,37 @@
5050
import com.ning.http.client.AsyncHttpClient;
5151

5252
/**
53-
* Connector provider for Grizzly asynchronous HTTP client-based connectors.
53+
* Connector provider for Jersey {@link Connector connectors} that utilize
54+
* Grizzly Asynchronous HTTP Client to send and receive HTTP request and responses.
5455
* <p>
55-
* Connectors created by this provider use {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED
56-
* chunked encoding} as a default setting. This can be overridden by setting the
57-
* {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING} property.
56+
* The following connector configuration properties are supported:
57+
* <ul>
58+
* <li>{@link org.glassfish.jersey.client.ClientProperties#CONNECT_TIMEOUT}</li>
59+
* <li>{@link org.glassfish.jersey.client.ClientProperties#READ_TIMEOUT}</li>
60+
* <li>{@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}
61+
* - default value is {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED}</li>
62+
* <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_URI}</li>
63+
* <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_USERNAME}</li>
64+
* <li>{@link org.glassfish.jersey.client.ClientProperties#PROXY_PASSWORD}</li>
65+
* </ul>
5866
* </p>
67+
* <p>
68+
* Connector instances created via this connector provider use
69+
* {@link org.glassfish.jersey.client.RequestEntityProcessing#CHUNKED chunked encoding} as a default setting.
70+
* This can be overridden by the {@link org.glassfish.jersey.client.ClientProperties#REQUEST_ENTITY_PROCESSING}.
71+
* </p>
72+
* <p>
73+
* If a {@link org.glassfish.jersey.client.ClientResponse} is obtained and an entity is not read from the response then
74+
* {@link org.glassfish.jersey.client.ClientResponse#close()} MUST be called after processing the response to release
75+
* connection-based resources.
76+
* </p>
77+
* <p>
78+
* If a response entity is obtained that is an instance of {@link java.io.Closeable} then the instance MUST
79+
* be closed after processing the entity to release connection-based resources.
80+
* <p/>
81+
* <p>
82+
* The following methods are currently supported: HEAD, GET, POST, PUT, DELETE, OPTIONS, PATCH and TRACE.
83+
* <p/>
5984
*
6085
* @author Marek Potociar (marek.potociar at oracle.com)
6186
* @since 2.5

connectors/grizzly-connector/src/main/resources/org/glassfish/jersey/grizzly/connector/localization.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@
3939
#
4040

4141
error.buffering.entity=Error buffering the entity.
42-
invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
4342
expected.connector.provider.not.used=The supplied component is not configured to use a GrizzlyConnectorProvider.
43+
invalid.configurable.component.type=The supplied component "{0}" is not assignable from JerseyClient or JerseyWebTarget.
44+
wrong.proxy.uri.type=The proxy URI ("{0}") property MUST be an instance of String or URI.

0 commit comments

Comments
 (0)