예제 #1
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();
    }
  }
예제 #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 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();
    }
  }