/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2015 Aimluck,Inc.
 * http://www.aipo.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.util;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 *
 */
public class ALURLConnectionUtils {
  /** User-Agent */
  public static final String USER_AGENT =
    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; Avant Browser)";

  /** Accept-Encoding */
  public static final String ACCEPT_ENCODING = "identity";

  /**
   * HttpURLConnectionまたはHttpsURLConnectionを返す
   * 
   * @param url
   * @return　HttpURLConnectionまたはHttpsURLConnection
   * @throws NoSuchAlgorithmException
   * @throws KeyManagementException
   * @throws IOException
   */
  public static HttpURLConnection openUrlConnection(URL connectURL)
      throws NoSuchAlgorithmException, KeyManagementException, IOException {

    HttpURLConnection urlconnection = null;

    // SSLHandshakeExceptionが発生しないか調べる
    urlconnection = (HttpURLConnection) connectURL.openConnection();
    try {
      urlconnection.getResponseMessage();
    } catch (SSLHandshakeException ex) {
      // SSLHandshakeExceptionの場合には証明書をチェックしないhttps接続に切り替える
      if ("https".equals(connectURL.getProtocol())) {
        TrustManager[] tm = { new X509TrustManager() {
          @Override
          public X509Certificate[] getAcceptedIssuers() {
            return null;
          }

          @Override
          public void checkClientTrusted(X509Certificate[] chain,
              String authType) throws CertificateException {
          }

          @Override
          public void checkServerTrusted(X509Certificate[] chain,
              String authType) throws CertificateException {
          }
        } };
        SSLContext sslcontext = SSLContext.getInstance("SSL");
        sslcontext.init(null, tm, null);

        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
          @Override
          public boolean verify(String hostname, SSLSession session) {
            return true;
          }
        });

        urlconnection = (HttpsURLConnection) connectURL.openConnection();

        ((HttpsURLConnection) urlconnection).setSSLSocketFactory(sslcontext
          .getSocketFactory());

        return urlconnection;
      }
    }

    // http接続の場合
    urlconnection = (HttpURLConnection) connectURL.openConnection();

    return urlconnection;
  }
}
