예제 #1
0
 private static String getResponseHeaderLocation(String urlActual, URLConnection con)
     throws IOException {
   String location = HttpUtil.getResponseHeader((URLConnection) con, "Location");
   if (!StringUtils.isEmpty(location)) {
     location = location.trim();
     if (location.startsWith("/")) {
       StringTokenizer st = new StringTokenizer(urlActual, "/", true); // true
       // para
       // que
       // devuelva
       // los
       // separadores
       // como
       // tokens
       String domain = "";
       if (st.countTokens() < 4) {
         throw new IOException("No se puede extraer el dominio de la url: " + urlActual);
       } else {
         domain = st.nextToken() + st.nextToken() + st.nextToken() + st.nextToken();
       }
       location = domain + location;
     }
   }
   return location;
 }
예제 #2
0
  /**
   * Realiza una peticción https GET utilizando el proxy especificado (con certificado)
   *
   * @param sUrl Dirección http a resolver
   * @param sProxy Nombre del proxy, p.e. proxy.bde.es
   * @param sProxyPort Puerto del proxy, p.e. 80
   * @return String con el texto devuelto
   * @throws MalformedURLException
   * @throws IOException
   */
  public static String httpsGetCertificado(
      String sUrl,
      String sProxy,
      String sProxyPort,
      int timeoutMs,
      String alias,
      String keyStore,
      String trustStore,
      String keyStorePassword,
      String trustStorePassword,
      String pCookies,
      int numeroDeRedireccionActual)
      throws MalformedURLException, IOException {

    try {
      SSLSocketFactory sc =
          new SSLSocketFactoryGenerator(
                  alias, keyStore, trustStore, keyStorePassword, trustStorePassword)
              .getSSLSocketFactory();
      HttpsURLConnection.setDefaultSSLSocketFactory(sc);

    } catch (Exception e) {

      return null;
    }

    HttpsURLConnection con = null;
    URL url = new URL(sUrl);

    // Creamos la conexión con la url
    if (sProxy != null && sProxyPort != null) {
      Proxy proxy =
          new Proxy(Proxy.Type.HTTP, new InetSocketAddress(sProxy, Integer.parseInt(sProxyPort)));

      con = (HttpsURLConnection) url.openConnection(proxy);
    } else {
      con = (HttpsURLConnection) url.openConnection();
    }

    // Evitamos que se sigan los redirects ya que los redirects los hace sin
    // pasar las cookies lo cual es un bug.
    con.setInstanceFollowRedirects(false);
    // Evitamos el uso de respuestas cacheadas
    con.setUseCaches(false);

    // Fijamos los timeouts
    if (timeoutMs > 0) {
      con.setConnectTimeout(timeoutMs);
      con.setReadTimeout(timeoutMs);
    }
    // Respuesta de la petición
    con.connect();

    InputStream in = con.getInputStream();
    StringBuffer sb = new StringBuffer();

    int c;
    while ((c = in.read()) != -1) sb.append((char) c);
    int responseCode = con.getResponseCode();
    String cookies = HttpUtil.getResponseHeader((URLConnection) con, "Set-Cookie");
    if (!StringUtils.isEmpty(pCookies) && !StringUtils.isEmpty(cookies)) {
      cookies = pCookies + "; " + cookies;
    }
    String location = HttpUtil.getResponseHeaderLocation(sUrl, (URLConnection) con);
    con.disconnect();

    // Comprobación de si es una redirección
    if (responseCode == 301 || responseCode == 302) {
      if (numeroDeRedireccionActual < 10) {
        return httpsGetCertificado(
            location,
            sProxy,
            sProxyPort,
            timeoutMs,
            alias,
            keyStore,
            trustStore,
            keyStorePassword,
            trustStorePassword,
            cookies,
            numeroDeRedireccionActual + 1);
      } else {
        throw new IOException(
            "Se han producido 10 redirecciones consecutivas al solicitar la página web. Se cancela la petición");
      }
    } else {
      return sb.toString();
    }
  }
