Search in sources :

Example 1 with ZJWToken

use of com.zimbra.common.auth.ZJWToken in project zm-mailbox by Zimbra.

the class SoapHttpTransport method invoke.

public Element invoke(Element document, boolean raw, boolean noSession, String requestedAccountId, String changeToken, String tokenType, NotificationFormat nFormat, String curWaitSetID, ResponseHandler respHandler) throws IOException, ServiceException {
    HttpPost method = null;
    HttpClient client = null;
    try {
        // Assemble post method.  Append document name, so that the request
        // type is written to the access log.
        String uri = getUriWithPath(document);
        method = new HttpPost(uri);
        // Set user agent if it's specified.
        String agentName = getUserAgentName();
        if (agentName != null) {
            String agentVersion = getUserAgentVersion();
            if (agentVersion != null)
                agentName += " " + agentVersion;
            method.addHeader(new BasicHeader("User-Agent", agentName));
        }
        // Set the original user agent if it's specified.
        String originalUserAgent = getOriginalUserAgent();
        if (originalUserAgent != null) {
            method.addHeader(new BasicHeader(HeaderConstants.HTTP_HEADER_ORIG_USER_AGENT, originalUserAgent));
        }
        // the content-type charset will determine encoding used
        // when we set the request body
        method.addHeader("Content-Type", getRequestProtocol().getContentType());
        if (getClientIp() != null) {
            method.addHeader(RemoteIP.X_ORIGINATING_IP_HEADER, getClientIp());
            if (ZimbraLog.misc.isDebugEnabled()) {
                ZimbraLog.misc.debug("set remote IP header [%s] to [%s]", RemoteIP.X_ORIGINATING_IP_HEADER, getClientIp());
            }
        }
        Element soapReq = generateSoapMessage(document, raw, noSession, requestedAccountId, changeToken, tokenType, nFormat, curWaitSetID);
        String soapMessage = SoapProtocol.toString(soapReq, getPrettyPrint());
        method.setEntity(new StringEntity(soapMessage, ContentType.create(ContentType.APPLICATION_XML.getMimeType(), "UTF-8")));
        if (getRequestProtocol().hasSOAPActionHeader())
            method.addHeader("SOAPAction", mUri);
        if (mCustomHeaders != null) {
            for (Map.Entry<String, String> entry : mCustomHeaders.entrySet()) method.addHeader(entry.getKey(), entry.getValue());
        }
        String host = method.getURI().getHost();
        ZAuthToken zToken = getAuthToken();
        BasicCookieStore cookieStore = HttpClientUtil.newHttpState(zToken, host, this.isAdmin());
        String trustedToken = getTrustedToken();
        if (trustedToken != null) {
            BasicClientCookie cookie = new BasicClientCookie(ZimbraCookie.COOKIE_ZM_TRUST_TOKEN, trustedToken);
            cookie.setDomain(host);
            cookie.setPath("/");
            cookie.setSecure(false);
            cookieStore.addCookie(cookie);
        }
        if (zToken instanceof ZJWToken) {
            method.addHeader(Constants.AUTH_HEADER, Constants.BEARER + " " + zToken.getValue());
        }
        ZimbraLog.soap.trace("Httpclient timeout: %s", mTimeout);
        RequestConfig reqConfig = RequestConfig.custom().setCookieSpec(cookieStore.getCookies().size() == 0 ? CookieSpecs.IGNORE_COOKIES : CookieSpecs.BROWSER_COMPATIBILITY).setSocketTimeout(mTimeout).build();
        SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(mTimeout).setTcpNoDelay(LC.httpclient_external_connmgr_tcp_nodelay.booleanValue()).build();
        method.setProtocolVersion(HttpVersion.HTTP_1_1);
        method.addHeader("Connection", mKeepAlive ? "Keep-alive" : "Close");
        client = mClientBuilder.setDefaultRequestConfig(reqConfig).setDefaultSocketConfig(socketConfig).setDefaultCookieStore(cookieStore).build();
        ZimbraLog.soap.trace("Httpclient request config timeout: %s", reqConfig.getSocketTimeout());
        if (mHostConfig != null && mHostConfig.getUsername() != null && mHostConfig.getPassword() != null) {
            Credentials credentials = new UsernamePasswordCredentials(mHostConfig.getUsername(), mHostConfig.getPassword());
            AuthScope authScope = new AuthScope(null, -1);
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(authScope, credentials);
            client = HttpClientBuilder.create().setDefaultCredentialsProvider(credsProvider).setDefaultRequestConfig(reqConfig).setDefaultSocketConfig(socketConfig).setDefaultCookieStore(cookieStore).build();
        }
        if (mHttpDebugListener != null) {
            mHttpDebugListener.sendSoapMessage(method, soapReq, cookieStore);
        }
        HttpResponse response = client.execute(method);
        int responseCode = response.getStatusLine().getStatusCode();
        // real server issues will probably be "503" or "404"
        if (responseCode != HttpServletResponse.SC_OK && responseCode != HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
            throw ServiceException.PROXY_ERROR(response.getStatusLine().getReasonPhrase(), uri);
        // Read the response body.  Use the stream API instead of the byte[]
        // version to avoid HTTPClient whining about a large response.
        InputStreamReader reader = new InputStreamReader(response.getEntity().getContent(), SoapProtocol.getCharset());
        String responseStr = "";
        try {
            if (respHandler != null) {
                respHandler.process(reader);
                return null;
            } else {
                HttpEntity httpEntity = response.getEntity();
                httpEntity.getContentLength();
                responseStr = ByteUtil.getContent(reader, (int) httpEntity.getContentLength(), false);
                Element soapResp = parseSoapResponse(responseStr, raw);
                if (mHttpDebugListener != null) {
                    mHttpDebugListener.receiveSoapMessage(method, soapResp);
                }
                return soapResp;
            }
        } catch (SoapFaultException x) {
            // attach request/response to the exception and rethrow
            x.setFaultRequest(soapMessage);
            x.setFaultResponse(responseStr.substring(0, Math.min(10240, responseStr.length())));
            throw x;
        }
    } finally {
        // Release the connection to the connection manager
        if (method != null)
            method.releaseConnection();
        // exits.  Leave it here anyway.
        if (!mKeepAlive)
            ZimbraHttpConnectionManager.getInternalHttpConnMgr().closeIdleConnections();
    }
}
Also used : HttpPost(org.apache.http.client.methods.HttpPost) RequestConfig(org.apache.http.client.config.RequestConfig) BasicCredentialsProvider(org.apache.http.impl.client.BasicCredentialsProvider) SocketConfig(org.apache.http.config.SocketConfig) InputStreamReader(java.io.InputStreamReader) HttpEntity(org.apache.http.HttpEntity) HttpResponse(org.apache.http.HttpResponse) BasicClientCookie(org.apache.http.impl.cookie.BasicClientCookie) BasicCredentialsProvider(org.apache.http.impl.client.BasicCredentialsProvider) CredentialsProvider(org.apache.http.client.CredentialsProvider) ZAuthToken(com.zimbra.common.auth.ZAuthToken) UsernamePasswordCredentials(org.apache.http.auth.UsernamePasswordCredentials) StringEntity(org.apache.http.entity.StringEntity) BasicCookieStore(org.apache.http.impl.client.BasicCookieStore) ZJWToken(com.zimbra.common.auth.ZJWToken) HttpClient(org.apache.http.client.HttpClient) AuthScope(org.apache.http.auth.AuthScope) Map(java.util.Map) HashMap(java.util.HashMap) BasicHeader(org.apache.http.message.BasicHeader) Credentials(org.apache.http.auth.Credentials) UsernamePasswordCredentials(org.apache.http.auth.UsernamePasswordCredentials)

Aggregations

ZAuthToken (com.zimbra.common.auth.ZAuthToken)1 ZJWToken (com.zimbra.common.auth.ZJWToken)1 InputStreamReader (java.io.InputStreamReader)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 HttpEntity (org.apache.http.HttpEntity)1 HttpResponse (org.apache.http.HttpResponse)1 AuthScope (org.apache.http.auth.AuthScope)1 Credentials (org.apache.http.auth.Credentials)1 UsernamePasswordCredentials (org.apache.http.auth.UsernamePasswordCredentials)1 CredentialsProvider (org.apache.http.client.CredentialsProvider)1 HttpClient (org.apache.http.client.HttpClient)1 RequestConfig (org.apache.http.client.config.RequestConfig)1 HttpPost (org.apache.http.client.methods.HttpPost)1 SocketConfig (org.apache.http.config.SocketConfig)1 StringEntity (org.apache.http.entity.StringEntity)1 BasicCookieStore (org.apache.http.impl.client.BasicCookieStore)1 BasicCredentialsProvider (org.apache.http.impl.client.BasicCredentialsProvider)1 BasicClientCookie (org.apache.http.impl.cookie.BasicClientCookie)1 BasicHeader (org.apache.http.message.BasicHeader)1