Foros del Web » Programación para mayores de 30 ;) » Java »

problema con Proxy y HttpURLConnection

Estas en el tema de problema con Proxy y HttpURLConnection en el foro de Java en Foros del Web. Hola a todos! soy Rui, llevo tiempo siguiendo los foros para dudas y consejos aunque soy nuevo aqui y es la primera vez que escribo ...
  #1 (permalink)  
Antiguo 30/04/2008, 03:50
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
problema con Proxy y HttpURLConnection

Hola a todos! soy Rui, llevo tiempo siguiendo los foros para dudas y consejos aunque soy nuevo aqui y es la primera vez que escribo asi que me doy por bienvenido!! jeje

A ver, tengo un problema con un proxy que intento hacer. Estoy solicitando información a un servidor fuera del dominio de mi aplicación, y por tanto estoy usando un proxy para poder conectar.
Necesito hacer una petición a "http://dominioExterno/Aplicacion" pasandole por POST unos parámetros; mi petición es del tipo: "http://miDominio/Proxy" y le paso por POST los parámetros, más otro URL="http://dominioExterno/Aplicacion" para que mi proxy sepa el servidor al que quiero acceder y que él haga una conexión transparente con el contenido de mi petición al sitio externo.
En mi proxy leo el request que le mando y los headers para escribirlos en el objeto HttpURLConnection cambiandole el host al del dominio externo:

Código:
        URL url = new URL(request.getParameter("URL"));
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        ...
        for (Enumeration enu=request.getHeaderNames();enu.hasMoreElements();){
             ...
             if (!pName.toUpperCase().startsWith("HOST")) {
                 ...
                 conn.setRequestProperty(pName,pValu);
             }
             else 
                 conn.setRequestProperty(pName,url.getHost() + ":" + url.getPort());
        }
A la hora de leer los parámetros del request, los encadeno en un string de manera "key1=value1&key2=value2&...":

Código:
 
  for (Enumeration enu=request.getParameterNames();enu.hasMoreElements();){
       ...
       String pName=(String)enu.nextElement();
       String pValue=request.getParameter(pName);
       inputRequest += pName + "=" + pValue;
       if(enu.hasMoreElements())
	    inputRequest += "&";
  }
y los escribo en la nueva conexión creada con HttpURLConnection:

Código:
        PrintWriter pw = new PrintWriter(conn.getOutputStream());
        pw.print(inputRequest);
        pw.flush();
        pw.close();
el problema lo tengo ahora!!! Cuando supuestamente la conexión se realiza con el objeto HttpURLConnection, para leer el resultado tendria que mirar:

Código:
      
      //Aqui tendría que conectarse pero no lo hace!
      InputStreamReader ri = new InputStreamReader(conn.getInputStream()); 
      BufferedReader rdr = new BufferedReader(ri));
y leeria del buffer "rdr" para escribirlo en mi response de mi proxy hacia mi aplicación ya dentro de mi servidor:

Código:
      PrintWriter out = new PrintWriter(response.getOutputStream());
      ...
mi problema es (como he indicado arriba) cuando intento obtener el "InputStream" de la conexión transparente, por lo visto no se conecta al servidor ni la aplicación externa. El resto del código está bien por que intento conectarme a páginas externas que no piden parámetros (metiendo en la URL una web cualquiera) y no da problema, por lo que supongo que será la manera en que le paso los parámetros a la aplicación externa, con lo que esta al no recibir parámetros da error y por eso no consigo conexión.

Si alguien supiera como arreglarlo...lo hice el viernes pasado y funcionó, pero de pronto el lunes no...y no se si es cosa mia o del servidor externo...

Muchas gracias!!

P.D.: lo siento si he escrito mucho, pero asi es más claro de explicarlo, de paso si alguién quiere hacer un proxy asi pilla idea de como hacerlo.
  #2 (permalink)  
Antiguo 30/04/2008, 10:18
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años
Puntos: 51
Re: problema con Proxy y HttpURLConnection

Por si te sirve de algo o te da alguna idea de ver por que no funciona, asi es como tengo implementado yo un Proxy:

http://fisheye5.cenqua.com/browse/we...er.java?r=1.14

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 05/05/2008, 04:02
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: problema con Proxy y HttpURLConnection

gracias GreenEyed.
Es un poco complicado lo que me has pasado, lo que intento hacer es algo mucho más sencillo pero de todas formas miraré en que puede servirme.
de momento la duda sigue estando en el aire por si alguien tiene una idea mejor! jeje
Saludos.
  #4 (permalink)  
Antiguo 05/05/2008, 04:58
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años
Puntos: 51
Re: problema con Proxy y HttpURLConnection

En cuanto a las dudas no te puedo decir mucho, por que no queda muy claro cual es el problema...
Puede ser por que transformas todas las peticiones en GET, a lo mejor el servidor solo permite POST, por que algun parametro falle en la conversion (los parametros con valores multiples no devuelven String sino String[]) por que no te conectas correctamente al servidor... pero con los datos que das es muy dificil saber que pasa.

Lo recomendable es ir paso a paso y ver donde falla, ya que si se conecta correctamente a otras paginas, es que algo pasa, pero "por lo visto no se conecta" no es un diagnóstico muy técnico . Mira a ver si se llega a hacer la conexion, que URL estas accediendo y pruebala a"a mano" en el navegador...

Suerte!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 06/05/2008, 02:25
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: problema con Proxy y HttpURLConnection

puede que no me explicase bien :D
Las peticiones las hago todas POST, ninguna GET. Lo de "que por lo visto no se conecta" es poco técnico, lo se...jeje. Quiero decir que el servidor tomcat externo al que intento mandar las peticiones me da un error interno ya que no puede procesar la petición (al enviarle mal los parámetros pues no reconoce la petición que le hago), la URL a la que envio la información está correcta, el único problema parece ser con los parámetros POST, con lo que el servidor no reconoce bien la petición que intento hacer y por eso me da error.
Puede que lo que me comentaste de parámetros con valores múltiples sea el problema... de todas formas intentaré hablar con el compañero que tiene hecho el servidor al que intento conectarme con mi httpProxy y veré que parámetros le envio realmente por si acaso...estoy convencido de que el problema tiene que estar por ahi

Envio todo el código de mi proxy por si ayuda en algo:

Código:
public class HttpProxy extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String newline = null;
        try {
            newline = System.getProperty("line.separator");
            } catch (Exception e) {
                newline = "\n";
            }
        String endpointURL = request.getParameter("URL");
        URL url = new URL(endpointURL);

	//creamos una nueva conexion con la url del dominio externo
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setAllowUserInteraction(false);
	conn.setDoOutput(true);
	conn.setDoInput(true);
	conn.setUseCaches(false);
	conn.setReadTimeout(35000);
        conn.setConnectTimeout(35000);    

	//actualizamos todos los headers de la nueva conexion con los que tenia la llamada a nuestro dominio
        for (Enumeration enu=request.getHeaderNames();enu.hasMoreElements();){
            String pName=(String)enu.nextElement();
            String pValu=request.getHeader( pName );
            if (!pName.toUpperCase().startsWith("HOST")) {
                conn.setRequestProperty(pName,pValu);
            } 
            else {
		//cambiamos el host de la nueva conexion por el del dominio "prohibido""
                conn.setRequestProperty(pName,url.getHost() + ":" + url.getPort());
            }
        }

	String inputRequest = "";
	//actualizamos todos los parametros de la nueva conexion con los que tenia la llamada a nuestro dominio
	for (Enumeration enu=request.getParameterNames();enu.hasMoreElements();){
            String pName=(String)enu.nextElement();
            String pValue=request.getParameter(pName);
	    inputRequest += pName + "=" + pValue;
	    if(enu.hasMoreElements())
		inputRequest += "&";
	}

	//indicamos que la respuesta será de formato xml
        response.setContentType("text/xml; charset=utf-8");
	//en la nueva conexion escribimos el inputRequest rellenado al comienzo, con nuestra request
	PrintWriter pw = new PrintWriter(conn.getOutputStream());
        pw.print(inputRequest);
        pw.flush();
        pw.close();

        StringBuffer sb = new StringBuffer();
	try{
            /*Aqui es donde salta la excepcion, conn.getInputStream()=null por que no se ha conseguido conexion con el servidor al producirse un error interno en él debido a que se le han enviado mal los parámetros */
	    BufferedReader rdr = new BufferedReader(new InputStreamReader(conn.getInputStream()));   
	    String line;
	    String decodedString;
	    while ((line = rdr.readLine()) != null) {
		sb.append(line);
		sb.append(newline);
	    }
	}
	catch(IOException e) { 
	    e.printStackTrace();
    	    sb.append("Error al leer el response! ");
	}
	
	//escribimos la respuesta de la url "prohibida" en la response a nuestro dominio
        PrintWriter out = new PrintWriter(response.getOutputStream());
        out.print(sb.toString());
	out.flush();
        out.close();	
    }
  #6 (permalink)  