예제 #3
0
  /** Conexión con identificación web forms via POST mediante parámetros */
  @SuppressWarnings("restriction")
  public static String httpGetWithWebSealLogin(
      String sUrl,
      String urlLogin,
      String urlLogout,
      List<String[]> params,
      String paramEncoding,
      int timeoutMs,
      String sProxy,
      String sProxyPort,
      String sProxyUser,
      String sProxyPwd)
      throws MalformedURLException, IOException {

    // Primera petición autenticándonos ante webseal
    // ---------------------------------------------

    URL url;
    HttpURLConnection urlConn;
    DataOutputStream printout;
    DataInputStream in;
    // URL of CGI-Bin script.
    url = new URL(urlLogin);
    // URL connection channel.

    if (sProxy != null && sProxyPort != null) {
      Proxy proxy =
          new Proxy(Proxy.Type.HTTP, new InetSocketAddress(sProxy, Integer.parseInt(sProxyPort)));

      urlConn = (HttpURLConnection) url.openConnection(proxy);
    } else {
      urlConn = (HttpURLConnection) url.openConnection();
    }

    // Fijamos los timeouts
    if (timeoutMs > 0) {
      urlConn.setConnectTimeout(timeoutMs);
      urlConn.setReadTimeout(timeoutMs);
    }
    // Let the run-time system (RTS) know that we want input.
    urlConn.setDoInput(true);
    // Let the RTS know that we want to do output.
    urlConn.setDoOutput(true);
    // No caching, we want the real thing.
    urlConn.setUseCaches(false);
    // Specify the content type.
    urlConn.setRequestProperty("Referer", sUrl);
    // urlConn.setRequestProperty("Cookie", cookie);
    urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    // Identificación ante el proxy
    if (!StringUtils.isEmpty(sProxyUser)) {
      String auth =
          "Basic "
              + (new sun.misc.BASE64Encoder().encode((sProxyUser + ":" + sProxyPwd).getBytes()));
      urlConn.setRequestProperty("Proxy-Authorization", auth);
    }

    // Add params
    String content = "";
    for (String[] p : params) {
      // Add param separator if needed
      if (content.length() > 0) content += "&";

      // Add param, check it is well formed
      if (p != null && p.length == 2 && p[0] != null && p[1] != null)
        content +=
            URLEncoder.encode(p[0], paramEncoding) + "=" + URLEncoder.encode(p[1], paramEncoding);
    }

    // Send POST output.
    printout = new DataOutputStream(urlConn.getOutputStream());
    printout.writeBytes(content);
    printout.flush();
    printout.close();

    // Get response data.
    in = new DataInputStream(urlConn.getInputStream());
    StringBuffer sb = new StringBuffer("");
    int c;
    while ((c = in.read()) != -1) sb.append((char) c);
    // System.out.println(sb.toString());

    int code = urlConn.getResponseCode();
    if (code != 200) {
      throw new IOException("El sitio web devolvió un código HTTP de error: " + code);
    }

    // Recorremos los headers para memorizar la cookie que nos ha devuelto
    // el web site
    String cookie2 = HttpUtil.getResponseHeader(urlConn, "Set-Cookie");
    if (StringUtils.isEmpty(cookie2)) {
      throw new IOException(
          "El sitio web no admitió el usuario o la contraseña indicadas ya que no hay cookies.");
    }

    String sRetorno = "";
    // Una vez que el web site nos ha dado la cookie, realizamos la petición
    // que deseabamos ---------------------------------------------
    try {
      sRetorno =
          HttpUtil.httpGet_Completo(
              sUrl, sProxy, sProxyPort, sProxyUser, sProxyPwd, null, null, cookie2, timeoutMs, 0);
      // System.out.println(sRetorno);
      return sRetorno;

    } catch (Exception e) {
      throw new IOException(
          "No se ha podido realizar la petición HTTP al sistema monitorizado: "
              + (e.getMessage() == null ? "(sin información adicional)" : e.getMessage()));
    } finally {
      // Cerramos la sesión en web site
      try {
        if (!StringUtils.isEmpty(cookie2) && !StringUtils.isEmpty(urlLogout)) {
          HttpUtil.httpGet_Completo(
              urlLogout,
              sProxy,
              sProxyPort,
              sProxyUser,
              sProxyPwd,
              null,
              null,
              cookie2,
              timeoutMs,
              0);
        }
      } catch (Exception e) {
        Logger.getRootLogger()
            .error(
                "No se ha podido realizar el logOut del sitio web: "
                    + (e.getMessage() == null ? "(sin información adicional)" : e.getMessage()));
      }
    }
  }
예제 #4
0
  /**
   * Realiza una peticción https GET utilizando el proxy especificado
   *
   * @param sUrl Dirección http a resolver
   * @param sProxy Nombre del proxy, p.e. proxy.bde.es
   * @param sProxyPort Puerto del proxy, p.e. 80
   * @return String con el texto devuelto
   * @throws MalformedURLException
   * @throws IOException
   */
  public static String httpsGet(
      String sUrl,
      String sProxy,
      String sProxyPort,
      int timeoutMs,
      String pCookies,
      int numeroDeRedireccionActual)
      throws MalformedURLException, IOException {

    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts =
        new TrustManager[] {
          new X509TrustManager() {

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
              return null;
            }

            @Override
            public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {}

            @Override
            public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {}
          }
        };

    // Install the all-trusting trust manager
    try {
      SSLContext sc = SSLContext.getInstance("SSL");
      sc.init(null, trustAllCerts, new java.security.SecureRandom());
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {

      return null;
    }

    HttpsURLConnection con = null;
    URL url = new URL(sUrl);

    // Creamos la conexión con la url
    if (sProxy != null && sProxyPort != null) {
      Proxy proxy =
          new Proxy(Proxy.Type.HTTP, new InetSocketAddress(sProxy, Integer.parseInt(sProxyPort)));

      con = (HttpsURLConnection) url.openConnection(proxy);
    } else {
      con = (HttpsURLConnection) url.openConnection();
    }

    // Evitamos que se sigan los redirects ya que los redirects los hace sin
    // pasar las cookies lo cual es un bug.
    con.setInstanceFollowRedirects(false);
    // Evitamos el uso de respuestas cacheadas
    con.setUseCaches(false);

    // Fijamos los timeouts
    if (timeoutMs > 0) {
      con.setConnectTimeout(timeoutMs);
      con.setReadTimeout(timeoutMs);
    }

    // Enviamos las cookies
    if (!StringUtils.isEmpty(pCookies)) {
      con.setRequestProperty("Cookie", pCookies);
    }

    // Respuesta de la petición
    con.connect();

    InputStream in = con.getInputStream();
    StringBuffer sb = new StringBuffer();

    int c;
    while ((c = in.read()) != -1) sb.append((char) c);

    int responseCode = con.getResponseCode();
    String cookies = HttpUtil.getResponseHeader((URLConnection) con, "Set-Cookie");
    if (!StringUtils.isEmpty(pCookies) && !StringUtils.isEmpty(cookies)) {
      cookies = pCookies + "; " + cookies;
    }
    String location = HttpUtil.getResponseHeaderLocation(sUrl, (URLConnection) con);
    con.disconnect();

    // Comprobación de si es una redirección
    if (responseCode == 301 || responseCode == 302) {
      if (numeroDeRedireccionActual < 10) {
        Logger.getRootLogger().debug("Redirigiendo a " + location);
        Logger.getRootLogger().debug("Cookies enviadas:" + cookies);
        return httpsGet(
            location, sProxy, sProxyPort, timeoutMs, cookies, numeroDeRedireccionActual);
      } else {
        throw new IOException(
            "Se han producido 10 redirecciones consecutivas al solicitar la página web. Se cancela la petición");
      }
    } else {
      return sb.toString();
    }
  }
