Skip to content

Commit e2c15f8

Browse files
committed
Don't send "Connection: close" on HTTP/1.0, close AsyncHttpClient#910
1 parent b8175e6 commit e2c15f8

File tree

4 files changed

+27
-21
lines changed

4 files changed

+27
-21
lines changed

api/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactoryBase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,4 +172,13 @@ protected String systematicAuthorizationHeader(Request request, Uri uri, Realm r
172172

173173
return authorizationHeader;
174174
}
175+
176+
protected String connectionHeader(boolean allowConnectionPooling, boolean http11) {
177+
if (allowConnectionPooling)
178+
return "keep-alive";
179+
else if (http11)
180+
return "close";
181+
else
182+
return null;
183+
}
175184
}

api/src/main/java/org/asynchttpclient/util/AsyncHttpProviderUtils.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ public class AsyncHttpProviderUtils {
3737

3838
public static final void validateSupportedScheme(Uri uri) {
3939
final String scheme = uri.getScheme();
40-
if (scheme == null || !scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https") && !scheme.equalsIgnoreCase("ws")
41-
&& !scheme.equalsIgnoreCase("wss")) {
42-
throw new IllegalArgumentException("The URI scheme, of the URI " + uri
43-
+ ", must be equal (ignoring case) to 'http', 'https', 'ws', or 'wss'");
40+
if (scheme == null || !scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https") && !scheme.equalsIgnoreCase("ws") && !scheme.equalsIgnoreCase("wss")) {
41+
throw new IllegalArgumentException("The URI scheme, of the URI " + uri + ", must be equal (ignoring case) to 'http', 'https', 'ws', or 'wss'");
4442
}
4543
}
4644

@@ -49,14 +47,12 @@ public final static String getBaseUrl(Uri uri) {
4947
}
5048

5149
public final static String getAuthority(Uri uri) {
52-
int port = uri.getPort() != -1? uri.getPort() : getDefaultPort(uri);
50+
int port = uri.getPort() != -1 ? uri.getPort() : getDefaultPort(uri);
5351
return uri.getHost() + ":" + port;
5452
}
5553

5654
public final static boolean isSameHostAndProtocol(Uri uri1, Uri uri2) {
57-
return uri1.getScheme().equals(uri2.getScheme())
58-
&& uri1.getHost().equals(uri2.getHost())
59-
&& getDefaultPort(uri1) == getDefaultPort(uri2);
55+
return uri1.getScheme().equals(uri2.getScheme()) && uri1.getHost().equals(uri2.getHost()) && getDefaultPort(uri1) == getDefaultPort(uri2);
6056
}
6157

6258
public static final int getSchemeDefaultPort(String scheme) {
@@ -98,16 +94,12 @@ public static Charset parseCharset(String contentType) {
9894
return null;
9995
}
10096

101-
public static String keepAliveHeaderValue(AsyncHttpClientConfig config) {
102-
return config.isAllowPoolingConnections() ? "keep-alive" : "close";
103-
}
104-
10597
public static int requestTimeout(AsyncHttpClientConfig config, Request request) {
10698
return request.getRequestTimeout() != 0 ? request.getRequestTimeout() : config.getRequestTimeout();
10799
}
108100

109101
public static boolean followRedirect(AsyncHttpClientConfig config, Request request) {
110-
return request.getFollowRedirect() != null? request.getFollowRedirect().booleanValue() : config.isFollowRedirect();
102+
return request.getFollowRedirect() != null ? request.getFollowRedirect().booleanValue() : config.isFollowRedirect();
111103
}
112104

113105
private static StringBuilder urlEncodeFormParams0(List<Param> params) {
@@ -118,7 +110,7 @@ private static StringBuilder urlEncodeFormParams0(List<Param> params) {
118110
sb.setLength(sb.length() - 1);
119111
return sb;
120112
}
121-
113+
122114
public static ByteBuffer urlEncodeFormParams(List<Param> params, Charset charset) {
123115
return StringUtils.charSequence2ByteBuffer(urlEncodeFormParams0(params), charset);
124116
}
@@ -131,7 +123,7 @@ private static void encodeAndAppendFormParam(final StringBuilder sb, final CharS
131123
}
132124
sb.append('&');
133125
}
134-
126+
135127
public static String hostHeader(Request request, Uri uri) {
136128
String virtualHost = request.getVirtualHost();
137129
if (virtualHost != null)

providers/netty3/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java

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

1616
import static org.asynchttpclient.util.AsyncHttpProviderUtils.DEFAULT_CHARSET;
1717
import static org.asynchttpclient.util.AsyncHttpProviderUtils.hostHeader;
18-
import static org.asynchttpclient.util.AsyncHttpProviderUtils.keepAliveHeaderValue;
1918
import static org.asynchttpclient.util.AsyncHttpProviderUtils.urlEncodeFormParams;
2019
import static org.asynchttpclient.util.HttpUtils.isSecure;
2120
import static org.asynchttpclient.util.HttpUtils.isWebSocket;
@@ -44,6 +43,7 @@
4443
import org.asynchttpclient.request.body.generator.FileBodyGenerator;
4544
import org.asynchttpclient.request.body.generator.InputStreamBodyGenerator;
4645
import org.asynchttpclient.uri.Uri;
46+
import org.asynchttpclient.util.HttpUtils;
4747
import org.asynchttpclient.util.StringUtils;
4848
import org.jboss.netty.buffer.ChannelBuffer;
4949
import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
@@ -127,8 +127,10 @@ public NettyRequest newNettyRequest(Request request, Uri uri, boolean forceConne
127127

128128
HttpMethod method = forceConnect ? HttpMethod.CONNECT : HttpMethod.valueOf(request.getMethod());
129129
boolean connect = method == HttpMethod.CONNECT;
130-
131-
HttpVersion httpVersion = connect && proxyServer.isForceHttp10() ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1;
130+
131+
boolean allowConnectionPooling = config.isAllowPoolingConnections() && (!HttpUtils.isSecure(uri) || config.isAllowPoolingSslConnections());
132+
133+
HttpVersion httpVersion = !allowConnectionPooling || (connect && proxyServer.isForceHttp10()) ? HttpVersion.HTTP_1_0 : HttpVersion.HTTP_1_1;
132134
String requestUri = requestUri(uri, proxyServer, connect);
133135

134136
NettyBody body = body(request, connect);
@@ -183,7 +185,9 @@ public NettyRequest newNettyRequest(Request request, Uri uri, boolean forceConne
183185
.set(HttpHeaders.Names.SEC_WEBSOCKET_VERSION, "13");
184186

185187
} else if (!headers.contains(HttpHeaders.Names.CONNECTION)) {
186-
headers.set(HttpHeaders.Names.CONNECTION, keepAliveHeaderValue(config));
188+
String connectionHeaderValue = connectionHeader(allowConnectionPooling, httpVersion == HttpVersion.HTTP_1_1);
189+
if (connectionHeaderValue != null)
190+
headers.set(HttpHeaders.Names.CONNECTION, connectionHeaderValue);
187191
}
188192

189193
if (!headers.contains(HttpHeaders.Names.HOST))

providers/netty4/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java

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

1616
import static org.asynchttpclient.util.AsyncHttpProviderUtils.DEFAULT_CHARSET;
1717
import static org.asynchttpclient.util.AsyncHttpProviderUtils.hostHeader;
18-
import static org.asynchttpclient.util.AsyncHttpProviderUtils.keepAliveHeaderValue;
1918
import static org.asynchttpclient.util.AsyncHttpProviderUtils.urlEncodeFormParams;
2019
import static org.asynchttpclient.util.HttpUtils.isSecure;
2120
import static org.asynchttpclient.util.HttpUtils.isWebSocket;
@@ -187,7 +186,9 @@ public NettyRequest newNettyRequest(Request request, Uri uri, boolean forceConne
187186
.set(HttpHeaders.Names.SEC_WEBSOCKET_VERSION, "13");
188187

189188
} else if (!headers.contains(HttpHeaders.Names.CONNECTION)) {
190-
headers.set(HttpHeaders.Names.CONNECTION, keepAliveHeaderValue(config));
189+
String connectionHeaderValue = connectionHeader(allowConnectionPooling, httpVersion == HttpVersion.HTTP_1_1);
190+
if (connectionHeaderValue != null)
191+
headers.set(HttpHeaders.Names.CONNECTION, connectionHeaderValue);
191192
}
192193

193194
if (!headers.contains(HttpHeaders.Names.HOST))

0 commit comments

Comments
 (0)