Proyectos de Subversion Android Microlearning

Rev

Autoría | Ultima modificación | Ver Log |

package com.cesams.twogetskills.library;

import android.util.Log;

import com.cesams.twogetskills.Constants;

import java.io.File;
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;

public class Http {
   public final static int CACHE_SIZE = 100 * 1024 * 1024; // 100MB
    private final static String SSL = "SSL";
    private File mCacheDir;
    private String mDeviceUuid;
    private String mSecret;
    private int mCreated;
    private int mRand;
    private boolean mUsingHeaderInterceptor;

    public Http(File cacheDir)
    {
        mDeviceUuid = "";
        mSecret = "";
        mCreated = 0;
        mRand = 0;
        mCacheDir = cacheDir;
    }

    public Http(File cacheDir, String deviceUuid, String secret, int created, int rand)
    {
        mDeviceUuid = deviceUuid;
        mSecret = secret;
        mCreated = created;
        mRand = rand;
        mUsingHeaderInterceptor = true;
        mCacheDir = cacheDir;
    }


    public OkHttpClient getHttpClient(boolean usingCache) throws Exception
    {
        Interceptor headerInterceptor = null;

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BASIC);

        if(mUsingHeaderInterceptor) {

            headerInterceptor = new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request newRequest = chain.request().newBuilder()
                            .addHeader(Constants.HTTP_HEADER_ACCEPT, Constants.HTTP_HEADER_ACCEPT_VALUE)
                            .addHeader(Constants.HTTP_HEADER_SECURITY_TOKEN, mDeviceUuid)
                            .addHeader(Constants.HTTP_HEADER_SECURITY_SECRET, mSecret)
                            .addHeader(Constants.HTTP_HEADER_SECURITY_CREATED, String.valueOf(mCreated))
                            .addHeader(Constants.HTTP_HEADER_SECURITY_RAND, String.valueOf(mRand))
                            .build();
                    return chain.proceed(newRequest);
                }
            };
        }

        TrustManager [] trustAllCerts       = new TrustManager [] { trustManager () };

        SSLContext sslContext = SSLContext.getInstance (SSL);
        sslContext.init (null, trustAllCerts, new SecureRandom ());

        SSLSocketFactory sslSocketFactory   = sslContext.getSocketFactory ();

        OkHttpClient.Builder builder        = new OkHttpClient.Builder ();

        if(usingCache) {
            Log.d("GetHttpClient", "usingCache = true");
            builder.cache(new Cache(mCacheDir, CACHE_SIZE));
        }

        builder.addInterceptor(logging);
        if(headerInterceptor != null) {
            builder.addInterceptor(headerInterceptor);
        }

        builder.sslSocketFactory (sslSocketFactory, (X509TrustManager)trustAllCerts [0]);
        builder.hostnameVerifier (hostnameVerifier ());

        return builder.build ();
    }

    private static TrustManager trustManager () {
        return new X509TrustManager () {

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

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

            @Override
            public X509Certificate [] getAcceptedIssuers () {
                return new X509Certificate [] {  };
            }
        };
    }

    private static HostnameVerifier hostnameVerifier () {
        return new HostnameVerifier () {

            @Override
            public boolean verify (String hostname, SSLSession session) {
                return true;
            }
        };
    }
}