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

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

package com.mo.mohttp.impl;


import com.mo.mohttp.*;

import com.mo.mohttp.constant.Headers;
import com.mo.mohttp.http.Entity;
import com.mo.mohttp.http.NameFilePair;
import com.mo.mohttp.http.NameValuePair;
import com.mo.mohttp.misc.TextUtils;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;

import static com.mo.mohttp.constant.Headers.connection;


public class UrlConnectionExecutor  implements Executor{

    private UrlConnectionExecutor(){}

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

    private static UrlConnectionExecutor instance ;

    @Override
    public Response execute(Request request) throws IOException, URISyntaxException {
        boolean writeData = request.getMethod().writeData();


        Charset charset = request.getCharset();
        if(request.getCharset() == null){
            charset = Charset.defaultCharset();
        }
        List paramList = request.getParamList();
        List fileList = request.getFileList();
        StringBuilder stringEntity = request.getStringEntity();
        if(!writeData&&!fileList.isEmpty()){
            throw new IllegalStateException("GET method does not support file upload request!");
        }
        if(stringEntity!=null&&(!fileList.isEmpty()||!paramList.isEmpty())){
            throw new IllegalStateException("cannot get string entity while file or param entity is not empty!");
        }

        URI u = null;
        if(writeData){
            u = request.getUri();
        }else{
            u = TextUtils.buildURI(request.getUri(),charset,request.getParamList());
        }
        URLConnection connection = null;
        try {
            URL url = u.toURL();
            connection = request.getProxy() == null?url.openConnection():url.openConnection(request.getProxy()); // open url connection
            connection.setDoInput(true);
            if(writeData){
                connection.setDoOutput(true);
                connection.setUseCaches(false);
            }
            if(connection instanceof HttpURLConnection){ // this will always happen.
                HttpURLConnection httpURLConnection = (HttpURLConnection)connection;
                httpURLConnection.setRequestMethod(request.getMethod().name());
                if(request.getAllowRedirect()!=null){
                    httpURLConnection.setInstanceFollowRedirects(request.getAllowRedirect());
                }else {
                    httpURLConnection.setInstanceFollowRedirects(false);
                }
            }
            if(request.getTimeout()!=null){
                connection.setConnectTimeout(request.getTimeout());
                connection.setReadTimeout(request.getTimeout());
            }
            if(request.getAgent()!=null){
                connection.setRequestProperty(Headers.agent,request.getAgent());
            }
            if(request.getClient()!=null){
                Client client = request.getClient();
                if(request.getAgent()==null&&client.getUserAgent()!=null){
                    connection.setRequestProperty(Headers.agent,client.getUserAgent());
                }
                for(NameValuePair pair:client.getHeaders()){
                    connection.setRequestProperty(pair.getName(),pair.getValue());
                }
                //set cookies
                if(client.getCookieManager()!=null){
                    CookieManager cookieManager = client.getCookieManager();
                    Map> map = cookieManager.get(u,connection.getRequestProperties());
                    for(Map.Entry> entry:map.entrySet()){
                        String key = entry.getKey();
                        for(String value:entry.getValue()){
                            connection.addRequestProperty(key,value);
                        }
                    }
                }


            }
            boolean flag = true; // whether contentType has been written in header fields;
            for(NameValuePair pair:request.getHeaderList()){
                connection.setRequestProperty(pair.getName(),pair.getValue());
                if(Headers.contentType.equalsIgnoreCase(pair.getName())){
                    flag = false;
                }
            }

            if(writeData){
                connection.setDoOutput(true);
                Entity entity = null; // data entity
                if(fileList.isEmpty()){
                    entity = new FormUrlencodedEntity(paramList,charset);
                }else{
                    entity = new FileMultipartEntity(paramList,fileList,charset);
                }

                if(stringEntity!=null){
                    entity = new StringEntity(stringEntity.toString());
                }

                if(flag) connection.setRequestProperty(Headers.contentType,entity.getContentType());
                    // if content type has not been written in header fields,write entity default content type ( always ContentType.FORM_DEFAULT).
                DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
                entity.writeTo(outputStream);


            }
            if (request.getClient()!=null){
                Map> headerFields = connection.getHeaderFields();
                request.getClient().getCookieManager().put(u,headerFields); //automatically put cookies in response headers to cookie store.
            }

            return new UrlConnectionResponse(connection,request);
        }finally {
            if(connection!=null&&connection instanceof HttpURLConnection){

                ((HttpURLConnection) connection).disconnect();
            }
        }
    }




}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy