[[HTTP_Proxy]]
= HTTP Proxy

The HTTP Proxy related functionalities of JBoss Web Services are
provided by the Apache CXF http transport layer.

The suggested configuration mechanism when running JBoss Web Services is
explained below; for further information please refer to the
http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html[Apache
CXF documentation].

[[configuration]]
== Configuration

The HTTP proxy configuration for a given Jakarta XML Web Services client can be set in the
following ways:

* through the `http.proxyHost` and `http.proxyPort` system properties,
or
* leveraging the `org.apache.cxf.transport.http.HTTPConduit` options

The former is a JVM level configuration; for instance, assuming the http
proxy is currently running at http://localhost:9934, here is the setup:

[source,java,options="nowrap"]
----
System.getProperties().setProperty("http.proxyHost", "localhost");
System.getProperties().setProperty("http.proxyPort", 9934);
----

The latter is a client stub/port level configuration: the setup is
performed on the `HTTPConduit` object that's part of the Apache CXF
`Client` abstraction.

[source,java,options="nowrap"]
----
import org.apache.cxf.configuration.security.ProxyAuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.apache.cxf.transports.http.configuration.ProxyServerType;
...
 
Service service = Service.create(wsdlURL, new QName("http://org.jboss.ws/jaxws/cxf/httpproxy", "HelloWorldService"));
HelloWorld port = (HelloWorld) service.getPort(new QName("http://org.jboss.ws/jaxws/cxf/httpproxy", "HelloWorldImplPort"), HelloWorld.class);
 
Client client = ClientProxy.getClient(port);
HTTPConduit conduit = (HTTPConduit)client.getConduit();
ProxyAuthorizationPolicy policy = new ProxyAuthorizationPolicy();
policy.setAuthorizationType("Basic");
policy.setUserName(PROXY_USER);
policy.setPassword(PROXY_PWD);
conduit.setProxyAuthorization(policy);
 
port.echo("Foo");
----

The `ProxyAuthorizationPolicy` also allows for setting the authotization
type as well as the username / password to be used.

Speaking of authorization and authentication, please note that the JDK
already features the `java.net.Authenticator` facility, which is used
whenever opening a connection to a given URL requiring a http proxy.
Users might want to set a custom Authenticator for instance when needing
to read WSDL contracts before actually calling into the JBoss Web
Services / Apache CXF code; here is an example:

[source,java,options="nowrap"]
----
import java.net.Authenticator;
import java.net.PasswordAuthentication;
...
public class ProxyAuthenticator extends Authenticator
{
   private String user, password;
 
   public ProxyAuthenticator(String user, String password)
   {
      this.user = user;
      this.password = password;
   }
 
   protected PasswordAuthentication getPasswordAuthentication()
   {
      return new PasswordAuthentication(user, password.toCharArray());
   }
}
 
...
 
Authenticator.setDefault(new ProxyAuthenticator(PROXY_USER, PROXY_PWD));
----
