7199862: Make sure that a connection is still alive when retrieved from KeepAliveCache in certain cases
Reviewed-by: chegar
--- a/jdk/src/share/classes/sun/net/www/http/HttpClient.java Thu Sep 27 17:55:10 2012 +0100
+++ b/jdk/src/share/classes/sun/net/www/http/HttpClient.java Thu Sep 27 22:35:07 2012 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -244,16 +244,17 @@
*/
public static HttpClient New(URL url)
throws IOException {
- return HttpClient.New(url, Proxy.NO_PROXY, -1, true);
+ return HttpClient.New(url, Proxy.NO_PROXY, -1, true, null);
}
public static HttpClient New(URL url, boolean useCache)
throws IOException {
- return HttpClient.New(url, Proxy.NO_PROXY, -1, useCache);
+ return HttpClient.New(url, Proxy.NO_PROXY, -1, useCache, null);
}
- public static HttpClient New(URL url, Proxy p, int to, boolean useCache)
- throws IOException {
+ public static HttpClient New(URL url, Proxy p, int to, boolean useCache,
+ HttpURLConnection httpuc) throws IOException
+ {
if (p == null) {
p = Proxy.NO_PROXY;
}
@@ -261,6 +262,13 @@
/* see if one's already around */
if (useCache) {
ret = kac.get(url, null);
+ if (ret != null && httpuc != null &&
+ httpuc.streaming() &&
+ httpuc.getRequestMethod() == "POST") {
+ if (!ret.available())
+ ret = null;
+ }
+
if (ret != null) {
if ((ret.proxy != null && ret.proxy.equals(p)) ||
(ret.proxy == null && p == null)) {
@@ -302,20 +310,25 @@
return ret;
}
- public static HttpClient New(URL url, Proxy p, int to) throws IOException {
- return New(url, p, to, true);
+ public static HttpClient New(URL url, Proxy p, int to,
+ HttpURLConnection httpuc) throws IOException
+ {
+ return New(url, p, to, true, httpuc);
}
public static HttpClient New(URL url, String proxyHost, int proxyPort,
boolean useCache)
throws IOException {
- return New(url, newHttpProxy(proxyHost, proxyPort, "http"), -1, useCache);
+ return New(url, newHttpProxy(proxyHost, proxyPort, "http"),
+ -1, useCache, null);
}
public static HttpClient New(URL url, String proxyHost, int proxyPort,
- boolean useCache, int to)
+ boolean useCache, int to,
+ HttpURLConnection httpuc)
throws IOException {
- return New(url, newHttpProxy(proxyHost, proxyPort, "http"), to, useCache);
+ return New(url, newHttpProxy(proxyHost, proxyPort, "http"),
+ to, useCache, httpuc);
}
/* return it to the cache as still usable, if:
@@ -344,6 +357,34 @@
}
}
+ protected synchronized boolean available() throws IOException {
+ boolean available = true;
+ int old = serverSocket.getSoTimeout();
+ serverSocket.setSoTimeout(1);
+ BufferedInputStream tmpbuf =
+ new BufferedInputStream(serverSocket.getInputStream());
+
+ PlatformLogger logger = HttpURLConnection.getHttpLogger();
+ try {
+ int r = tmpbuf.read();
+ if (r == -1) {
+ if (logger.isLoggable(PlatformLogger.FINEST)) {
+ logger.finest("HttpClient.available(): " +
+ "read returned -1: not available");
+ }
+ available = false;
+ }
+ } catch (SocketTimeoutException e) {
+ if (logger.isLoggable(PlatformLogger.FINEST)) {
+ logger.finest("HttpClient.available(): " +
+ "SocketTimeout: its available");
+ }
+ } finally {
+ serverSocket.setSoTimeout(old);
+ }
+ return available;
+ }
+
protected synchronized void putInKeepAliveCache() {
if (inCache) {
assert false : "Duplicate put to keep alive cache";
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu Sep 27 17:55:10 2012 +0100
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu Sep 27 22:35:07 2012 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -662,7 +662,7 @@
*/
protected void setNewClient (URL url, boolean useCache)
throws IOException {
- http = HttpClient.New(url, null, -1, useCache, connectTimeout);
+ http = HttpClient.New(url, null, -1, useCache, connectTimeout, this);
http.setReadTimeout(readTimeout);
}
@@ -703,7 +703,8 @@
String proxyHost, int proxyPort,
boolean useCache)
throws IOException {
- http = HttpClient.New (url, proxyHost, proxyPort, useCache, connectTimeout);
+ http = HttpClient.New (url, proxyHost, proxyPort, useCache,
+ connectTimeout, this);
http.setReadTimeout(readTimeout);
}
@@ -994,14 +995,14 @@
// subclass HttpsClient will overwrite & return an instance of HttpsClient
protected HttpClient getNewHttpClient(URL url, Proxy p, int connectTimeout)
throws IOException {
- return HttpClient.New(url, p, connectTimeout);
+ return HttpClient.New(url, p, connectTimeout, this);
}
// subclass HttpsClient will overwrite & return an instance of HttpsClient
protected HttpClient getNewHttpClient(URL url, Proxy p,
int connectTimeout, boolean useCache)
throws IOException {
- return HttpClient.New(url, p, connectTimeout, useCache);
+ return HttpClient.New(url, p, connectTimeout, useCache, this);
}
private void expect100Continue() throws IOException {
@@ -1144,7 +1145,7 @@
}
}
- private boolean streaming () {
+ public boolean streaming () {
return (fixedContentLength != -1) || (fixedContentLengthLong != -1) ||
(chunkLength != -1);
}