summaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2016-09-30 16:24:48 +0000
committerAndrew Haley <aph@gcc.gnu.org>2016-09-30 16:24:48 +0000
commit07b78716af6a9d7c9fd1e94d9baf94a52c873947 (patch)
tree3f22b3241c513ad168c8353805614ae1249410f4 /libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
parenteae993948bae8b788c53772bcb9217c063716f93 (diff)
Makefile.def: Remove libjava.
2016-09-30 Andrew Haley <aph@redhat.com> * Makefile.def: Remove libjava. * Makefile.tpl: Likewise. * Makefile.in: Regenerate. * configure.ac: Likewise. * configure: Likewise. * gcc/java: Remove. * libjava: Likewise. From-SVN: r240662
Diffstat (limited to 'libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java')
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java897
1 files changed, 0 insertions, 897 deletions
diff --git a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java b/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
deleted file mode 100644
index b96bf4c547c..00000000000
--- a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
+++ /dev/null
@@ -1,897 +0,0 @@
-/* HTTPConnection.java --
- Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.net.protocol.http;
-
-import gnu.classpath.SystemProperties;
-
-import gnu.java.lang.CPStringBuilder;
-import gnu.java.net.EmptyX509TrustManager;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.security.GeneralSecurityException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import javax.net.ssl.HandshakeCompletedListener;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-
-/**
- * A connection to an HTTP server.
- *
- * @author Chris Burdess (dog@gnu.org)
- */
-public class HTTPConnection
-{
-
- /**
- * The default HTTP port.
- */
- public static final int HTTP_PORT = 80;
-
- /**
- * The default HTTPS port.
- */
- public static final int HTTPS_PORT = 443;
-
- private static final String userAgent = SystemProperties.getProperty("http.agent");
-
- /**
- * The host name of the server to connect to.
- */
- protected final String hostname;
-
- /**
- * The port to connect to.
- */
- protected final int port;
-
- /**
- * Whether the connection should use transport level security (HTTPS).
- */
- protected final boolean secure;
-
- /**
- * The connection timeout for connecting the underlying socket.
- */
- protected final int connectionTimeout;
-
- /**
- * The read timeout for reads on the underlying socket.
- */
- protected final int timeout;
-
- /**
- * The host name of the proxy to connect to.
- */
- protected String proxyHostname;
-
- /**
- * The port on the proxy to connect to.
- */
- protected int proxyPort;
-
- /**
- * The major version of HTTP supported by this client.
- */
- protected int majorVersion;
-
- /**
- * The minor version of HTTP supported by this client.
- */
- protected int minorVersion;
-
- private final List<HandshakeCompletedListener> handshakeCompletedListeners;
-
- /**
- * The socket this connection communicates on.
- */
- protected Socket socket;
-
- /**
- * The SSL socket factory to use.
- */
- private SSLSocketFactory sslSocketFactory;
-
- /**
- * The socket input stream.
- */
- protected InputStream in;
-
- /**
- * The socket output stream.
- */
- protected OutputStream out;
-
- /**
- * Nonce values seen by this connection.
- */
- private Map<String, Integer> nonceCounts;
-
- /**
- * The cookie manager for this connection.
- */
- protected CookieManager cookieManager;
-
-
- /**
- * The pool that this connection is a member of (if any).
- */
- private Pool pool;
-
- /**
- * Creates a new HTTP connection.
- * @param hostname the name of the host to connect to
- */
- public HTTPConnection(String hostname)
- {
- this(hostname, HTTP_PORT, false, 0, 0);
- }
-
- /**
- * Creates a new HTTP or HTTPS connection.
- * @param hostname the name of the host to connect to
- * @param secure whether to use a secure connection
- */
- public HTTPConnection(String hostname, boolean secure)
- {
- this(hostname, secure ? HTTPS_PORT : HTTP_PORT, secure, 0, 0);
- }
-
- /**
- * Creates a new HTTP or HTTPS connection on the specified port.
- * @param hostname the name of the host to connect to
- * @param secure whether to use a secure connection
- * @param connectionTimeout the connection timeout
- * @param timeout the socket read timeout
- */
- public HTTPConnection(String hostname, boolean secure,
- int connectionTimeout, int timeout)
- {
- this(hostname, secure ? HTTPS_PORT : HTTP_PORT, secure,
- connectionTimeout, timeout);
- }
-
- /**
- * Creates a new HTTP connection on the specified port.
- * @param hostname the name of the host to connect to
- * @param port the port on the host to connect to
- */
- public HTTPConnection(String hostname, int port)
- {
- this(hostname, port, false, 0, 0);
- }
-
- /**
- * Creates a new HTTP or HTTPS connection on the specified port.
- * @param hostname the name of the host to connect to
- * @param port the port on the host to connect to
- * @param secure whether to use a secure connection
- */
- public HTTPConnection(String hostname, int port, boolean secure)
- {
- this(hostname, port, secure, 0, 0);
- }
-
- /**
- * Creates a new HTTP or HTTPS connection on the specified port.
- * @param hostname the name of the host to connect to
- * @param port the port on the host to connect to
- * @param secure whether to use a secure connection
- * @param connectionTimeout the connection timeout
- * @param timeout the socket read timeout
- *
- * @throws IllegalArgumentException if either connectionTimeout or
- * timeout less than zero.
- */
- public HTTPConnection(String hostname, int port, boolean secure,
- int connectionTimeout, int timeout)
- {
- if (connectionTimeout < 0 || timeout < 0)
- throw new IllegalArgumentException();
-
- this.hostname = hostname;
- this.port = port;
- this.secure = secure;
- this.connectionTimeout = connectionTimeout;
- this.timeout = timeout;
- majorVersion = minorVersion = 1;
- handshakeCompletedListeners
- = new ArrayList<HandshakeCompletedListener>(2);
- }
-
- /**
- * Returns the name of the host to connect to.
- */
- public String getHostName()
- {
- return hostname;
- }
-
- /**
- * Returns the port on the host to connect to.
- */
- public int getPort()
- {
- return port;
- }
-
- /**
- * Indicates whether to use a secure connection or not.
- */
- public boolean isSecure()
- {
- return secure;
- }
-
- /**
- * Returns the HTTP version string supported by this connection.
- * @see #majorVersion
- * @see #minorVersion
- */
- public String getVersion()
- {
- return "HTTP/" + majorVersion + '.' + minorVersion;
- }
-
- /**
- * Sets the HTTP version supported by this connection.
- * @param majorVersion the major version
- * @param minorVersion the minor version
- */
- public void setVersion(int majorVersion, int minorVersion)
- {
- if (majorVersion != 1)
- {
- throw new IllegalArgumentException("major version not supported: " +
- majorVersion);
- }
- if (minorVersion < 0 || minorVersion > 1)
- {
- throw new IllegalArgumentException("minor version not supported: " +
- minorVersion);
- }
- this.majorVersion = majorVersion;
- this.minorVersion = minorVersion;
- }
-
- /**
- * Directs this connection to use the specified proxy.
- * @param hostname the proxy host name
- * @param port the port on the proxy to connect to
- */
- public void setProxy(String hostname, int port)
- {
- proxyHostname = hostname;
- proxyPort = port;
- }
-
- /**
- * Indicates whether this connection is using an HTTP proxy.
- */
- public boolean isUsingProxy()
- {
- return (proxyHostname != null && proxyPort > 0);
- }
-
- /**
- * Sets the cookie manager to use for this connection.
- * @param cookieManager the cookie manager
- */
- public void setCookieManager(CookieManager cookieManager)
- {
- this.cookieManager = cookieManager;
- }
-
- /**
- * Returns the cookie manager in use for this connection.
- */
- public CookieManager getCookieManager()
- {
- return cookieManager;
- }
-
- /**
- * Manages a pool of HTTPConections. The pool will have a maximum
- * size determined by the value of the maxConn parameter passed to
- * the {@link #get} method. This value inevitably comes from the
- * http.maxConnections system property. If the
- * classpath.net.http.keepAliveTTL system property is set, that will
- * be the maximum time (in seconds) that an idle connection will be
- * maintained.
- */
- static class Pool
- {
- /**
- * Singleton instance of the pool.
- */
- static Pool instance = new Pool();
-
- /**
- * The pool
- */
- final LinkedList<HTTPConnection> connectionPool
- = new LinkedList<HTTPConnection>();
-
- /**
- * Maximum size of the pool.
- */
- int maxConnections;
-
- /**
- * If greater than zero, the maximum time a connection will remain
- * int the pool.
- */
- int connectionTTL;
-
- /**
- * A thread that removes connections older than connectionTTL.
- */
- class Reaper
- implements Runnable
- {
- public void run()
- {
- synchronized (Pool.this)
- {
- try
- {
- do
- {
- while (connectionPool.size() > 0)
- {
- long currentTime = System.currentTimeMillis();
-
- HTTPConnection c =
- (HTTPConnection)connectionPool.getFirst();
-
- long waitTime = c.timeLastUsed
- + connectionTTL - currentTime;
-
- if (waitTime <= 0)
- removeOldest();
- else
- try
- {
- Pool.this.wait(waitTime);
- }
- catch (InterruptedException _)
- {
- // Ignore the interrupt.
- }
- }
- // After the pool is empty, wait TTL to see if it
- // is used again. This is because in the
- // situation where a single thread is making HTTP
- // requests to the same server it can remove the
- // connection from the pool before the Reaper has
- // a chance to start. This would cause the Reaper
- // to exit if it were not for this extra delay.
- // The result would be starting a Reaper thread
- // for each HTTP request. With the delay we get
- // at most one Reaper created each TTL.
- try
- {
- Pool.this.wait(connectionTTL);
- }
- catch (InterruptedException _)
- {
- // Ignore the interrupt.
- }
- }
- while (connectionPool.size() > 0);
- }
- finally
- {
- reaper = null;
- }
- }
- }
- }
-
- Reaper reaper;
-
- /**
- * Private constructor to ensure singleton.
- */
- private Pool()
- {
- }
-
- /**
- * Tests for a matching connection.
- *
- * @param c connection to match.
- * @param h the host name.
- * @param p the port.
- * @param sec true if using https.
- *
- * @return true if c matches h, p, and sec.
- */
- private static boolean matches(HTTPConnection c,
- String h, int p, boolean sec)
- {
- return h.equals(c.hostname) && (p == c.port) && (sec == c.secure);
- }
-
- /**
- * Get a pooled HTTPConnection. If there is an existing idle
- * connection to the requested server it is returned. Otherwise a
- * new connection is created.
- *
- * @param host the name of the host to connect to
- * @param port the port on the host to connect to
- * @param secure whether to use a secure connection
- *
- * @return the HTTPConnection.
- */
- synchronized HTTPConnection get(String host,
- int port,
- boolean secure,
- int connectionTimeout, int timeout)
- {
- String ttl =
- SystemProperties.getProperty("classpath.net.http.keepAliveTTL");
- connectionTTL = 10000;
- if (ttl != null && ttl.length() > 0)
- try
- {
- int v = 1000 * Integer.parseInt(ttl);
- if (v >= 0)
- connectionTTL = v;
- }
- catch (NumberFormatException _)
- {
- // Ignore.
- }
-
- String mc = SystemProperties.getProperty("http.maxConnections");
- maxConnections = 5;
- if (mc != null && mc.length() > 0)
- try
- {
- int v = Integer.parseInt(mc);
- if (v > 0)
- maxConnections = v;
- }
- catch (NumberFormatException _)
- {
- // Ignore.
- }
-
- HTTPConnection c = null;
-
- ListIterator it = connectionPool.listIterator(0);
- while (it.hasNext())
- {
- HTTPConnection cc = (HTTPConnection)it.next();
- if (matches(cc, host, port, secure))
- {
- c = cc;
- it.remove();
- // Update the timeout.
- if (c.socket != null)
- try
- {
- c.socket.setSoTimeout(timeout);
- }
- catch (SocketException _)
- {
- // Ignore.
- }
- break;
- }
- }
- if (c == null)
- {
- c = new HTTPConnection(host, port, secure,
- connectionTimeout, timeout);
- c.setPool(this);
- }
- return c;
- }
-
- /**
- * Put an idle HTTPConnection back into the pool. If this causes
- * the pool to be come too large, the oldest connection is removed
- * and closed.
- *
- */
- synchronized void put(HTTPConnection c)
- {
- c.timeLastUsed = System.currentTimeMillis();
- connectionPool.addLast(c);
-
- // maxConnections must always be >= 1
- while (connectionPool.size() >= maxConnections)
- removeOldest();
-
- if (connectionTTL > 0 && null == reaper) {
- // If there is a connectionTTL, then the reaper has removed
- // any stale connections, so we don't have to check for stale
- // now. We do have to start a reaper though, as there is not
- // one running now.
- reaper = new Reaper();
- Thread t = new Thread(reaper, "HTTPConnection.Reaper");
- t.setDaemon(true);
- t.start();
- }
- }
-
- /**
- * Remove the oldest connection from the pool and close it.
- */
- void removeOldest()
- {
- HTTPConnection cx = (HTTPConnection)connectionPool.removeFirst();
- try
- {
- cx.closeConnection();
- }
- catch (IOException ioe)
- {
- // Ignore it. We are just cleaning up.
- }
- }
- }
-
- /**
- * The number of times this HTTPConnection has be used via keep-alive.
- */
- int useCount;
-
- /**
- * If this HTTPConnection is in the pool, the time it was put there.
- */
- long timeLastUsed;
-
- /**
- * Set the connection pool that this HTTPConnection is a member of.
- * If left unset or set to null, it will not be a member of any pool
- * and will not be a candidate for reuse.
- *
- * @param p the pool.
- */
- void setPool(Pool p)
- {
- pool = p;
- }
-
- /**
- * Signal that this HTTPConnection is no longer needed and can be
- * returned to the connection pool.
- *
- */
- void release()
- {
- if (pool != null)
- {
- useCount++;
- pool.put(this);
-
- }
- else
- {
- // If there is no pool, just close.
- try
- {
- closeConnection();
- }
- catch (IOException ioe)
- {
- // Ignore it. We are just cleaning up.
- }
- }
- }
-
- /**
- * Creates a new request using this connection.
- * @param method the HTTP method to invoke
- * @param path the URI-escaped RFC2396 <code>abs_path</code> with
- * optional query part
- */
- public Request newRequest(String method, String path)
- {
- if (method == null || method.length() == 0)
- {
- throw new IllegalArgumentException("method must have non-zero length");
- }
- if (path == null || path.length() == 0)
- {
- path = "/";
- }
- Request ret = new Request(this, method, path);
- if ((secure && port != HTTPS_PORT) ||
- (!secure && port != HTTP_PORT))
- {
- ret.setHeader("Host", hostname + ":" + port);
- }
- else
- {
- ret.setHeader("Host", hostname);
- }
- ret.setHeader("User-Agent", userAgent);
- ret.setHeader("Connection", "keep-alive");
- ret.setHeader("Accept-Encoding",
- "chunked;q=1.0, gzip;q=0.9, deflate;q=0.8, " +
- "identity;q=0.6, *;q=0");
- if (cookieManager != null)
- {
- Cookie[] cookies = cookieManager.getCookies(hostname, secure, path);
- if (cookies != null && cookies.length > 0)
- {
- CPStringBuilder buf = new CPStringBuilder();
- buf.append("$Version=1");
- for (int i = 0; i < cookies.length; i++)
- {
- buf.append(',');
- buf.append(' ');
- buf.append(cookies[i].toString());
- }
- ret.setHeader("Cookie", buf.toString());
- }
- }
- return ret;
- }
-
- /**
- * Closes this connection.
- */
- public void close()
- throws IOException
- {
- closeConnection();
- }
-
- /**
- * Retrieves the socket associated with this connection.
- * This creates the socket if necessary.
- */
- protected synchronized Socket getSocket()
- throws IOException
- {
- if (socket == null)
- {
- String connectHostname = hostname;
- int connectPort = port;
- if (isUsingProxy())
- {
- connectHostname = proxyHostname;
- connectPort = proxyPort;
- }
- socket = new Socket();
- InetSocketAddress address =
- new InetSocketAddress(connectHostname, connectPort);
- if (connectionTimeout > 0)
- {
- socket.connect(address, connectionTimeout);
- }
- else
- {
- socket.connect(address);
- }
- if (timeout > 0)
- {
- socket.setSoTimeout(timeout);
- }
- if (secure)
- {
- try
- {
- SSLSocketFactory factory = getSSLSocketFactory();
- SSLSocket ss =
- (SSLSocket) factory.createSocket(socket, connectHostname,
- connectPort, true);
- String[] protocols = { "TLSv1", "SSLv3" };
- ss.setEnabledProtocols(protocols);
- ss.setUseClientMode(true);
- synchronized (handshakeCompletedListeners)
- {
- if (!handshakeCompletedListeners.isEmpty())
- {
- for (Iterator i =
- handshakeCompletedListeners.iterator();
- i.hasNext(); )
- {
- HandshakeCompletedListener l =
- (HandshakeCompletedListener) i.next();
- ss.addHandshakeCompletedListener(l);
- }
- }
- }
- ss.startHandshake();
- socket = ss;
- }
- catch (GeneralSecurityException e)
- {
- throw new IOException(e.getMessage());
- }
- }
- in = socket.getInputStream();
- in = new BufferedInputStream(in);
- out = socket.getOutputStream();
- out = new BufferedOutputStream(out);
- }
- return socket;
- }
-
- SSLSocketFactory getSSLSocketFactory()
- throws GeneralSecurityException
- {
- if (sslSocketFactory == null)
- {
- TrustManager tm = new EmptyX509TrustManager();
- SSLContext context = SSLContext.getInstance("SSL");
- TrustManager[] trust = new TrustManager[] { tm };
- context.init(null, trust, null);
- sslSocketFactory = context.getSocketFactory();
- }
- return sslSocketFactory;
- }
-
- void setSSLSocketFactory(SSLSocketFactory factory)
- {
- sslSocketFactory = factory;
- }
-
- protected synchronized InputStream getInputStream()
- throws IOException
- {
- if (socket == null)
- {
- getSocket();
- }
- return in;
- }
-
- protected synchronized OutputStream getOutputStream()
- throws IOException
- {
- if (socket == null)
- {
- getSocket();
- }
- return out;
- }
-
- /**
- * Closes the underlying socket, if any.
- */
- protected synchronized void closeConnection()
- throws IOException
- {
- if (socket != null)
- {
- try
- {
- socket.close();
- }
- finally
- {
- socket = null;
- }
- }
- }
-
- /**
- * Returns a URI representing the connection.
- * This does not include any request path component.
- */
- protected String getURI()
- {
- CPStringBuilder buf = new CPStringBuilder();
- buf.append(secure ? "https://" : "http://");
- buf.append(hostname);
- if (secure)
- {
- if (port != HTTPConnection.HTTPS_PORT)
- {
- buf.append(':');
- buf.append(port);
- }
- }
- else
- {
- if (port != HTTPConnection.HTTP_PORT)
- {
- buf.append(':');
- buf.append(port);
- }
- }
- return buf.toString();
- }
-
- /**
- * Get the number of times the specified nonce has been seen by this
- * connection.
- */
- int getNonceCount(String nonce)
- {
- if (nonceCounts == null)
- {
- return 0;
- }
- return nonceCounts.get(nonce).intValue();
- }
-
- /**
- * Increment the number of times the specified nonce has been seen.
- */
- void incrementNonce(String nonce)
- {
- int current = getNonceCount(nonce);
- if (nonceCounts == null)
- {
- nonceCounts = new HashMap<String, Integer>();
- }
- nonceCounts.put(nonce, new Integer(current + 1));
- }
-
- // -- Events --
-
- void addHandshakeCompletedListener(HandshakeCompletedListener l)
- {
- synchronized (handshakeCompletedListeners)
- {
- handshakeCompletedListeners.add(l);
- }
- }
- void removeHandshakeCompletedListener(HandshakeCompletedListener l)
- {
- synchronized (handshakeCompletedListeners)
- {
- handshakeCompletedListeners.remove(l);
- }
- }
-
-}