Antiguo 06/05/2008, 02:35
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: problema con Proxy y HttpURLConnection

ah, el servidor externo al que me intento conectar es de la forma:
"http://servidor.dominio:puerto/aplicacion/aplicacionServ"
y los datos sobre la operación que quiero realizar, o el mensaje que envio, el destinatario, etc.. se lo tengo que enviar todo por parámetros POST, esa es la api que me ofrece a mi el servidor.
y como dije en el primer mensaje, se lo envio esto a mi proxy de la misma manera solo que añadiendo un parámetro más "URL=http://servidor.dominio:puerto/aplicacion/aplicacionServ" para que sepa a donde conectarse.
es que esto del puente es muy malo y no se si me olvida algo...jeje
Saludos.

Última edición por Ruiskas; 06/05/2008 a las 02:39 Razón: completarlo
  #7 (permalink)  
Antiguo 12/05/2008, 03:19
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: problema con Proxy y HttpURLConnection

el problema no me lo da por los parámetros, es por los permisos. Me da error 403 prohibido, solo me deja acceder a páginas de mi dominio, cuando pido a otro dominio falla.
El caso es que supuestamente cambio el host de mi nueva petición con HttpURLConnection:
Código:
for (Enumeration enu=request.getHeaderNames();enu.hasMoreElements();){
            String pName=(String)enu.nextElement();
            String pValu=request.getHeader( pName );
            if (!pName.toUpperCase().startsWith("HOST")) {
                conn.setRequestProperty(pName,pValu);
            } 
            else {
		//cambiamos el host de la nueva conexion por el del dominio "prohibido"
                conn.setRequestProperty(pName,url.getHost() + ":" + url.getPort());
            }
        }
y en efecto mi nueva conexión tiene el host="dominio_externo" pero el error 403...
si se os ocurre algo!Gracias :P
Saludos.
  #8 (permalink)  
Antiguo 12/05/2008, 05:24
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años
Puntos: 51
Re: problema con Proxy y HttpURLConnection

El 403 te lo da el servidor al que conectas, entonces el problema estaría en que el servidor no te deja conectarte a el desde tu programa. ¿Puede ser que el servidor tenga filtrados los accesos por IP o algo asi?

Habria que mirar por que el servidor responde con un 403. Aunque le cambies la cabecera del host, la IP de origen de tu peticion sigue siendo la de tu maquina, donde tienes el proxy. Si esa maquina no tiene permisos...

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #9 (permalink)  
Antiguo 13/05/2008, 03:58
 
Fecha de Ingreso: abril-2008
Mensajes: 12
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: problema con Proxy y HttpURLConnection

Ok, todo solucionado.
Ya me parecia raro porque miraba con el wireshark los paquetes que enviaba mi servidor y no veía nada con destino al dominio externo.
Resulta que un compañero que trabajaba en otro proyecto, modificó la configuración del Tomcat de nuestro servidor y que usara por defecto otro proxy diferente...y claro, no se dió cuenta que eso afectaba a todas las aplicaciones desplegadas en el Tomcat. Hemos modificado la configuración del Tomcat para que permita a mi proxy hacer las peticiones a los dominios externos y todo funciona bien.
Vamos, que no tenía nada mal! jeje era todo culpa de mi compañero jaja
Muchas gracias GreenEyed! hasta la próxima
Chao.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:31.