예제 #5
0
  /**
   * Conexión con identificación básica o nula
   *
   * @throws Exception
   */
  @SuppressWarnings("restriction")
  private static String httpGet_Completo(
      String sUrl,
      String sProxy,
      String sProxyPort,
      String sProxyUser,
      String sProxyPwd,
      String urluser,
      String urlpassword,
      String pCookies,
      int timeoutMs,
      int numeroDeRedireccionActual)
      throws MalformedURLException, IOException {
    URL url = new URL(sUrl);
    HttpURLConnection con = null;

    // Creamos la conexión con la url
    if (sProxy != null && sProxyPort != null) {
      Proxy proxy =
          new Proxy(Proxy.Type.HTTP, new InetSocketAddress(sProxy, Integer.parseInt(sProxyPort)));

      con = (HttpURLConnection) url.openConnection(proxy);
    } else {
      con = (HttpURLConnection) url.openConnection();
    }
    // Evitamos que se sigan los redirects ya que los redirects los hace sin
    // pasar las cookies lo cual es un bug.
    con.setInstanceFollowRedirects(false);
    // Evitamos el uso de respuestas cacheadas
    con.setUseCaches(false);

    // Fijamos los timeouts. Si se indica un valor 0 o negativo entonces no
    // se fija ningún timeout
    if (timeoutMs > 0) {
      con.setConnectTimeout(new Integer(timeoutMs).intValue());
      con.setReadTimeout(new Integer(timeoutMs).intValue());
    }

    // Identificación ante el proxy
    if (!StringUtils.isEmpty(sProxyUser)) {
      String auth =
          "Basic "
              + (new sun.misc.BASE64Encoder().encode((sProxyUser + ":" + sProxyPwd).getBytes()));
      con.setRequestProperty("Proxy-Authorization", auth);
    }

    // Identificación ante la página
    if (!StringUtils.isEmpty(urluser)) {
      String auth =
          "Basic "
              + (new sun.misc.BASE64Encoder().encode((urluser + ":" + urlpassword).getBytes()));
      con.setRequestProperty("Authorization", auth);
    }

    // Enviamos las cookies
    if (!StringUtils.isEmpty(pCookies)) {
      con.setRequestProperty("Cookie", pCookies);
    }

    // Se modifica el User-Agent para que funcione el Test AGE-1 del Tester
    con.setRequestProperty(
        "User-Agent",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)");

    // Respuesta de la petición
    con.connect();
    InputStream in = con.getInputStream();
    StringBuffer sb = new StringBuffer();

    int c;
    while ((c = in.read()) != -1) sb.append((char) c);
    int responseCode = con.getResponseCode();
    String cookies = HttpUtil.getResponseHeader((URLConnection) con, "Set-Cookie");
    if (!StringUtils.isEmpty(pCookies) && !StringUtils.isEmpty(cookies)) {
      cookies = pCookies + "; " + cookies;
    }
    String location = HttpUtil.getResponseHeaderLocation(sUrl, (URLConnection) con);
    con.disconnect();

    // Comprobación de si es una redirección
    if (responseCode == 301 || responseCode == 302) {
      if (numeroDeRedireccionActual < 10) {
        return httpGet_Completo(
            location,
            sProxy,
            sProxyPort,
            sProxyUser,
            sProxyPwd,
            null,
            null,
            cookies,
            timeoutMs,
            numeroDeRedireccionActual + 1);
      } else {
        throw new IOException(
            "Se han producido 10 redirecciones consecutivas al solicitar la página web. Se cancela la petición");
      }
    } else {
      return sb.toString();
    }
  }