All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mo.mohttp.impl.HttpClientExecutor Maven / Gradle / Ivy

package com.mo.mohttp.impl;


import com.mo.mohttp.*;
import com.mo.mohttp.constant.ContentType;
import com.mo.mohttp.http.NameFilePair;
import com.mo.mohttp.http.NameValuePair;
import com.mo.mohttp.misc.Args;
import com.mo.mohttp.misc.TextUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;

import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;
import java.util.ArrayList;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class HttpClientExecutor implements Executor{



    private HttpClientExecutor(){}

    public static HttpClientExecutor getInstance(){
        synchronized (HttpClientExecutor.class){
            if(instance == null){
                instance =  new HttpClientExecutor();
            }
            return instance;
        }
    }

    public CookieStore getCookieStore(Client client){
        Args.notNull(client,"client");
        return clientCookieStoreMap.get(client);
    }

    public HttpClient getHttpClient(Client client){
        Args.notNull(client,"client");
        return clientHttpClientMap.get(client);
    }

    private static HttpClientExecutor instance;

    private Map clientCookieStoreMap = new ConcurrentHashMap<>();

    private Map clientHttpClientMap = new ConcurrentHashMap<>();

    @Override
    public Response execute(Request request)  throws IOException, URISyntaxException {
        Client client = request.getClient();
        HttpClient httpClient = null;
        if(client == null){
            httpClient = HttpClients.createDefault();  //create default HttpClient
        }else{
            httpClient = clientHttpClientMap.get(client);
            if(httpClient == null){
                CookieStore cookieStore = clientCookieStoreMap.get(client);
                if(cookieStore==null){
                    clientCookieStoreMap.put(client,cookieStore = new BasicCookieStore()); //create cookie store.
                }
                HttpClientBuilder builder = HttpClients.custom().setDefaultCookieStore(cookieStore);
                if(client.getHeaders()!=null){  // set default headers
                    List
headerList = new ArrayList<>(); for(NameValuePair nameValuePair:client.getHeaders()){ headerList.add(new BasicHeader(nameValuePair.getName(),nameValuePair.getValue())); } builder.setDefaultHeaders(headerList); } if(client.getUserAgent()!=null){ builder.setUserAgent(client.getUserAgent()); } clientHttpClientMap.put(client,httpClient = builder.build()); } } Charset charset = request.getCharset(); if(request.getCharset() == null){ charset = Charset.defaultCharset(); } Http.Method method = request.getMethod(); URI uri = request.getUri(); List paramList = request.getParamList(); List fileList = request.getFileList(); Integer time = request.getTimeout(); HttpRequestBase httpRequestBase = null; boolean writeData = method.writeData(); if(writeData){ httpRequestBase = new MoHttpRequestBase(method); //HttpEntityEnclosingRequestBase httpRequestBase.setURI(uri); }else{ httpRequestBase = new HttpGet(TextUtils.buildURI(uri,charset,paramList)); // build uri for get Method (add param and header fields) } if(!fileList.isEmpty()&&!writeData){ throw new IllegalStateException("GET method does not support file upload request!"); } for(NameValuePair pair:request.getHeaderList()){ httpRequestBase.addHeader(pair.getName(),pair.getValue()); // add header fields } RequestConfig.Builder builder = RequestConfig.custom(); if(time!=null){ //set timeout builder.setConnectTimeout(time).setSocketTimeout(time).setConnectionRequestTimeout(time); } if(request.getAllowRedirect()!=null){ //set allow redirect builder.setRedirectsEnabled(request.getAllowRedirect()); } if(request.getProxy()!=null&&request.getProxy().address() instanceof InetSocketAddress){ //cast java.net.Proxy -> org.apache.http.HttpHost Proxy proxy = request.getProxy(); InetSocketAddress address = (InetSocketAddress) proxy.address(); HttpHost httpHost = new HttpHost(address.getAddress()); builder.setProxy(httpHost); } RequestConfig requestConfig = builder.build(); httpRequestBase.setConfig(requestConfig); if(writeData){ MoHttpRequestBase mo = (MoHttpRequestBase)httpRequestBase; HttpEntity entity = null; if(fileList.isEmpty()){ List nvps = new ArrayList(); for(NameValuePair pair:paramList){ nvps.add(new BasicNameValuePair(pair.getName(),pair.getValue())); } entity = new UrlEncodedFormEntity(nvps,charset); //write param fields }else{ MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); for(NameFilePair pair:fileList){ //write file body ,requires http mime. String filename = pair.getValue().getName(); String content = ContentType.findMimeByExtension(TextUtils.fileExt(filename)); // contentType entityBuilder.addBinaryBody(pair.getName(),pair.getValue(), org.apache.http.entity.ContentType.create(content),filename); } for(NameValuePair pair:paramList){ entityBuilder.addTextBody(pair.getName(),pair.getValue()); } entity = entityBuilder.build(); } if(request.getStringEntity()!=null){ entity = new StringEntity(request.getStringEntity().toString(),charset); } mo.setEntity(entity); } try { HttpResponse httpResponse = httpClient.execute(httpRequestBase); return new HttpClientResponse(httpResponse,request); }finally { httpRequestBase.abort(); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy