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

com.ksyun.ks3.http.RequestBuilder Maven / Gradle / Ivy

package com.ksyun.ks3.http;

import com.ksyun.ks3.MD5DigestCalculatingInputStream;
import com.ksyun.ks3.RepeatableFileInputStream;
import com.ksyun.ks3.RepeatableInputStream;
import com.ksyun.ks3.config.Constants;
import com.ksyun.ks3.dto.Authorization;
import com.ksyun.ks3.exception.Ks3ClientException;
import com.ksyun.ks3.exception.client.ClientIllegalArgumentExceptionGenerator;
import com.ksyun.ks3.service.Ks3ClientConfig;
import com.ksyun.ks3.service.request.GetObjectRequest;
import com.ksyun.ks3.service.request.HeadObjectRequest;
import com.ksyun.ks3.service.request.Ks3WebServiceRequest;
import com.ksyun.ks3.service.request.SSECustomerKeyRequest;
import com.ksyun.ks3.signer.Signer;
import com.ksyun.ks3.utils.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.*;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.params.CoreProtocolPNames;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;

/**
 * @author lijunwei[[email protected]]  
 *
 * @date 2015年4月17日 下午5:16:35
 *
 * @description
 **/
public class RequestBuilder {

    public static void buildRequest(Ks3WebServiceRequest ks3Request, Request request, Authorization auth, Ks3ClientConfig ks3config) {
        ks3Request.validateParams();
        if (ks3Request.getRequestConfig() != null) {
            Map headers = ks3Request.getRequestConfig().getExtendHeaders();
            if (headers != null)
                request.getHeaders().putAll(headers);
        }
        ks3Request.buildRequest(request);
        request.addHeaderIfNotContains(HttpHeaders.UserAgent.toString(), ks3Request.getRequestConfig().getUserAgent());
        if ((ks3config != null && !ks3config.isUseGzip()) &&
                (ks3Request instanceof GetObjectRequest || ks3Request instanceof HeadObjectRequest)) {
            request.addHeader("Accept-Encoding", "none");
        }
        if (!request.isPresign()) {
            request.addHeaderIfNotContains(HttpHeaders.ContentType.toString(), "application/xml");
            if (request.getHeaders().get(HttpHeaders.ContentType.toString()) == null) {
                request.getHeaders().remove(HttpHeaders.ContentType.toString());
            }
        }
        String endpoint0 = ks3Request.getRequestConfig().getEndpoint();
        if (StringUtils.isBlank(endpoint0)) {
            endpoint0 = ks3config.getEndpoint();
        }
        if (StringUtils.isBlank(endpoint0)) {
            throw new Ks3ClientException("endpoint is blank");
        }
        request.setEndpoint(endpoint0);

        //sign request
        try {
            if (auth != null) {
                String signerString = ks3config.getSignerClass();
                Signer signer = (Signer) Class.forName(signerString).newInstance();
                signer.sign(auth, request);
            } else if (!ks3config.isAllowAnonymous()) {
                throw new Ks3ClientException("sdk is not allowed to send anonymous request");
            }
        } catch (Exception e) {
            throw new Ks3ClientException(e);
        }
        //用户自己指定的签名
        if (!request.isPresign()) {
            String userAuth = ks3Request.getRequestConfig().getExtendHeaders().get(HttpHeaders.Authorization.toString());
            if (!StringUtils.isBlank(userAuth)) {
                request.addHeader(HttpHeaders.Authorization, userAuth);
            }
        }

        for (String headerName : request.getHeaders().keySet()) {

            if (!Pattern.matches(Constants.headerReg, headerName)) {

                throw ClientIllegalArgumentExceptionGenerator.notCorrect("header", headerName, Constants.headerReg);

            }

        }
    }

    public static HttpRequestBase buildHttpRequest(Ks3WebServiceRequest ks3Request, Request request, Authorization auth, Ks3ClientConfig ks3config) {
        //build http request
        HttpMethod method = request.getMethod();
        HttpRequestBase httpRequest = null;
        //wrap content
        if (request.getContent() != null && !(request.getContent() instanceof RepeatableInputStream) && !(request.getContent() instanceof RepeatableFileInputStream))
            request.setContent(new RepeatableInputStream(request.getContent(), Constants.DEFAULT_STREAM_BUFFER_SIZE));
        //cal md5 in client
        if (!skipMD5Check(ks3Request, request))
            if (!(request.getContent() instanceof MD5DigestCalculatingInputStream))
                request.setContent(new MD5DigestCalculatingInputStream(request.getContent()));
        //get request url
        String url = request.toUrl(ks3config);
        //init http request
        InputStream requestBody = request.getContent();
        if (method == HttpMethod.POST) {
            HttpPost postMethod = new HttpPost(url);
            if (requestBody != null) {
                String length = request.getHeaders().get(
                        HttpHeaders.ContentLength.toString());
                HttpEntity entity = new RepeatableInputStreamRequestEntity(
                        requestBody, length);
                if (!StringUtils.checkLong(length) || Long.parseLong(length) < 0) {
                    try {
                        entity = new BufferedHttpEntity(entity);
                    } catch (IOException e) {
                        e.printStackTrace();
                        throw new Ks3ClientException(
                                "初始化Http Request出错(" + e + ")", e);
                    }
                }
                postMethod.setEntity(entity);
            }
            httpRequest = postMethod;
        } else if (method == HttpMethod.GET) {
            HttpGet getMethod = new HttpGet(url);
            httpRequest = getMethod;
        } else if (method == HttpMethod.PUT) {
            HttpPut putMethod = new HttpPut(url);
            httpRequest = putMethod;

            putMethod.getParams().setParameter(
                    CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
            if (requestBody != null) {
                String length = request.getHeaders()
                        .get(HttpHeaders.ContentLength.toString());
                HttpEntity entity = null;
                if (length == null || length.trim().equals("0")) {
                    try {
                        entity = new RepeatableInputStreamRequestEntity(
                                requestBody, "-1");
                        entity = new BufferedHttpEntity(entity);
                    } catch (IOException e) {
                        e.printStackTrace();
                        throw new Ks3ClientException("初始化Http Request出错(" + e
                                + ")", e);
                    }
                } else {
                    entity = new RepeatableInputStreamRequestEntity(
                            requestBody, length);
                }
                putMethod.setEntity(entity);
            }
        } else if (method == HttpMethod.DELETE) {
            HttpDelete deleteMethod = new HttpDelete(url);
            httpRequest = deleteMethod;
        } else if (method == HttpMethod.HEAD) {
            HttpHead headMethod = new HttpHead(url);
            httpRequest = headMethod;
        } else {
            // 永远不会到这儿
            throw new Ks3ClientException("Unknow http method : "
                    + method);
        }
        //add headers
        for (Entry aHeader : request.getHeaders().entrySet()) {
            if (!httpRequest.containsHeader(aHeader.getKey()))
                httpRequest.setHeader(aHeader.getKey(), aHeader.getValue());
        }

        httpRequest.removeHeaders(HttpHeaders.ContentLength.toString());
        return httpRequest;
    }

    private static boolean skipMD5Check(Ks3WebServiceRequest wsReq, Request req) {
        if (wsReq instanceof SSECustomerKeyRequest) {
            if (((SSECustomerKeyRequest) wsReq).getSseCustomerKey() != null)
                return true;
            if (req.getContent() == null)
                return true;
            if (!StringUtils.isBlank(req.getHeaders().get(HttpHeaders.ContentMD5.toString()))) {
                return true;
            }
            return false;
        } else {
            return true;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy