addProxy

gist

	public static void addProxy(String user, String pass, String host, String port) {

		if(user!= null && pass != null) {
			final String authUser = user;
			final String authPassword = pass;

			Authenticator.setDefault(
					new Authenticator() {
						public PasswordAuthentication getPasswordAuthentication() {
							return new PasswordAuthentication(
									authUser, authPassword.toCharArray());
						}
					}
			);

			System.setProperty("http.proxyUser", authUser);
			System.setProperty("http.proxyPassword", authPassword);
		}

		System.setProperty("http.proxyHost", host);
		System.setProperty("http.proxyPort", port);
	}
addProxy

WSO2 proxy con secuencias

Tenemos un WS que tienen tres operaciones insertar, consultar(query) y actualizar. Cuando damos de alta, no devuelve todos los datos que quisieramos. Muchos de estos datos se encuentran en la consulta. Lo que vamos a hacer, es, en un mismo proxy, realizar dos llamadas: insertar y consultar. Elmensaje de salida sera un compendio de las dos acciones.

1.- Consumidor del BUS de WSO2 realiza una llamada de inserccion.
2.- El proxy realiza la llamada de inserccion, recupera el xml resultante.
3.- El proxy recupera datos del xml resultante.
4.- El proxy crea un nuevo xml de peticion de consulta.
5.- El proxy lanza la consulta y recupera el xml de respuesta.
6.- El proxy recupera datos del xml de respuesta del apartado 5 y 3
7.- El proxy crea y envia un xml de respuesta para la llamada 1.

para todo esto necesitamos dar de alta:
– Endpoint
– Secuencias
– Proxy

Definicion del Endpoint

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud">
   <address uri="http://host:port/pepe/crudws" format="soap11">
      <suspendOnFailure>
         <progressionFactor>1.0</progressionFactor>
      </suspendOnFailure>
      <markForSuspension>
         <retriesBeforeSuspension>0</retriesBeforeSuspension>
         <retryDelay>0</retryDelay>
      </markForSuspension>
   </address>
</endpoint>

Definicion del proxy

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="pepe.crud.proxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target faultSequence="fault" endpoint="pepe.crud">
<!-- definimos una secuendcia de entrada. Aqui vamos a indicar que queremos hacer -->
      <inSequence>
<!-- Recuperamos el tipo de operacion que se esta ejecutando. Pueden ser: insertRegisty, updateRegistry, queryRegistry -->
         <property name="Operation" expression="get-property('Action')"/>
<!-- filtramos por el resultado de la operacion. Si es igual al patron regex=".*newRegistry" -->
         <filter source="get-property('Operation')" regex=".*newRegistry">
            <then>
<!-- incvocamos la secuencia añadir -->
               <sequence key="crud.addRegistry.sequence"/>
            </then>
            <else>
<!-- Sino es la operacion de añadir, continuamos por aqui -->
               <send>
<!-- enviamos al WebService la peticion-->
                  <endpoint key="wspepe.crud"/>
               </send>
            </else>
         </filter>
      </inSequence>
<!-- Tratamos la respuesta del servidor -->
      <outSequence>
         <filter source="get-property('Operation')" regex=".*newRegistry">
            <then>
<!-- Si era una operacion de insercion en registro. Realizamos la siguiente secuencia de operaciones. -->
               <sequence key="crud.outRegistry.sequence"/>
            </then>
            <else>
<!-- Sino, logeamos -->
               <log level="full">
                  <property name="Operation" expression="get-property('Operation')"/>
               </log>
            </else>
         </filter>
<!-- enviamos el mensaje a nuestro consumidor -->
         <send buildmessage="true"/>
      </outSequence>
   </target>
   <publishWSDL key="conf:/WSDL/crud.crudws/crudWS.wsdl">
      <resource location="typeapplicant.xsd"
                key="conf:/WSDL/crud.crudws/typeapplicant.xsd"/>
      <resource location="typeattachment.xsd"
                key="conf:/WSDL/crud.crudws/typeattachment.xsd"/>
      <resource location="typecommon.xsd"
                key="conf:/WSDL/crud.crudws/typecommon.xsd"/>
      <resource location="typecrud.xsd"
                key="conf:/WSDL/crud.crudws/typecrud.xsd"/>
   </publishWSDL>
   <description/>
</proxy>

Definicion de las secuencias

<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.addRegistry.sequence">
<!-- logeamos -->
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia ADD"/>
   </log>
   <!-- invocamos a otro endpoint  -->
   <send receive="crud.queryRegistry.sequence" buildmessage="true">
      <endpoint key="pepe.crudws"/>
   </send>
</sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.outRegistry.sequence">
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia OUT"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="RegistryCode" expression="get-property('RegistryCode')"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="IdRegistry" expression="get-property('IdRegistry')"/>
   </log>
</sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.queryRegistry.sequence">
   <!-- Obtenemos los datos del alta del nuevo registro para poder realizar la consulta  -->
   <property name="IdRegistry" expression="$body/ns6:RIResponse/body/idcrud" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" />
   <property name="RegistryCode" expression="$body/ns6:RIResponse/body/crudcode" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" />
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia QUERY 1"/>
      <property name="RegistryCode" expression="get-property('RegistryCode')" xmlns:ns="http://org.apache.synapse/xsd" />
      <property name="IdRegistry" expression="get-property('IdRegistry')" xmlns:ns="http://org.apache.synapse/xsd" />
   </log>
   <!-- creamos un xml a medida para enviar al endpoint -->
   <payloadFactory media-type="xml">
      <format>
         <reg:RQRequest xmlns:reg="http://ws.pepe.com/crudws" xmlns:reg1="http://ws.pepe.com/types/crud">
            <header xmlns="" version="0"/>
            <body xmlns="">
               <crudcode>$1</crudcode>
               <input>1</input>
            </body>
         </reg:RQRequest>
      </format>
      <args>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('RegistryCode')" evaluator="xml"/>
      </args>
   </payloadFactory>
   <!-- enviamos el xml creado al endpoint -->
   <header name="Action" value="http://ws.pepe.com/crudws/queryRegistry"/>
   <send>
      <endpoint key="pepe.crudws"/>
   </send>
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia QUERY 2"/>
   </log>
</sequence>

Este codigo ha sido elaborado por Rafael Udaondo. Con su permiso he publicado esta entrada.

WSO2 proxy con secuencias

Java Proxy

Sacado de esta pagina.

Para salir a internet mediante un proxy con Java tienes las siguientes opciones:

HTTP

En la llamada a la JVM, al invocar la clase:

$ java -Dhttp.proxyHost=webcache.mydomain.com MiClaseConMetodoMain
$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 MiClaseConMetodoMain
$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080-Dhttp.noProxyHosts=”localhost|host.mydomain.com” MiClaseConMetodoMain

En el codigo de la clase:

System.setProperty("http.proxyHost", "webcache.mydomain.com");
System.setPropery("http.proxyPort", "8080");

// Next connection will be through proxy.
URL url = new URL("http://java.sun.com/");
InputStream in = url.openStream();

// Now, let's 'unset' the proxy.
System.setProperty("http.proxyHost", null); // From now on http connections will be done directly.

HTTPS

htttps.proxyHost
https.proxyPort
http.nonProxyHosts

FTP

ftp.proxHost
ftp.proxyPort
ftp.nonProxyHosts

Configurando mas de un proxy:

$ java -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080 -Dftp.proxyHost=webcache.mydomain.com -Dftp.proxyPort=8080 MiClaseConMetodoMain

SOCKS

socksProxyHost
socksProxyPort (default 1080)

Si defines un proxy HTTP y uno SOCKS,

  • tiene preferencia el HTTP.
  • El proxy SOCKS sera ignorado, para conexiones HTTP y SOCKS
  • Una conexion FTP, en esta configuracion, iria por SOCKS.

LA CLASE: java.net.Proxy

//creamos proxy HTTP
SocketAddress addr = new InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);

// lo invocamos
URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);

// no queremos invocarlo
URL url2 = new URL("http://infos.mydomain.com/");
URLConnection conn2 = url2.openConnection(Proxy.NO_PROXY);

//creamos proxy SOCK
SocketAddress addr = new InetSocketAddress("socks.mydomain.com", 1080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);

// lo invocamos
URL url = new URL("ftp://ftp.gnu.org/README");
URLConnection conn = url.openConnection(proxy);


// Invocacion especifica de proxy para una conexion Socket
Socket socket = new Socket(proxy);
InetSocketAddress dest = new InetSocketAddress("server.foo.com", 1234);
socket.connect(dest);

// no queremos invocarlo
Socket socket = new Socket(Proxy.NO_PROXY);
socket.connect(new InetAddress("localhost", 1234));

LA CLASE: java.net.ProxySelector

Determina para que conexiones usar un proxy u otro

public abstract class ProxySelector {
        public static ProxySelector getDefault();
        public static void setDefault(ProxySelector ps);
        public abstract List<Proxy> select(URI uri);
        public abstract void connectFailed(URI uri,
                SocketAddress sa, IOException ioe);
}
Java Proxy

Java proxy connection user pass


public class Prueba{
	public static void main(String[] args) {
		try {
			String ipProxy = "";
			String portProxy = "";
			String userProxy = "";
			String passProxy = "";
			System.setProperty("http.proxyHost", ipProxy);
			System.setProperty("http.proxyPort", portProxy);
			URL url = new URL("http://www.google.es");
			URLConnection uc = url.openConnection ();
			String encoded = new String (Base64.encode(new String(userProxy + ":" + passProxy ).getBytes()));
			uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
			uc.connect();
			InputStream is = uc.getInputStream();
			
			System.out.println(getStringFromInputStream(is));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String getStringFromInputStream(InputStream is){
	      // TODO
	      return null;
	}
}

   public final static Boolean USE_PROXY = false;
   public final static Boolean IS_PROXY_AUTH = false;
   public final static String PROXY_USER = "";
   public final static String PROXY_PASSWORD = "";
   public final static String PROXY_SERVER ="";
   public final static Integer PROXY_PORT = null;
   
   private void configureConnection() {
       if(USE_PROXY) {
           System.setProperty("http.proxyHost", PROXY_SERVER);
           System.setProperty("http.proxyPort", Integer.toString(PROXY_PORT));
           if (IS_PROXY_AUTH) {
               Authenticator.setDefault(new Authenticator() {
                   @Override
                   protected PasswordAuthentication getPasswordAuthentication() {
                       return new PasswordAuthentication(PROXY_USER, PROXY_PASSWORD.toCharArray());
                   }
               });
           } else {
               Authenticator.setDefault(null);
           }
       }
   }
Java proxy connection user pass