Ver Mensaje Individual
  #5 (permalink)  
Antiguo 06/05/2008, 02:25
Ruiskas
 
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();	
    }