Hello to all,

A paranoid firewall rule force me to use a range of outgoing ports on
a httpclient based aplication. Is there an easy way to configure this
on httpclient?

Meanwhile, I don't find that easy way so I have developed a custom
socket (also for ssl) I want to share:


import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Random;

import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CustomPlainSocketFactory extends PlainSocketFactory {
        
        private int portMin=-1;
        private int portMax=-1;
        
        private static final int MAX_RETRIES=20;
        
        private Random randomGenerator;
        
        private final Logger logger =
LoggerFactory.getLogger(CustomPlainSocketFactory.class);
        
        public CustomPlainSocketFactory(int portMin, int portMax, Random
randomGenerator) {
        super();

        this.portMin=portMin;
        this.portMax=portMax;
        this.randomGenerator=randomGenerator;
    }
        
        @Override
        public Socket connectSocket(
            final Socket socket,
            final InetSocketAddress remoteAddress,
            final InetSocketAddress localAddress,
            final HttpParams params) throws IOException,
ConnectTimeoutException {
        if (remoteAddress == null) {
            throw new IllegalArgumentException("Remote address may not
be null");
        }
        if (params == null) {
            throw new IllegalArgumentException("HTTP parameters may
not be null");
        }
        Socket sock = socket;
        if (sock == null) {
            sock = createSocket();
        }
        if(portMin>0 && portMax>0 && portMax>portMin){
                
sock.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params));
                boolean binded=false;
                int bindRetries=0;
                InetSocketAddress localAddressPort;
                while(!binded && bindRetries<MAX_RETRIES){
                        bindRetries++;
                        localAddressPort=new
InetSocketAddress(portMin+randomGenerator.nextInt(portMax-portMin));
                        logger.info("Tratando de conseguir un socket de salida 
con
puerto {}", localAddressPort.getPort());
                        try{
                                sock.bind(localAddressPort);
                                binded=true;
                }catch(Exception ex){
                        binded=false;
                }       
                }
        }
        else{
                if (localAddress != null) {
                    
sock.setReuseAddress(HttpConnectionParams.getSoReuseaddr(params));
                    sock.bind(localAddress);
                }
        }
        int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
        int soTimeout = HttpConnectionParams.getSoTimeout(params);

        try {
            sock.setSoTimeout(soTimeout);
            sock.connect(remoteAddress, connTimeout);
        } catch (SocketTimeoutException ex) {
            throw new ConnectTimeoutException("Connect to " +
remoteAddress + " timed out");
        }
        return sock;
    }

}

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to