# DefaultProxyAuthenticator.java

    /*
     * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
     *
     * WSO2 Inc. licenses this file to you under the Apache License,
     * Version 2.0 (the "License"); you may not use this file except
     * in compliance with the License.
     * You may obtain a copy of the License at
     *
     *    http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing,
     * software distributed under the License is distributed on an
     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     * KIND, either express or implied.  See the License for the
     * specific language governing permissions and limitations
     * under the License.
     */

    package org.apache.synapse.transport.http.conn;

    import org.apache.http.Header;
    import org.apache.http.HttpRequest;
    import org.apache.http.auth.AUTH;
    import org.apache.http.auth.AuthenticationException;
    import org.apache.http.auth.Credentials;
    import org.apache.http.auth.MalformedChallengeException;
    import org.apache.http.impl.auth.BasicScheme;
    import org.apache.http.message.BasicHeader;
    import org.apache.http.protocol.HttpContext;
    import org.apache.synapse.transport.passthru.PassThroughConstants;

    /**
     * DefaultProxyAuthenticator will be initialized when proxy is configured with http.proxyHost
     */
    public class DefaultProxyAuthenticator implements ProxyAuthenticator {
        private Credentials proxyCredentials;
        private BasicScheme basicScheme;

        public DefaultProxyAuthenticator(Credentials credentials) throws MalformedChallengeException {
            this.proxyCredentials = credentials;
            basicScheme = new BasicScheme();
            basicScheme.processChallenge(new BasicHeader(AUTH.PROXY_AUTH, PassThroughConstants.PROXY_BASIC_REALM));
        }

        /**
         * this will add authentication header to the request
         * @param request outgoing http request
         * @param context http context
         * @throws AuthenticationException
         */
        public void authenticatePreemptively(HttpRequest request, HttpContext context) throws AuthenticationException {
            Header authHeader = basicScheme.authenticate(proxyCredentials, request, context);
            request.addHeader(authHeader);
        }
    }