com.mothsoft.alexis.util.NetworkingUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.mothsoft.alexis.util.NetworkingUtil.java

Source

/*   Copyright 2012 Tim Garrett, Mothsoft LLC
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.mothsoft.alexis.util;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.DateParseException;
import org.apache.http.impl.cookie.DateUtils;
import org.apache.log4j.Logger;

public class NetworkingUtil {

    public static final long MAX_CONTENT_LENGTH = 1024 * 1024 * 2;

    private static final Logger logger = Logger.getLogger(NetworkingUtil.class);

    private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    public static HttpClientResponse get(final URL url, final String etag, final Date lastModifiedDate)
            throws IOException {

        final HttpGet get = new HttpGet(url.toExternalForm());

        get.addHeader("Accept-Charset", "UTF-8");

        if (etag != null) {
            get.addHeader("If-None-Match", etag);
        }

        if (lastModifiedDate != null) {
            get.addHeader("If-Modified-Since", DateUtils.formatDate(lastModifiedDate));
        }

        int statusCode = -1;
        String responseEtag = null;
        Date responseLastModifiedDate = null;

        final HttpClient client = getClient();
        HttpResponse response = client.execute(get);
        statusCode = response.getStatusLine().getStatusCode();

        InputStream is = null;
        Charset charset = null;

        if (statusCode == 304) {
            responseEtag = etag;
            responseLastModifiedDate = lastModifiedDate;
        } else {
            final Header responseEtagHeader = response.getFirstHeader("Etag");
            if (responseEtagHeader != null) {
                responseEtag = responseEtagHeader.getValue();
            }

            final Header lastModifiedDateHeader = response.getFirstHeader("Last-Modified");
            if (lastModifiedDateHeader != null) {
                try {
                    responseLastModifiedDate = DateUtils.parseDate(lastModifiedDateHeader.getValue());
                } catch (DateParseException e) {
                    responseLastModifiedDate = null;
                }
            }

            final HttpEntity entity = response.getEntity();

            // here's where to do intelligent checking of content type, content
            // length, etc.
            if (entity.getContentLength() > MAX_CONTENT_LENGTH) {
                get.abort();
                throw new IOException("Exceeded maximum content length, length is: " + entity.getContentLength());
            }

            is = entity.getContent();
            charset = getCharset(entity);
        }
        return new HttpClientResponse(get, statusCode, responseEtag, responseLastModifiedDate, is, charset);
    }

    public static HttpClientResponse post(final URL url, final List<NameValuePair> params) throws IOException {
        final HttpPost post = new HttpPost(url.toExternalForm());

        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params);
        post.setEntity(formEntity);

        post.addHeader("Accept-Charset", "UTF-8");

        final HttpClient client = getClient();
        HttpResponse response = client.execute(post);
        int status = response.getStatusLine().getStatusCode();

        if (status != 200) {
            throw new IOException("status: " + status);
        }

        final HttpEntity entity = response.getEntity();
        final InputStream is = entity.getContent();
        final Charset charset = getCharset(entity);

        return new HttpClientResponse(post, status, null, null, is, charset);
    }

    private static HttpClient getClient() {
        final HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
        client.getParams().setParameter("http.socket.timeout", new Integer(300000));
        client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
        return client;
    }

    private static Charset getCharset(final HttpEntity entity) {
        final Header encodingHeader = entity.getContentEncoding();
        final String encoding = encodingHeader == null ? null : encodingHeader.getValue();

        if (encoding != null && Charset.isSupported(encoding)) {
            return Charset.forName(encoding);
        } else {
            if (logger.isDebugEnabled()) {
                logger.debug("Charset: " + encoding + " is not supported");
            }
        }

        return DEFAULT_CHARSET;
    }

}