new connection interfaces, step 2 - return of the Operator
git-svn-id: https://svn.apache.org/repos/asf/jakarta/httpcomponents/httpclient/trunk@492299 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4c84259042
commit
ceb4ed1d39
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
* $Date$
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.http.conn;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.params.HttpParams;
|
||||
import org.apache.http.protocol.HttpContext;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Interface for opening {@link UnmanagedClientConnection connections}.
|
||||
* This interface encapsulates the logic to create sockets and to
|
||||
* open or update the connection with the new socket.
|
||||
* Implementations will most likely make use of
|
||||
* {@link SocketFactory socket factories}.
|
||||
* <br/>
|
||||
* The methods in this interface allow the creation of plain and layered
|
||||
* sockets. Creating a tunnelled connection through a proxy, however,
|
||||
* is not within the scope of the operator.
|
||||
*
|
||||
* @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
|
||||
*
|
||||
*
|
||||
* <!-- empty lines to avoid svn diff problems -->
|
||||
* @version $Revision$ $Date$
|
||||
*
|
||||
*/
|
||||
public interface SocketConnectionOperator {
|
||||
|
||||
|
||||
/**
|
||||
* Opens a connection to the given target host.
|
||||
*
|
||||
* @param conn the connection to open
|
||||
* @param target the target host to connect to
|
||||
* @param context the context for the connection
|
||||
* @param params the parameters for the connection
|
||||
*
|
||||
* @throws IOException in case of a problem
|
||||
*/
|
||||
void openConnection(UnmanagedClientConnection conn,
|
||||
HttpHost target,
|
||||
HttpContext context,
|
||||
HttpParams params)
|
||||
throws IOException
|
||||
;
|
||||
|
||||
|
||||
/**
|
||||
* Updates a connection with a layered secure connection.
|
||||
* The typical use of this method is to update a tunnelled plain
|
||||
* connection (HTTP) to a secure TLS/SSL connection (HTTPS).
|
||||
*
|
||||
* @param conn the open connection to update
|
||||
* @param target the target host for the updated connection.
|
||||
* The connection must already be open to the
|
||||
* host and port, but the scheme of the target
|
||||
* will be used to create a layered connection.
|
||||
* @param context the context for the connection
|
||||
* @param params the parameters for the updated connection
|
||||
*
|
||||
* @throws IOException in case of a problem
|
||||
*/
|
||||
void updateSecureConnection(UnmanagedClientConnection conn,
|
||||
HttpHost target,
|
||||
HttpContext context,
|
||||
HttpParams params)
|
||||
throws IOException
|
||||
;
|
||||
|
||||
|
||||
} // interface SocketConnectionOperator
|
||||
|
|
@ -45,7 +45,7 @@ import org.apache.http.conn.UnmanagedClientConnection;
|
|||
/**
|
||||
* Default implementation of a managed client connection.
|
||||
*
|
||||
* @author Roland Weber (rolandw@apache.org)
|
||||
* @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
|
||||
*
|
||||
*
|
||||
* <!-- empty lines to avoid svn diff problems -->
|
||||
|
|
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
* $HeadURL$
|
||||
* $Revision$
|
||||
* $Date$
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.http.conn.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.net.InetAddress;
|
||||
|
||||
import org.apache.http.HttpHost;
|
||||
import org.apache.http.params.HttpParams;
|
||||
import org.apache.http.params.HttpConnectionParams;
|
||||
import org.apache.http.protocol.HttpContext;
|
||||
|
||||
import org.apache.http.conn.Scheme;
|
||||
import org.apache.http.conn.SocketFactory;
|
||||
import org.apache.http.conn.SecureSocketFactory;
|
||||
import org.apache.http.conn.UnmanagedClientConnection;
|
||||
import org.apache.http.conn.SocketConnectionOperator;
|
||||
|
||||
|
||||
/**
|
||||
* Default implementation of a
|
||||
* {@link SocketConnectionOperator SocketConnectionOperator}.
|
||||
* It uses the {@link Scheme Scheme} class to look up
|
||||
* {@link SocketFactory SocketFactory} objects.
|
||||
*
|
||||
* @author <a href="mailto:rolandw@apache.org">Roland Weber</a>
|
||||
*
|
||||
*
|
||||
* <!-- empty lines to avoid svn diff problems -->
|
||||
* @version $Revision$ $Date$
|
||||
*
|
||||
*/
|
||||
public class DefaultSocketConnectionOperator
|
||||
implements SocketConnectionOperator {
|
||||
|
||||
|
||||
|
||||
// public default constructor
|
||||
|
||||
|
||||
|
||||
// non-javadoc, see interface SocketConnectionOperator
|
||||
public void openConnection(UnmanagedClientConnection conn,
|
||||
HttpHost target,
|
||||
HttpContext context,
|
||||
HttpParams params)
|
||||
throws IOException {
|
||||
|
||||
if (conn == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Connection must not be null.");
|
||||
}
|
||||
if (target == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Target host must not be null.");
|
||||
}
|
||||
//@@@ is context allowed to be null?
|
||||
if (params == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Parameters must not be null.");
|
||||
}
|
||||
if (conn.isOpen()) {
|
||||
throw new IllegalArgumentException
|
||||
("Connection must not be open.");
|
||||
}
|
||||
|
||||
InetAddress local = null;
|
||||
//@@@ TODO: deal with local address stuff from context
|
||||
|
||||
final Scheme schm = Scheme.getScheme(target.getSchemeName());
|
||||
if (schm == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Unknown scheme '" + target.getSchemeName() +
|
||||
"' in target host.");
|
||||
}
|
||||
final SocketFactory sf = schm.getSocketFactory();
|
||||
//@@@ create socket, register in connection, connect? (HTTPCLIENT-475)
|
||||
//@@@ Requires registration method, since conn.open(...) fails if
|
||||
//@@@ the socket is not open. Dependent objects need the streams!
|
||||
final Socket sock = sf.connectSocket
|
||||
(null, target.getHostName(), target.getPort(), local, 0, params);
|
||||
prepareSocket(sock, context, params);
|
||||
|
||||
//@@@ ask the factory whether the new socket is secure?
|
||||
boolean secure = (sf instanceof SecureSocketFactory);
|
||||
|
||||
conn.open(sock, target, secure, params);
|
||||
//@@@ error handling: close the created socket in case of exception?
|
||||
|
||||
} // openConnection
|
||||
|
||||
|
||||
// non-javadoc, see interface SocketConnectionOperator
|
||||
public void updateSecureConnection(UnmanagedClientConnection conn,
|
||||
HttpHost target,
|
||||
HttpContext context,
|
||||
HttpParams params)
|
||||
throws IOException {
|
||||
|
||||
|
||||
if (conn == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Connection must not be null.");
|
||||
}
|
||||
if (target == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Target host must not be null.");
|
||||
}
|
||||
//@@@ is context allowed to be null?
|
||||
if (params == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Parameters must not be null.");
|
||||
}
|
||||
if (!conn.isOpen()) {
|
||||
throw new IllegalArgumentException
|
||||
("Connection must be open.");
|
||||
}
|
||||
|
||||
final Scheme schm = Scheme.getScheme(target.getSchemeName());
|
||||
if (schm == null) {
|
||||
throw new IllegalArgumentException
|
||||
("Unknown scheme '" + target.getSchemeName() +
|
||||
"' in target host.");
|
||||
}
|
||||
if (!(schm.getSocketFactory() instanceof SecureSocketFactory)) {
|
||||
throw new IllegalArgumentException
|
||||
("Target scheme (" + schm.getName() +
|
||||
") must have secure socket factory.");
|
||||
}
|
||||
|
||||
final SecureSocketFactory ssf =
|
||||
(SecureSocketFactory)schm.getSocketFactory();
|
||||
final Socket sock = ssf.createSocket
|
||||
(conn.getSocket(), target.getHostName(), target.getPort(), true);
|
||||
prepareSocket(sock, context, params);
|
||||
|
||||
//@@@ ask the factory whether the new socket is secure?
|
||||
boolean secure = true;
|
||||
|
||||
conn.update(sock, target, secure, params);
|
||||
//@@@ error handling: close the layered socket in case of exception?
|
||||
|
||||
} // updateSecureConnection
|
||||
|
||||
|
||||
/**
|
||||
* Performs standard initializations on a newly created socket.
|
||||
*
|
||||
* @param sock the socket to prepare
|
||||
* @param context the context for the connection
|
||||
* @param params the parameters from which to prepare the socket
|
||||
*
|
||||
* @throws IOException in case of an IO problem
|
||||
*/
|
||||
protected void prepareSocket(Socket sock, HttpContext context,
|
||||
HttpParams params)
|
||||
throws IOException {
|
||||
|
||||
// context currently not used, but derived classes may need it
|
||||
//@@@ is context allowed to be null?
|
||||
|
||||
sock.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(params));
|
||||
sock.setSoTimeout(HttpConnectionParams.getSoTimeout(params));
|
||||
|
||||
int linger = HttpConnectionParams.getLinger(params);
|
||||
if (linger >= 0) {
|
||||
sock.setSoLinger(linger > 0, linger);
|
||||
}
|
||||
|
||||
} // prepareSocket
|
||||
|
||||
|
||||
} // interface SocketConnectionOperator
|
||||
|
Loading…
Reference in New Issue