com.davidivins.checkin4me.oauth.OAuth2Request.java Source code

Java tutorial

Introduction

Here is the source code for com.davidivins.checkin4me.oauth.OAuth2Request.java

Source

//*****************************************************************************
//    This file is part of CheckIn4Me.  Copyright  2010  David Ivins
//
//    CheckIn4Me is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    CheckIn4Me 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 General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with CheckIn4Me.  If not, see <http://www.gnu.org/licenses/>.
//*****************************************************************************
package com.davidivins.checkin4me.oauth;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.net.ssl.SSLException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.AbstractVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;

import com.davidivins.checkin4me.util.Request;
import com.davidivins.checkin4me.util.Response;

import android.util.Log;

/**
 * OAuthRequest
 * 
 * @author david ivins
 */
public class OAuth2Request extends Request {
    private static final String TAG = OAuth2Request.class.getSimpleName();
    private static final String RESPONSE_ENCODING = "UTF-8";

    /**
     * OAuth2Request
     * 
     * @param method
     * @param host
     * @param endpoint
     */
    public OAuth2Request(String method, String host, String endpoint) {
        super(method, host, endpoint);
    }

    /**
     * execute
     * 
     * @return Response from executing the request
     */
    @Override
    public Response execute() {
        BufferedReader page = null;
        OAuthResponse response = new OAuthResponse();

        Log.i(TAG, "executing OAuth 2.0 request...");

        // make request
        String url_string = generateURL();
        Log.i(TAG, "request url = " + url_string);

        // make http request
        try {
            // make background http request for temporary token
            HttpClient httpclient = getTolerantClient();
            HttpResponse http_response;

            if (method.equals("GET")) {
                HttpGet httpget = new HttpGet(url_string);
                http_response = httpclient.execute(httpget);
            } else {
                HttpPost httppost = new HttpPost(url_string);
                http_response = httpclient.execute(httppost);
            }

            // get content of request
            page = new BufferedReader(
                    new InputStreamReader(http_response.getEntity().getContent(), RESPONSE_ENCODING));

            // read response into a string
            String line;
            while ((line = page.readLine()) != null) {
                Log.i(TAG, "line = " + line);
                response.appendResponseString(line);
            }

            response.setSuccessStatus(true);
        } catch (IOException e) {
            response.set(false, e.getMessage());
            Log.e(TAG, "EXCEPTION: " + e.getMessage());
        }

        Log.i(TAG, "response.getSuccessStatus = " + response.getSuccessStatus());
        Log.i(TAG, "response.getResponseString = " + response.getResponseString());
        return response;
    }

    /**
     * generateURL
     * 
     * @return URL for the request
     */
    private String generateURL() {
        return host + endpoint + "?" + getURIQueryParametersAsString();
    }

    /**
     * getTolerantClient
     * 
     * Stolen from stackoverflow.com
     * http://stackoverflow.com/questions/3135679/android-httpclient-hostname-in-certificate-didnt-match-example-com-exa
     * 
     * @return DefaultttpClient
     */
    public DefaultHttpClient getTolerantClient() {
        DefaultHttpClient client = new DefaultHttpClient();

        SSLSocketFactory sslSocketFactory = (SSLSocketFactory) client.getConnectionManager().getSchemeRegistry()
                .getScheme("https").getSocketFactory();

        final X509HostnameVerifier delegate = sslSocketFactory.getHostnameVerifier();

        if (!(delegate instanceof TolerantVerifier))
            sslSocketFactory.setHostnameVerifier(new TolerantVerifier(delegate));

        return client;
    }

    /**
     * TolerantVerifier
     * 
     * Stolen from stackoverflow.com
     * http://stackoverflow.com/questions/3135679/android-httpclient-hostname-in-certificate-didnt-match-example-com-exa
     * 
     * @author noah@stackoverflow
     */
    class TolerantVerifier extends AbstractVerifier {
        private final X509HostnameVerifier delegate;

        /**
         * TolerantVerfier
         * 
         * @param delegate
         */
        public TolerantVerifier(final X509HostnameVerifier delegate) {
            this.delegate = delegate;
        }

        /**
         * verify
         * 
         * @param host
         * @param cns
         * @param subjectAlts
         */
        public final void verify(String host, String[] cns, String[] subjectAlts) //throws SSLException 
        {
            boolean ok = false;

            try {
                delegate.verify(host, cns, subjectAlts);
            } catch (SSLException e) {
                for (String cn : cns) {
                    if (cn.startsWith("*.")) {
                        try {
                            delegate.verify(host, new String[] { cn.substring(2) }, subjectAlts);
                            ok = true;
                        } catch (Exception e1) {
                            Log.e(TAG, "We are here and I'm not sure why...");
                        }
                    }
                }

                if (!ok)
                    Log.i(TAG, "Failed verification"); //throw e;
            }
        }
    }
}