package com.zcsoft.androidclient.http;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;

import com.zcsoft.androidclient.tools.MyLog;

public class HttpRequest {
    
    /*********************
     * 请求URL的数据
     * @param strURL - 请求数据的url
     * @return    服务端返回的数据
     */
    public static final String requestURL(String strURL){
        MyLog.i("请求的url:"+strURL);
        String resString = "无网络";
        try
        {
            //请求URL的数据
            HttpGet httpRequest = new HttpGet(strURL);
            httpRequest.addHeader("Accept-Encoding", "gzip");
            
            HttpParams httpParam = new BasicHttpParams();
            //设置连接超时和请求超时时间为8秒
            HttpConnectionParams.setConnectionTimeout(httpParam, 5000);
            HttpConnectionParams.setSoTimeout(httpParam, 5000);
            
            HttpClient httpClient = new DefaultHttpClient(httpParam);
            
            HttpResponse httpResponse = httpClient.execute(httpRequest); 
            int nStatus = httpResponse.getStatusLine().getStatusCode();
            if (nStatus == HttpStatus.SC_OK) {
                Header contentEncoding = httpResponse.getFirstHeader("Content-Encoding");
                Header contentLenght = httpResponse.getFirstHeader("Content-Length");
                if(contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")){
                    //解压缩GZip数据
                    int nDataLength=Integer.parseInt(contentLenght.getValue());
                    if(nDataLength > 1024*4){
                        resString= uncompressBigGZipData(httpResponse.getEntity().getContent());
                    }else
                        resString= uncompressGZipData(httpResponse.getEntity().getContent());
                }else{
                    resString= EntityUtils.toString(httpResponse.getEntity());
                }
            } 
            else if (nStatus == HttpStatus.SC_REQUEST_TIMEOUT){
                //超时
                resString = "超时";
            }
            else{
                resString = "响应码非200";
            }
            
        }
        catch (Exception e) 
        {  
          resString = "连接异常";
          MyLog.i(e.getMessage());
        }
        finally {  
            //这里要关闭一下吗?
             } 
        MyLog.i("请求结果:"+resString);
        return resString;
    }
    
    /***********************
     * 解压缩一般的数据
     * @param instream    - 要解压的数据流
     * @return - 解压以后的字符串数据
     */
    public static final String uncompressGZipData(InputStream instream){
        //解压缩一般的数据
        //分配缓存较小
        try
        {
            GZIPInputStream gin = new GZIPInputStream(instream);
            
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(gin));                     
            char[] buf = new char[1024*12];
            br.read(buf);
            
            gin.close();
            String strRet = new String(buf);
            return strRet;
        }
        catch(Exception e)
        {
            return null;
        }
    }
    
    
    /***********************
     * 解压缩大数据包 
     * @param instream    - 要解压的数据流
     * @return - 解压以后的字符串数据
     */
    public static final String uncompressBigGZipData(InputStream instream){
        //解压缩大数据包 
        //专为大数据准备
        //分配大的缓存
        try
        {
            GZIPInputStream gin = new GZIPInputStream(instream);
            
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(gin));                     
            char[] buf = new char[1024*200];
            br.read(buf);
            
            gin.close();
            String strRet = new String(buf);
            return strRet;
        }
        catch(Exception e)
        {
            return null;
        }
    }
}