You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by bi...@apache.org on 2020/04/14 20:03:12 UTC
[axis-axis2-java-core] 06/15: AXIS2-4318 - Refactoring existing
codes.
This is an automated email from the ASF dual-hosted git repository.
billblough pushed a commit to branch AXIS2-4318
in repository https://gitbox.apache.org/repos/asf/axis-axis2-java-core.git
commit 69270e8661685385b29d77d15f183f4c16efbb29
Author: Sagara Gunathunga <sa...@apache.org>
AuthorDate: Thu Jan 12 09:33:53 2012 +0000
AXIS2-4318 - Refactoring existing codes.
---
.../axis2/transport/http/AbstractHTTPSender.java | 689 +--------------------
.../axis2/transport/http/AxisRequestEntity.java | 15 +-
.../apache/axis2/transport/http/AxisServlet.java | 18 +-
.../transport/http/CommonsHTTPTransportSender.java | 39 +-
.../transport/http/CommonsTransportHeaders.java | 30 +-
.../axis2/transport/http/HTTPAuthenticator.java | 107 ++++
.../apache/axis2/transport/http/HTTPSender.java | 281 ++-------
.../transport/http/HTTPTransportConstants.java | 52 ++
...equestEntity2.java => HTTPTransportSender.java} | 30 +-
.../transport/http/HttpTransportProperties.java | 136 +---
.../axis2/transport/http/RESTRequestEntity.java | 62 +-
.../axis2/transport/http/RESTRequestEntity2.java | 20 +-
.../impl/httpclient3/AxisRequestEntityImpl.java | 50 ++
.../httpclient3/HTTPClient3TransportSender.java | 42 ++
.../httpclient3/HTTPProxcyConfigurator.java} | 274 ++++----
.../httpclient3/HTTPSenderImpl.java} | 680 +++++++++++++-------
.../httpclient3/HTTPTransportHeaders.java} | 34 +-
.../httpclient3/HttpTransportPropertiesImpl.java | 90 +++
.../httpclient3/RESTRequestEntity2Impl.java} | 28 +-
.../httpclient3/RESTRequestEntityImpl.java} | 32 +-
.../http/util/HTTPProxyConfigurationUtil.java | 1 +
21 files changed, 1179 insertions(+), 1531 deletions(-)
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
index f02875a..09bd9c2 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
@@ -19,65 +19,27 @@
package org.apache.axis2.transport.http;
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMElement;
+
+import java.io.IOException;
+import java.net.URL;
+
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
-import org.apache.axis2.Constants;
import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.NamedValue;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.TransportOutDescription;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.transport.MessageFormatter;
-import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.transport.http.util.HTTPProxyConfigurationUtil;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HeaderElement;
-import org.apache.commons.httpclient.HostConfiguration;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpState;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.NTCredentials;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthPolicy;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.commons.httpclient.protocol.Protocol;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.http.protocol.HTTP;
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.GZIPInputStream;
+
+
public abstract class AbstractHTTPSender {
- protected static final String ANONYMOUS = "anonymous";
- protected static final String PROXY_HOST_NAME = "proxy_host";
- protected static final String PROXY_PORT = "proxy_port";
+
protected boolean chunked = false;
protected String httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
- private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);
-
- protected static final String PROTOCOL_HTTP = "http";
- protected static final String PROTOCOL_HTTPS = "https";
+
+ private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);
/**
* proxydiscription
@@ -109,638 +71,13 @@ public abstract class AbstractHTTPSender {
+ " Can have values only HTTP/1.0 or HTTP/1.1");
}
}
- }
-
- /**
- * Collect the HTTP header information and set them in the message context
- *
- * @param method HttpMethodBase from which to get information
- * @param msgContext the MessageContext in which to place the information... OR NOT!
- * @throws AxisFault if problems occur
- */
- protected void obtainHTTPHeaderInformation(HttpMethodBase method,
- MessageContext msgContext) throws AxisFault {
- // Set RESPONSE properties onto the REQUEST message context. They will need to be copied off the request context onto
- // the response context elsewhere, for example in the OutInOperationClient.
- Map transportHeaders = new CommonsTransportHeaders(method.getResponseHeaders());
- msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders);
- msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, new Integer(method.getStatusCode()));
- Header header = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
-
- if (header != null) {
- HeaderElement[] headers = header.getElements();
- MessageContext inMessageContext = msgContext.getOperationContext().getMessageContext(
- WSDLConstants.MESSAGE_LABEL_IN_VALUE);
-
- Object contentType = header.getValue();
- Object charSetEnc = null;
-
- for (int i = 0; i < headers.length; i++) {
- NameValuePair charsetEnc = headers[i].getParameterByName(
- HTTPConstants.CHAR_SET_ENCODING);
- if (charsetEnc != null) {
- charSetEnc = charsetEnc.getValue();
- }
- }
-
- if (inMessageContext != null) {
- inMessageContext
- .setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
- inMessageContext
- .setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
- } else {
-
- // Transport details will be stored in a HashMap so that anybody interested can
- // retrieve them
- HashMap transportInfoMap = new HashMap();
- transportInfoMap.put(Constants.Configuration.CONTENT_TYPE, contentType);
- transportInfoMap.put(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
-
- //the HashMap is stored in the outgoing message.
- msgContext.setProperty(Constants.Configuration.TRANSPORT_INFO_MAP,
- transportInfoMap);
- }
- }
-
- String sessionCookie = null;
- // Process old style headers first
- Header[] cookieHeaders = method.getResponseHeaders(HTTPConstants.HEADER_SET_COOKIE);
- String customCoookiId = (String) msgContext.getProperty(Constants.CUSTOM_COOKIE_ID);
- for (int i = 0; i < cookieHeaders.length; i++) {
- HeaderElement[] elements = cookieHeaders[i].getElements();
- for (int e = 0; e < elements.length; e++) {
- HeaderElement element = elements[e];
- if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
- Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
- sessionCookie = processCookieHeader(element);
- }
- if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
- sessionCookie = processCookieHeader(element);
- }
- }
- }
- // Overwrite old style cookies with new style ones if present
- cookieHeaders = method.getResponseHeaders(HTTPConstants.HEADER_SET_COOKIE2);
- for (int i = 0; i < cookieHeaders.length; i++) {
- HeaderElement[] elements = cookieHeaders[i].getElements();
- for (int e = 0; e < elements.length; e++) {
- HeaderElement element = elements[e];
- if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
- Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
- sessionCookie = processCookieHeader(element);
- }
- if(customCoookiId!=null&&customCoookiId.equalsIgnoreCase(element.getName())){
- sessionCookie = processCookieHeader(element);
- }
- }
- }
-
- if (sessionCookie != null) {
- msgContext.getServiceContext().setProperty(HTTPConstants.COOKIE_STRING, sessionCookie);
- }
- }
-
- private String processCookieHeader(HeaderElement element) {
- String cookie = element.getName() + "=" + element.getValue();
- NameValuePair[] parameters = element.getParameters();
- for (int j = 0; parameters != null && j < parameters.length; j++) {
- NameValuePair parameter = parameters[j];
- cookie = cookie + "; " + parameter.getName() + "=" + parameter.getValue();
- }
- return cookie;
- }
-
- protected void processResponse(HttpMethodBase httpMethod,
- MessageContext msgContext)
- throws IOException {
- obtainHTTPHeaderInformation(httpMethod, msgContext);
-
- InputStream in = httpMethod.getResponseBodyAsStream();
- if (in == null) {
- throw new AxisFault(Messages.getMessage("canNotBeNull", "InputStream"));
- }
- Header contentEncoding =
- httpMethod.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
- if (contentEncoding != null) {
- if (contentEncoding.getValue().
- equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
- in = new GZIPInputStream(in);
- // If the content-encoding is identity we can basically ignore it.
- } else if (!"identity".equalsIgnoreCase(contentEncoding.getValue())) {
- throw new AxisFault("HTTP :" + "unsupported content-encoding of '"
- + contentEncoding.getValue() + "' found");
- }
- }
-
- OperationContext opContext = msgContext.getOperationContext();
- if (opContext != null) {
- opContext.setProperty(MessageContext.TRANSPORT_IN, in);
- }
- }
+ }
public abstract void send(MessageContext msgContext, URL url, String soapActionString)
- throws IOException;
-
- /**
- * getting host configuration to support standard http/s, proxy and NTLM support
- *
- * @param client active HttpClient
- * @param msgCtx active MessageContext
- * @param targetURL the target URL
- * @return a HostConfiguration set up with proxy information
- * @throws AxisFault if problems occur
- */
- protected HostConfiguration getHostConfiguration(HttpClient client,
- MessageContext msgCtx,
- URL targetURL)throws AxisFault {
-
- boolean isAuthenticationEnabled = isAuthenticationEnabled(msgCtx);
- int port = targetURL.getPort();
-
- String protocol = targetURL.getProtocol();
- if (port == -1) {
- if (PROTOCOL_HTTP.equals(protocol)) {
- port = 80;
- } else if (PROTOCOL_HTTPS.equals(protocol)) {
- port = 443;
- }
-
- }
-
- // to see the host is a proxy and in the proxy list - available in axis2.xml
- HostConfiguration config = new HostConfiguration();
-
- // one might need to set his own socket factory. Let's allow that case as well.
- Protocol protocolHandler =
- (Protocol)msgCtx.getOptions().getProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
-
- // setting the real host configuration
- // I assume the 90% case, or even 99% case will be no protocol handler case.
- if (protocolHandler == null) {
- config.setHost(targetURL.getHost(), port, targetURL.getProtocol());
- } else {
- config.setHost(targetURL.getHost(), port, protocolHandler);
- }
-
- if (isAuthenticationEnabled) {
- // Basic, Digest, NTLM and custom authentications.
- this.setAuthenticationInfo(client, msgCtx, config);
- }
- // proxy configuration
-
- if (HTTPProxyConfigurationUtil.isProxyEnabled(msgCtx, targetURL)) {
- if(log.isDebugEnabled()){
- log.debug("Configuring HTTP proxy.");
- }
- HTTPProxyConfigurationUtil.configure(msgCtx, client, config);
- }
-
- return config;
- }
-
- protected boolean isAuthenticationEnabled(MessageContext msgCtx) {
- return (msgCtx.getProperty(HTTPConstants.AUTHENTICATE) != null);
- }
-
- /*
- This will handle server Authentication, It could be either NTLM, Digest or Basic Authentication.
- Apart from that user can change the priory or add a custom authentication scheme.
- */
- protected void setAuthenticationInfo(HttpClient agent,
- MessageContext msgCtx,
- HostConfiguration config) throws AxisFault {
- HttpTransportProperties.Authenticator authenticator;
- Object obj = msgCtx.getProperty(HTTPConstants.AUTHENTICATE);
- if (obj != null) {
- if (obj instanceof HttpTransportProperties.Authenticator) {
- authenticator = (HttpTransportProperties.Authenticator) obj;
-
- String username = authenticator.getUsername();
- String password = authenticator.getPassword();
- String host = authenticator.getHost();
- String domain = authenticator.getDomain();
-
- int port = authenticator.getPort();
- String realm = authenticator.getRealm();
-
- /* If retrying is available set it first */
- isAllowedRetry = authenticator.isAllowedRetry();
-
- Credentials creds;
-
- HttpState tmpHttpState = null;
- HttpState httpState = (HttpState)msgCtx.getProperty(HTTPConstants.CACHED_HTTP_STATE);
- if (httpState != null) {
- tmpHttpState = httpState;
- } else {
- tmpHttpState = agent.getState();
- }
-
- agent.getParams()
- .setAuthenticationPreemptive(authenticator.getPreemptiveAuthentication());
-
- if (host != null) {
- if (domain != null) {
- /*Credentials for NTLM Authentication*/
- creds = new NTCredentials(username, password, host, domain);
- } else {
- /*Credentials for Digest and Basic Authentication*/
- creds = new UsernamePasswordCredentials(username, password);
- }
- tmpHttpState.setCredentials(new AuthScope(host, port, realm), creds);
- } else {
- if (domain != null) {
- /*Credentials for NTLM Authentication when host is ANY_HOST*/
- creds = new NTCredentials(username, password, AuthScope.ANY_HOST, domain);
- tmpHttpState.setCredentials(
- new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
- } else {
- /*Credentials only for Digest and Basic Authentication*/
- creds = new UsernamePasswordCredentials(username, password);
- tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY), creds);
- }
- }
- /* Customizing the priority Order */
- List schemes = authenticator.getAuthSchemes();
- if (schemes != null && schemes.size() > 0) {
- List authPrefs = new ArrayList(3);
- for (int i = 0; i < schemes.size(); i++) {
- if (schemes.get(i) instanceof AuthPolicy) {
- authPrefs.add(schemes.get(i));
- continue;
- }
- String scheme = (String) schemes.get(i);
- if (HttpTransportProperties.Authenticator.BASIC.equals(scheme)) {
- authPrefs.add(AuthPolicy.BASIC);
- } else if (HttpTransportProperties.Authenticator.NTLM.equals(scheme)) {
- authPrefs.add(AuthPolicy.NTLM);
- } else if (HttpTransportProperties.Authenticator.DIGEST.equals(scheme)) {
- authPrefs.add(AuthPolicy.DIGEST);
- }
- }
- agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY,
- authPrefs);
- }
-
- } else {
- throw new AxisFault("HttpTransportProperties.Authenticator class cast exception");
- }
- }
-
- }
-
- /**
- * Method used to copy all the common properties
- *
- * @param msgContext - The messageContext of the request message
- * @param url - The target URL
- * @param httpMethod - The http method used to send the request
- * @param httpClient - The httpclient used to send the request
- * @param soapActionString - The soap action atring of the request message
- * @return MessageFormatter - The messageFormatter for the relavent request message
- * @throws AxisFault - Thrown in case an exception occurs
- */
- protected MessageFormatter populateCommonProperties(MessageContext msgContext, URL url,
- HttpMethodBase httpMethod,
- HttpClient httpClient,
- String soapActionString)
- throws AxisFault {
-
- if (isAuthenticationEnabled(msgContext)) {
- httpMethod.setDoAuthentication(true);
- }
-
- MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(
- msgContext);
-
- url = messageFormatter.getTargetAddress(msgContext, format, url);
-
- httpMethod.setPath(url.getPath());
-
- httpMethod.setQueryString(url.getQuery());
-
- httpMethod.setRequestHeader(HTTPConstants.HEADER_CONTENT_TYPE,
- messageFormatter.getContentType(msgContext, format,
- soapActionString));
-
- httpMethod.setRequestHeader(HTTPConstants.HEADER_HOST, url.getHost());
-
- if (msgContext.getOptions() != null && msgContext.getOptions().isManageSession()) {
- // setting the cookie in the out path
- Object cookieString = msgContext.getProperty(HTTPConstants.COOKIE_STRING);
-
- if (cookieString != null) {
- StringBuffer buffer = new StringBuffer();
- buffer.append(cookieString);
- httpMethod.setRequestHeader(HTTPConstants.HEADER_COOKIE, buffer.toString());
- }
- }
-
- if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10)) {
- httpClient.getParams().setVersion(HttpVersion.HTTP_1_0);
- }
- return messageFormatter;
- }
-
- /**
- * This is used to get the dynamically set time out values from the
- * message context. If the values are not available or invalid then
- * the default values or the values set by the configuration will be used
- *
- * @param msgContext the active MessageContext
- * @param httpClient
- */
- protected void initializeTimeouts(MessageContext msgContext, HttpClient httpClient) {
- // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
- // override the static config
- Integer tempSoTimeoutProperty =
- (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
- Integer tempConnTimeoutProperty =
- (Integer) msgContext
- .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
- long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
-
- if (tempConnTimeoutProperty != null) {
- int connectionTimeout = tempConnTimeoutProperty.intValue();
- // timeout for initial connection
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
- } else {
- // set timeout in client
- if (timeout > 0) {
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout((int) timeout);
- }
- }
-
- if (tempSoTimeoutProperty != null) {
- int soTimeout = tempSoTimeoutProperty.intValue();
- // SO_TIMEOUT -- timeout for blocking reads
- httpClient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout);
- httpClient.getParams().setSoTimeout(soTimeout);
- } else {
- // set timeout in client
- if (timeout > 0) {
- httpClient.getHttpConnectionManager().getParams().setSoTimeout((int) timeout);
- httpClient.getParams().setSoTimeout((int) timeout);
- }
- }
- }
-
- /**
- * This is used to get the dynamically set time out values from the
- * message context. If the values are not available or invalid then
- * the default values or the values set by the configuration will be used
- *
- * @param msgContext the active MessageContext
- * @param httpMethod method
- */
- protected void setTimeouts(MessageContext msgContext, HttpMethod httpMethod) {
- // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
- // override the static config
- Integer tempSoTimeoutProperty =
- (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
- Integer tempConnTimeoutProperty =
- (Integer) msgContext
- .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
- long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
-
- if (tempConnTimeoutProperty != null) {
- // timeout for initial connection
- httpMethod.getParams().setParameter("http.connection.timeout",
- tempConnTimeoutProperty);
- }
-
- if (tempSoTimeoutProperty != null) {
- // SO_TIMEOUT -- timeout for blocking reads
- httpMethod.getParams().setSoTimeout(tempSoTimeoutProperty);
- } else {
- // set timeout in client
- if (timeout > 0) {
- httpMethod.getParams().setSoTimeout((int) timeout);
- }
- }
- }
+ throws IOException;
public void setFormat(OMOutputFormat format) {
this.format = format;
- }
-
- protected HttpClient getHttpClient(MessageContext msgContext) {
- ConfigurationContext configContext = msgContext.getConfigurationContext();
-
- HttpClient httpClient = (HttpClient) msgContext.getProperty(
- HTTPConstants.CACHED_HTTP_CLIENT);
-
- if (httpClient == null) {
- httpClient = (HttpClient) configContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
- }
-
- if (httpClient != null) {
- return httpClient;
- }
-
- synchronized (this) {
- httpClient = (HttpClient) msgContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
-
- if (httpClient == null) {
- httpClient = (HttpClient) configContext.getProperty(
- HTTPConstants.CACHED_HTTP_CLIENT);
- }
-
- if (httpClient != null) {
- return httpClient;
- }
-
- HttpConnectionManager connManager =
- (HttpConnectionManager) msgContext.getProperty(
- HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
- if (connManager == null) {
- connManager =
- (HttpConnectionManager) msgContext.getProperty(
- HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
- }
- if (connManager == null) {
- // reuse HttpConnectionManager
- synchronized (configContext) {
- connManager = (HttpConnectionManager) configContext.getProperty(
- HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
- if (connManager == null) {
- log.trace("Making new ConnectionManager");
- connManager = new MultiThreadedHttpConnectionManager();
- configContext.setProperty(
- HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER, connManager);
- }
- }
- }
- /*
- * Create a new instance of HttpClient since the way
- * it is used here it's not fully thread-safe.
- */
- httpClient = new HttpClient(connManager);
-
- // Set the default timeout in case we have a connection pool starvation to 30sec
- httpClient.getParams().setConnectionManagerTimeout(30000);
-
- // Get the timeout values set in the runtime
- initializeTimeouts(msgContext, httpClient);
-
- return httpClient;
- }
- }
-
- protected void executeMethod(HttpClient httpClient, MessageContext msgContext, URL url,
- HttpMethod method) throws IOException {
- HostConfiguration config = this.getHostConfiguration(httpClient, msgContext, url);
-
- // set the custom headers, if available
- addCustomHeaders(method, msgContext);
-
- // add compression headers if needed
- if (msgContext.isPropertyTrue(HTTPConstants.MC_ACCEPT_GZIP)) {
- method.addRequestHeader(HTTPConstants.HEADER_ACCEPT_ENCODING,
- HTTPConstants.COMPRESSION_GZIP);
- }
-
- if (msgContext.isPropertyTrue(HTTPConstants.MC_GZIP_REQUEST)) {
- method.addRequestHeader(HTTPConstants.HEADER_CONTENT_ENCODING,
- HTTPConstants.COMPRESSION_GZIP);
- }
-
- if (msgContext.getProperty(HTTPConstants.HTTP_METHOD_PARAMS) != null) {
- HttpMethodParams params = (HttpMethodParams)msgContext
- .getProperty(HTTPConstants.HTTP_METHOD_PARAMS);
- method.setParams(params);
- }
-
- String cookiePolicy = (String) msgContext.getProperty(HTTPConstants.COOKIE_POLICY);
- if (cookiePolicy != null) {
- method.getParams().setCookiePolicy(cookiePolicy);
- }
- HttpState httpState = (HttpState)msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
-
- setTimeouts(msgContext, method);
-
- httpClient.executeMethod(config, method, httpState);
- }
-
- public void addCustomHeaders(HttpMethod method, MessageContext msgContext) {
-
- boolean isCustomUserAgentSet = false;
- // set the custom headers, if available
- Object httpHeadersObj = msgContext.getProperty(HTTPConstants.HTTP_HEADERS);
- if (httpHeadersObj != null) {
- if (httpHeadersObj instanceof List) {
- List httpHeaders = (List) httpHeadersObj;
- for (int i = 0; i < httpHeaders.size(); i++) {
- NamedValue nv = (NamedValue) httpHeaders.get(i);
- if (nv != null) {
- Header header = new Header(nv.getName(), nv.getValue());
- if (HTTPConstants.HEADER_USER_AGENT.equals(header.getName())) {
- isCustomUserAgentSet = true;
- }
- method.addRequestHeader(header);
- }
- }
-
- }
- if (httpHeadersObj instanceof Map) {
- Map httpHeaders = (Map) httpHeadersObj;
- for (Iterator iterator = httpHeaders.entrySet().iterator(); iterator.hasNext();) {
- Map.Entry entry = (Map.Entry) iterator.next();
- String key = (String) entry.getKey();
- String value = (String) entry.getValue();
- if (HTTPConstants.HEADER_USER_AGENT.equals(key)) {
- isCustomUserAgentSet = true;
- }
- method.addRequestHeader(key, value);
- }
- }
- }
-
- // we have to consider the TRANSPORT_HEADERS map as well
- Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
- if (transportHeaders != null) {
- removeUnwantedHeaders(msgContext);
-
- Set headerEntries = transportHeaders.entrySet();
-
- for (Object headerEntry : headerEntries) {
- if (headerEntry instanceof Map.Entry) {
- Header[] headers = method.getRequestHeaders();
-
- boolean headerAdded = false;
- for (Header header : headers) {
- if (header.getName() != null &&
- header.getName().equals(((Map.Entry) headerEntry).getKey())) {
- headerAdded = true;
- break;
- }
- }
-
- if (!headerAdded) {
- method.addRequestHeader(((Map.Entry) headerEntry).getKey().toString(),
- ((Map.Entry) headerEntry).getValue().toString());
- }
- }
- }
- }
-
- if (!isCustomUserAgentSet) {
- String userAgentString = getUserAgent(msgContext);
- method.setRequestHeader(HTTPConstants.HEADER_USER_AGENT, userAgentString);
- }
-
- }
-
-
- /**
- * Remove unwanted headers from the transport headers map of outgoing request. These are headers which
- * should be dictated by the transport and not the user. We remove these as these may get
- * copied from the request messages
- *
- * @param msgContext the Axis2 Message context from which these headers should be removed
- */
- private void removeUnwantedHeaders(MessageContext msgContext) {
- Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
-
- if (headers == null || headers.isEmpty()) {
- return;
- }
-
- Iterator iter = headers.keySet().iterator();
- while (iter.hasNext()) {
- String headerName = (String) iter.next();
- if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName) ||
- HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName) ||
- HTTP.DATE_HEADER.equalsIgnoreCase(headerName) ||
- HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName) ||
- HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
- iter.remove();
- }
- }
- }
-
- private String getUserAgent(MessageContext messageContext) {
- String userAgentString = "Axis2";
- boolean locked = false;
- if (messageContext.getParameter(HTTPConstants.USER_AGENT) != null) {
- OMElement userAgentElement =
- messageContext.getParameter(HTTPConstants.USER_AGENT).getParameterElement();
- userAgentString = userAgentElement.getText().trim();
- OMAttribute lockedAttribute = userAgentElement.getAttribute(new QName("locked"));
- if (lockedAttribute != null) {
- if (lockedAttribute.getAttributeValue().equalsIgnoreCase("true")) {
- locked = true;
- }
- }
- }
- // Runtime overing part
- if (!locked) {
- if (messageContext.getProperty(HTTPConstants.USER_AGENT) != null) {
- userAgentString = (String) messageContext.getProperty(HTTPConstants.USER_AGENT);
- }
- }
-
- return userAgentString;
- }
+ }
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java b/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
index 0de3084..8834def 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AxisRequestEntity.java
@@ -24,7 +24,6 @@ import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.util.JavaUtils;
-import org.apache.commons.httpclient.methods.RequestEntity;
import javax.xml.stream.FactoryConfigurationError;
import java.io.IOException;
@@ -35,7 +34,7 @@ import java.util.zip.GZIPOutputStream;
* This Request Entity is used by the HTTPCommonsTransportSender. This wraps the
* Axis2 message formatter object.
*/
-public class AxisRequestEntity implements RequestEntity {
+public abstract class AxisRequestEntity {
private MessageFormatter messageFormatter;
@@ -114,7 +113,17 @@ public class AxisRequestEntity implements RequestEntity {
return bytes.length;
}
- public String getContentType() {
+ public String getContentTypeAsString() {
return messageFormatter.getContentType(messageContext, format, soapAction);
}
+
+ public boolean isChunked() {
+ return chunked;
+ }
+
+ public void setChunked(boolean chunked) {
+ this.chunked = chunked;
+ }
+
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java b/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
index ae43283..f78af68 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/AxisServlet.java
@@ -555,7 +555,23 @@ public class AxisServlet extends HttpServlet {
// AXIS2-4898: MultiThreadedHttpConnectionManager starts a thread that is not stopped by the
// shutdown of the connection manager. If we want to avoid a resource leak, we need to call
// shutdownAll here.
- MultiThreadedHttpConnectionManager.shutdownAll();
+ // TODO - This action need be changed according to current HTTPClient.
+ String clientVersion = getHTTPClientVersion();
+ if (clientVersion != null
+ && HTTPTransportConstants.HTTP_CLIENT_4_X_VERSION.equals(clientVersion)) {
+ // TODO - Handle for HTTPClient 4
+ } else {
+ MultiThreadedHttpConnectionManager.shutdownAll();
+ }
+
+ }
+
+ private String getHTTPClientVersion() {
+ Object version = configContext.getProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION);
+ if (version != null) {
+ return String.valueOf(version);
+ }
+ return null;
}
/**
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
index edb7d99..4181a56 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsHTTPTransportSender.java
@@ -31,11 +31,10 @@ import org.apache.axis2.description.TransportOutDescription;
import org.apache.axis2.handlers.AbstractHandler;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.transport.OutTransportInfo;
-import org.apache.axis2.transport.TransportSender;
import org.apache.axis2.transport.TransportUtils;
+import org.apache.axis2.transport.http.impl.httpclient3.HTTPSenderImpl;
import org.apache.axis2.transport.http.server.AxisHttpResponse;
import org.apache.axis2.util.JavaUtils;
-import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -51,8 +50,7 @@ import java.util.List;
import java.util.Map;
import java.util.zip.GZIPOutputStream;
-public class CommonsHTTPTransportSender extends AbstractHandler implements
- TransportSender {
+public class CommonsHTTPTransportSender extends AbstractHandler implements HTTPTransportSender {
/**
* The {@link TransportOutDescription} object received by the call to
* {@link #init(ConfigurationContext, TransportOutDescription)}.
@@ -80,20 +78,22 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
private int connectionTimeout = HTTPConstants.DEFAULT_CONNECTION_TIMEOUT;
public void cleanup(MessageContext msgContext) throws AxisFault {
- HttpMethod httpMethod = (HttpMethod) msgContext.getProperty(HTTPConstants.HTTP_METHOD);
-
- if (httpMethod != null) {
- // TODO : Don't do this if we're not on the right thread! Can we confirm?
- log.trace("cleanup() releasing connection for " + httpMethod);
-
- httpMethod.releaseConnection();
- msgContext.removeProperty(HTTPConstants.HTTP_METHOD); // guard against multiple calls
- }
+
+ HttpMethod httpMethod = (HttpMethod) msgContext.getProperty(HTTPConstants.HTTP_METHOD);
+ if (httpMethod != null) {
+ // TODO : Don't do this if we're not on the right thread! Can we confirm?
+ log.trace("cleanup() releasing connection for " + httpMethod);
+
+ httpMethod.releaseConnection();
+ msgContext.removeProperty(HTTPConstants.HTTP_METHOD); // guard against multiple calls
+ }
}
public void init(ConfigurationContext confContext,
TransportOutDescription transportOut) throws AxisFault {
this.transportOut = transportOut;
+ //Set HTTP client version
+ setHTTPClientVersion(confContext);
// <parameter name="PROTOCOL">HTTP/1.0</parameter> or
// <parameter name="PROTOCOL">HTTP/1.1</parameter> is
@@ -376,7 +376,7 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
// select the Message Sender depending on the REST status
AbstractHTTPSender sender;
- sender = new HTTPSender();
+ sender = new HTTPSenderImpl();
boolean chunked;
if (messageContext.getProperty(HTTPConstants.CHUNKED) != null) {
@@ -403,10 +403,7 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
} catch (MalformedURLException e) {
log.debug(e);
throw AxisFault.makeFault(e);
- } catch (HttpException e) {
- log.debug(e);
- throw AxisFault.makeFault(e);
- } catch (IOException e) {
+ } catch (IOException e) {
log.debug(e);
throw AxisFault.makeFault(e);
}
@@ -505,4 +502,10 @@ public class CommonsHTTPTransportSender extends AbstractHandler implements
return soapActionString;
}
+
+ public void setHTTPClientVersion(ConfigurationContext configurationContext) {
+ configurationContext.setProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION,
+ HTTPTransportConstants.HTTP_CLIENT_3_X_VERSION);
+ }
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
index d09ebad..828d226 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/CommonsTransportHeaders.java
@@ -19,30 +19,18 @@
package org.apache.axis2.transport.http;
-import org.apache.commons.httpclient.Header;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-public class CommonsTransportHeaders implements Map {
- private Header[] headers;
+public abstract class CommonsTransportHeaders implements Map {
HashMap headerMap = null;
-
- public CommonsTransportHeaders(Header[] headers) {
- this.headers = headers;
- }
-
- private void init() {
- headerMap = new HashMap();
-
- for (int i = 0; i < headers.length; i++) {
- headerMap.put(headers[i].getName(), headers[i].getValue());
- }
- }
-
+
+ protected abstract void init();
+
public int size() {
if (headerMap == null) {
init();
@@ -125,4 +113,14 @@ public class CommonsTransportHeaders implements Map {
}
return headerMap.put(key, value);
}
+
+ public HashMap getHeaderMap() {
+ return headerMap;
+ }
+
+ public void setHeaderMap(HashMap headerMap) {
+ this.headerMap = headerMap;
+ }
+
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java
new file mode 100644
index 0000000..2796b5e
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPAuthenticator.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.axis2.transport.http;
+
+import java.util.List;
+
+public abstract class HTTPAuthenticator {
+
+ /* host that needed to be authenticated with */
+ private String host;
+ /* Domain needed by NTCredentials for NT Domain */
+ private String domain;
+ /* User for authenticate */
+ private String username;
+ /* Password of the user for authenticate */
+ private String password;
+ /* Switch to use preemptive authentication or not */
+ private boolean preemptive = false;
+ /* if Authentication scheme needs retry just turn on the following flag */
+ private boolean allowedRetry = false;
+ /* Changing the priorty or adding a custom AuthPolicy */
+ private List authSchemes;
+
+ public abstract int getPort();
+
+ public abstract void setPort(int port);
+
+ public abstract String getRealm();
+
+ public abstract void setRealm(String realm);
+
+ public abstract Object getAuthPolicyPref(String schema);
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void setPreemptiveAuthentication(boolean preemptive) {
+ this.preemptive = preemptive;
+ }
+
+ public boolean getPreemptiveAuthentication() {
+ return this.preemptive;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ public void setAuthSchemes(List authSchemes) {
+ this.authSchemes = authSchemes;
+ }
+
+ public List getAuthSchemes() {
+ return this.authSchemes;
+ }
+
+ public void setAllowedRetry(boolean allowedRetry) {
+ this.allowedRetry = allowedRetry;
+ }
+
+ public boolean isAllowedRetry() {
+ return this.allowedRetry;
+ }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
index 1227004..118ffbf 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java
@@ -23,58 +23,17 @@ package org.apache.axis2.transport.http;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.i18n.Messages;
-import org.apache.axis2.transport.MessageFormatter;
-import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.DeleteMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.io.IOException;
import java.net.URL;
-public class HTTPSender extends AbstractHTTPSender {
+//TODO - It better if we can define these method in a interface move these into AbstractHTTPSender and get rid of this class.
+public abstract class HTTPSender extends AbstractHTTPSender {
private static final Log log = LogFactory.getLog(HTTPSender.class);
-
- public void send(MessageContext msgContext, URL url, String soapActionString)
- throws IOException {
-
- // execute the HtttpMethodBase - a connection manager can be given for
- // handle multiple
-
- String httpMethod =
- (String) msgContext.getProperty(Constants.Configuration.HTTP_METHOD);
-
- if ((httpMethod != null)) {
-
- if (Constants.Configuration.HTTP_METHOD_GET.equalsIgnoreCase(httpMethod)) {
- this.sendViaGet(msgContext, url, soapActionString);
-
- return;
- } else if (Constants.Configuration.HTTP_METHOD_DELETE.equalsIgnoreCase(httpMethod)) {
- this.sendViaDelete(msgContext, url, soapActionString);
-
- return;
- } else if (Constants.Configuration.HTTP_METHOD_PUT.equalsIgnoreCase(httpMethod)) {
- this.sendViaPut(msgContext, url, soapActionString);
-
- return;
- }
- }
-
- this.sendViaPost(msgContext, url, soapActionString);
- }
-
+
/**
* Used to send a request via HTTP Get method
*
@@ -83,39 +42,9 @@ public class HTTPSender extends AbstractHTTPSender {
* @param soapActiionString - The soapAction string of the request
* @throws AxisFault - Thrown in case an exception occurs
*/
- private void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
- throws AxisFault {
-
- GetMethod getMethod = new GetMethod();
- HttpClient httpClient = getHttpClient(msgContext);
- MessageFormatter messageFormatter =
- populateCommonProperties(msgContext, url, getMethod, httpClient, soapActiionString);
-
- // Need to have this here because we can have soap action when using the soap response MEP
- String soapAction =
- messageFormatter.formatSOAPAction(msgContext, format, soapActiionString);
-
- if (soapAction != null) {
- getMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
- }
- try {
- executeMethod(httpClient, msgContext, url, getMethod);
- handleResponse(msgContext, getMethod);
- } catch (IOException e) {
- log.info("Unable to sendViaGet to url[" + url + "]", e);
- throw AxisFault.makeFault(e);
- } finally {
- cleanup(msgContext, getMethod);
- }
- }
-
- private void cleanup(MessageContext msgContext, HttpMethod method) {
- if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) {
- log.trace("AutoReleasing " + method);
- method.releaseConnection();
- }
- }
-
+ protected abstract void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
+ throws AxisFault;
+
/**
* Used to send a request via HTTP Delete Method
*
@@ -124,24 +53,8 @@ public class HTTPSender extends AbstractHTTPSender {
* @param soapActiionString - The soapAction string of the request
* @throws AxisFault - Thrown in case an exception occurs
*/
- private void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
- throws AxisFault {
-
- DeleteMethod deleteMethod = new DeleteMethod();
- HttpClient httpClient = getHttpClient(msgContext);
- populateCommonProperties(msgContext, url, deleteMethod, httpClient, soapActiionString);
-
- try {
- executeMethod(httpClient, msgContext, url, deleteMethod);
- handleResponse(msgContext, deleteMethod);
- } catch (IOException e) {
- log.info("Unable to sendViaDelete to url[" + url + "]", e);
- throw AxisFault.makeFault(e);
- } finally {
- cleanup(msgContext, deleteMethod);
- }
- }
-
+ protected abstract void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
+ throws AxisFault;
/**
* Used to send a request via HTTP Post Method
*
@@ -150,55 +63,9 @@ public class HTTPSender extends AbstractHTTPSender {
* @param soapActionString - The soapAction string of the request
* @throws AxisFault - Thrown in case an exception occurs
*/
- private void sendViaPost(MessageContext msgContext, URL url,
- String soapActionString) throws AxisFault {
-
-
- HttpClient httpClient = getHttpClient(msgContext);
-
-/* What's up with this, it never gets used anywhere?? --Glen
- String charEncoding =
- (String) msgContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
-
- if (charEncoding == null) {
- charEncoding = MessageContext.DEFAULT_CHAR_SET_ENCODING;
- }
-*/
-
- PostMethod postMethod = new PostMethod();
- if (log.isTraceEnabled()) {
- log.trace(Thread.currentThread() + " PostMethod " + postMethod + " / " + httpClient);
- }
- MessageFormatter messageFormatter =
- populateCommonProperties(msgContext, url, postMethod, httpClient, soapActionString);
+ protected abstract void sendViaPost(MessageContext msgContext, URL url,
+ String soapActionString) throws AxisFault;
- postMethod.setRequestEntity(new AxisRequestEntity(messageFormatter,
- msgContext, format, soapActionString,
- chunked, isAllowedRetry));
-
- if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
- postMethod.setContentChunked(true);
- }
-
- String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
-
- if (soapAction != null) {
- postMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
- }
-
- /*
- * main excecution takes place..
- */
- try {
- executeMethod(httpClient, msgContext, url, postMethod);
- handleResponse(msgContext, postMethod);
- } catch (IOException e) {
- log.info("Unable to sendViaPost to url[" + url + "]", e);
- throw AxisFault.makeFault(e);
- } finally {
- cleanup(msgContext, postMethod);
- }
- }
/**
* Used to send a request via HTTP Put Method
@@ -208,51 +75,10 @@ public class HTTPSender extends AbstractHTTPSender {
* @param soapActionString - The soapAction string of the request
* @throws AxisFault - Thrown in case an exception occurs
*/
- private void sendViaPut(MessageContext msgContext, URL url,
- String soapActionString) throws AxisFault {
-
-
- HttpClient httpClient = getHttpClient(msgContext);
-
-/* Same deal - this value never gets used, why is it here? --Glen
- String charEncoding =
- (String) msgContext.getProperty(Constants.Configuration.CHARACTER_SET_ENCODING);
-
- if (charEncoding == null) {
- charEncoding = MessageContext.DEFAULT_CHAR_SET_ENCODING;
- }
-*/
+ protected abstract void sendViaPut(MessageContext msgContext, URL url,
+ String soapActionString) throws AxisFault;
- PutMethod putMethod = new PutMethod();
- MessageFormatter messageFormatter =
- populateCommonProperties(msgContext, url, putMethod, httpClient, soapActionString);
-
- putMethod.setRequestEntity(new AxisRequestEntity(messageFormatter,
- msgContext, format, soapActionString,
- chunked, isAllowedRetry));
-
- if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
- putMethod.setContentChunked(true);
- }
-
- String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
- if (soapAction != null) {
- putMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
- }
-
- /*
- * main excecution takes place..
- */
- try {
- executeMethod(httpClient, msgContext, url, putMethod);
- handleResponse(msgContext, putMethod);
- } catch (IOException e) {
- log.info("Unable to sendViaPut to url[" + url + "]", e);
- throw AxisFault.makeFault(e);
- } finally {
- cleanup(msgContext, putMethod);
- }
- }
+
/**
* Used to handle the HTTP Response
@@ -261,55 +87,40 @@ public class HTTPSender extends AbstractHTTPSender {
* @param method - The HTTP method used
* @throws IOException - Thrown in case an exception occurs
*/
- private void handleResponse(MessageContext msgContext,
- HttpMethodBase method) throws IOException {
- int statusCode = method.getStatusCode();
- log.trace("Handling response - " + statusCode);
- if (statusCode == HttpStatus.SC_OK) {
- // Save the HttpMethod so that we can release the connection when cleaning up
- msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
- processResponse(method, msgContext);
- } else if (statusCode == HttpStatus.SC_ACCEPTED) {
- /* When an HTTP 202 Accepted code has been received, this will be the case of an execution
- * of an in-only operation. In such a scenario, the HTTP response headers should be returned,
- * i.e. session cookies. */
- obtainHTTPHeaderInformation(method, msgContext);
- // Since we don't expect any content with a 202 response, we must release the connection
- method.releaseConnection();
- } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR ||
- statusCode == HttpStatus.SC_BAD_REQUEST) {
- // Save the HttpMethod so that we can release the connection when cleaning up
- msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
- Header contenttypeHeader =
- method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
- String value = null;
- if (contenttypeHeader != null) {
- value = contenttypeHeader.getValue();
- }
- OperationContext opContext = msgContext.getOperationContext();
- if(opContext!=null){
- MessageContext inMessageContext =
- opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
- if(inMessageContext!=null){
- inMessageContext.setProcessingFault(true);
- }
- }
- if (value != null) {
+ protected abstract void handleResponse(MessageContext msgContext,
+ Object httpMethodBase) throws IOException;
+
+ protected abstract void cleanup(MessageContext msgContext, Object httpMethod);
+
+
- processResponse(method, msgContext);
- }
-
- if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext)) {
- throw new AxisFault(Messages.getMessage("transportError",
- String.valueOf(statusCode),
- method.getStatusText()));
+ public void send(MessageContext msgContext, URL url, String soapActionString)
+ throws IOException {
+
+ // execute the HtttpMethodBase - a connection manager can be given for
+ // handle multiple
+
+ String httpMethod =
+ (String) msgContext.getProperty(Constants.Configuration.HTTP_METHOD);
+
+ if ((httpMethod != null)) {
+
+ if (Constants.Configuration.HTTP_METHOD_GET.equalsIgnoreCase(httpMethod)) {
+ this.sendViaGet(msgContext, url, soapActionString);
+
+ return;
+ } else if (Constants.Configuration.HTTP_METHOD_DELETE.equalsIgnoreCase(httpMethod)) {
+ this.sendViaDelete(msgContext, url, soapActionString);
+
+ return;
+ } else if (Constants.Configuration.HTTP_METHOD_PUT.equalsIgnoreCase(httpMethod)) {
+ this.sendViaPut(msgContext, url, soapActionString);
+
+ return;
}
- } else {
- // Since we don't process the response, we must release the connection immediately
- method.releaseConnection();
- throw new AxisFault(Messages.getMessage("transportError",
- String.valueOf(statusCode),
- method.getStatusText()));
}
- }
+
+ this.sendViaPost(msgContext, url, soapActionString);
+ }
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java
new file mode 100644
index 0000000..73dfeb5
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportConstants.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.axis2.transport.http;
+
+public class HTTPTransportConstants {
+
+ //Settings for HTTP proxy configuration.
+ public static final String HTTP_PROXY_HOST = "http.proxyHost";
+ public static final String HTTP_PROXY_PORT = "http.proxyPort";
+ public static final String HTTP_NON_PROXY_HOSTS = "http.nonProxyHosts";
+
+ public static final String ATTR_PROXY = "Proxy";
+ public static final String PROXY_HOST_ELEMENT = "ProxyHost";
+ public static final String PROXY_PORT_ELEMENT = "ProxyPort";
+ public static final String PROXY_USER_ELEMENT = "ProxyUser";
+ public static final String PROXY_PASSWORD_ELEMENT = "ProxyPassword";
+
+ public static final String PROXY_CONFIGURATION_NOT_FOUND = "HTTP Proxy is enabled, but proxy configuration element is missing in axis2.xml";
+ public static final String PROXY_HOST_ELEMENT_NOT_FOUND = "HTTP Proxy is enabled, but proxy host element is missing in axis2.xml";
+ public static final String PROXY_PORT_ELEMENT_NOT_FOUND = "HTTP Proxy is enabled, but proxy port element is missing in axis2.xml";
+ public static final String PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE = "HTTP Proxy is enabled, but proxy host value is empty.";
+ public static final String PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE = "HTTP Proxy is enabled, but proxy port value is empty.";
+
+ //Settings to define HTTPClient version
+ public static final String HTTP_CLIENT_VERSION = "http.client.version";
+ public static final String HTTP_CLIENT_3_X_VERSION = "http.client.version.3x";
+ public static final String HTTP_CLIENT_4_X_VERSION = "http.client.version.4x";
+
+ public static final String ANONYMOUS = "anonymous";
+ public static final String PROXY_HOST_NAME = "proxy_host";
+ public static final String PROXY_PORT = "proxy_port";
+ public static final String PROTOCOL_HTTP = "http";
+ public static final String PROTOCOL_HTTPS = "https";
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
similarity index 52%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
index 81a3c6e..0f6641e 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportSender.java
@@ -19,33 +19,11 @@
package org.apache.axis2.transport.http;
-import org.apache.commons.httpclient.methods.RequestEntity;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.transport.TransportSender;
-import java.io.IOException;
-import java.io.OutputStream;
+public interface HTTPTransportSender extends TransportSender {
-public class RESTRequestEntity2 implements RequestEntity {
- private String contentType;
- private String postRequestBody;
+ void setHTTPClientVersion(ConfigurationContext configurationContext);
- public RESTRequestEntity2(String postRequestBody, String contentType) {
- this.postRequestBody = postRequestBody;
- this.contentType = contentType;
- }
-
- public void writeRequest(OutputStream output) throws IOException {
- output.write(postRequestBody.getBytes());
- }
-
- public long getContentLength() {
- return this.postRequestBody.getBytes().length;
- }
-
- public String getContentType() {
- return this.contentType;
- }
-
- public boolean isRepeatable() {
- return true;
- }
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java b/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
index 25c58bf..01f7376 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/HttpTransportProperties.java
@@ -19,48 +19,36 @@
package org.apache.axis2.transport.http;
-import org.apache.commons.httpclient.HttpVersion;
-import org.apache.commons.httpclient.auth.AuthPolicy;
-import org.apache.commons.httpclient.auth.AuthScope;
-
-import java.util.List;
import java.util.Properties;
/**
* Utility bean for setting transport properties in runtime.
*/
-public class HttpTransportProperties {
- protected boolean chunked;
- protected HttpVersion httpVersion;
+public abstract class HttpTransportProperties {
+
+ protected boolean chunked;
protected String protocol;
-
- public HttpTransportProperties() {
- }
+
+ public abstract void setHttpVersion(Object httpVerion);
+
+ public abstract Object getHttpVersion();
public boolean getChunked() {
return chunked;
}
-
- public HttpVersion getHttpVersion() {
- return httpVersion;
- }
-
+
public String getProtocol() {
return protocol;
}
public void setChunked(boolean chunked) {
this.chunked = chunked;
- }
-
- public void setHttpVersion(HttpVersion httpVerion) {
- this.httpVersion = httpVerion;
- }
+ }
public void setProtocol(String protocol) {
this.protocol = protocol;
}
-
+
public static class ProxyProperties {
protected int proxyPort = -1;
protected String domain = null;
@@ -112,109 +100,7 @@ public class HttpTransportProperties {
}
}
- /*
- This class is responsible for holding all the necessary information needed for NTML, Digest
- and Basic Authentication. Authentication itself is handled by httpclient. User doesn't need to
- warry about what authentication mechanism it uses. Axis2 uses httpclinet's default authentication
- patterns.
- */
- public static class Authenticator {
- /*host that needed to be authenticated with*/
- private String host;
- /*port of the host that needed to be authenticated with*/
- private int port = AuthScope.ANY_PORT;
- /*Realm for authentication scope*/
- private String realm = AuthScope.ANY_REALM;
- /*Domain needed by NTCredentials for NT Domain*/
- private String domain;
- /*User for authenticate*/
- private String username;
- /*Password of the user for authenticate*/
- private String password;
- /* Switch to use preemptive authentication or not*/
- private boolean preemptive = false;
- /* if Authentication scheme needs retry just turn on the following flag */
- private boolean allowedRetry = false;
- /* Changing the priorty or adding a custom AuthPolicy*/
- private List authSchemes;
-
- /* Default Auth Schems*/
- public static final String NTLM = AuthPolicy.NTLM;
- public static final String DIGEST = AuthPolicy.DIGEST;
- public static final String BASIC = AuthPolicy.BASIC;
-
- public String getHost() {
- return host;
- }
-
- public void setHost(String host) {
- this.host = host;
- }
-
- public int getPort() {
- return port;
- }
-
- public void setPort(int port) {
- this.port = port;
- }
-
- public String getRealm() {
- return realm;
- }
-
- public void setRealm(String realm) {
- this.realm = realm;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public void setPreemptiveAuthentication(boolean preemptive) {
- this.preemptive = preemptive;
- }
-
- public boolean getPreemptiveAuthentication() {
- return this.preemptive;
- }
-
- public String getDomain() {
- return domain;
- }
-
- public void setDomain(String domain) {
- this.domain = domain;
- }
-
- public void setAuthSchemes(List authSchemes) {
- this.authSchemes = authSchemes;
- }
-
- public List getAuthSchemes() {
- return this.authSchemes;
- }
-
- public void setAllowedRetry(boolean allowedRetry) {
- this.allowedRetry = allowedRetry;
- }
-
- public boolean isAllowedRetry() {
- return this.allowedRetry;
- }
- }
+
/**
* @deprecated org.apache.axis2.transport.http.HttpTransportProperties.MailProperties has been
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
index bca0588..6410584 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity.java
@@ -23,7 +23,6 @@ import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
-import org.apache.commons.httpclient.methods.RequestEntity;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLStreamException;
@@ -31,7 +30,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
-public class RESTRequestEntity implements RequestEntity {
+public abstract class RESTRequestEntity {
private byte[] bytes;
private String charSetEnc;
private boolean chunked;
@@ -115,7 +114,7 @@ public class RESTRequestEntity implements RequestEntity {
}
}
- public String getContentType() {
+ public String getContentTypeAsString() {
String encoding = format.getCharSetEncoding();
String contentType = format.getContentType();
if (encoding != null) {
@@ -133,4 +132,61 @@ public class RESTRequestEntity implements RequestEntity {
public boolean isRepeatable() {
return true;
}
+
+ public byte[] getBytes() {
+ return bytes;
+ }
+
+ public void setBytes(byte[] bytes) {
+ this.bytes = bytes;
+ }
+
+ public String getCharSetEnc() {
+ return charSetEnc;
+ }
+
+ public void setCharSetEnc(String charSetEnc) {
+ this.charSetEnc = charSetEnc;
+ }
+
+ public boolean isChunked() {
+ return chunked;
+ }
+
+ public void setChunked(boolean chunked) {
+ this.chunked = chunked;
+ }
+
+ public OMElement getElement() {
+ return element;
+ }
+
+ public void setElement(OMElement element) {
+ this.element = element;
+ }
+
+ public MessageContext getMsgCtxt() {
+ return msgCtxt;
+ }
+
+ public void setMsgCtxt(MessageContext msgCtxt) {
+ this.msgCtxt = msgCtxt;
+ }
+
+ public String getSoapActionString() {
+ return soapActionString;
+ }
+
+ public void setSoapActionString(String soapActionString) {
+ this.soapActionString = soapActionString;
+ }
+
+ public OMOutputFormat getFormat() {
+ return format;
+ }
+
+ public void setFormat(OMOutputFormat format) {
+ this.format = format;
+ }
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
index 81a3c6e..434b127 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
@@ -19,12 +19,10 @@
package org.apache.axis2.transport.http;
-import org.apache.commons.httpclient.methods.RequestEntity;
-
import java.io.IOException;
import java.io.OutputStream;
-public class RESTRequestEntity2 implements RequestEntity {
+public abstract class RESTRequestEntity2 {
private String contentType;
private String postRequestBody;
@@ -41,11 +39,25 @@ public class RESTRequestEntity2 implements RequestEntity {
return this.postRequestBody.getBytes().length;
}
- public String getContentType() {
+ public String getContentTypeAsString() {
return this.contentType;
}
public boolean isRepeatable() {
return true;
}
+
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+ public String getPostRequestBody() {
+ return postRequestBody;
+ }
+
+ public void setPostRequestBody(String postRequestBody) {
+ this.postRequestBody = postRequestBody;
+ }
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java
new file mode 100644
index 0000000..33f42e9
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/AxisRequestEntityImpl.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.MessageFormatter;
+import org.apache.axis2.transport.http.AxisRequestEntity;
+
+import org.apache.commons.httpclient.methods.RequestEntity;
+
+/**
+ * This Request Entity is used by the HTTPCommonsTransportSender. This wraps the
+ * Axis2 message formatter object.
+ */
+public class AxisRequestEntityImpl extends AxisRequestEntity implements RequestEntity {
+
+ /**
+ * Method calls to this request entity are delegated to the following Axis2
+ * message formatter object.
+ *
+ * @param messageFormatter
+ */
+ public AxisRequestEntityImpl(MessageFormatter messageFormatter, MessageContext msgContext,
+ OMOutputFormat format, String soapAction, boolean chunked, boolean isAllowedRetry) {
+ super(messageFormatter, msgContext, format, soapAction, chunked, isAllowedRetry);
+ }
+
+ public String getContentType() {
+ return getContentTypeAsString();
+ }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java
new file mode 100644
index 0000000..fbaaef4
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPClient3TransportSender.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.http.CommonsHTTPTransportSender;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
+import org.apache.axis2.transport.http.HTTPTransportSender;
+
+public class HTTPClient3TransportSender extends CommonsHTTPTransportSender implements
+ HTTPTransportSender {
+
+ public void setHTTPClientVersion(ConfigurationContext configurationContext) {
+ configurationContext.setProperty(HTTPTransportConstants.HTTP_CLIENT_VERSION,
+ HTTPTransportConstants.HTTP_CLIENT_3_X_VERSION);
+ }
+
+ @Override
+ public void cleanup(MessageContext msgContext) throws AxisFault {
+ super.cleanup(msgContext);
+ }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
similarity index 60%
copy from modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
index a163450..670e9e1 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPProxcyConfigurator.java
@@ -17,13 +17,19 @@
* under the License.
*/
-package org.apache.axis2.transport.http.util;
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import java.net.URL;
+import java.util.StringTokenizer;
+
+import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
import org.apache.axis2.transport.http.HttpTransportProperties;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HostConfiguration;
@@ -35,60 +41,31 @@ import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import javax.xml.namespace.QName;
-import java.net.URL;
-import java.util.StringTokenizer;
+public class HTTPProxcyConfigurator {
-/**
- * Contains utility functions used when configuring HTTP Proxy for HTTP Sender.
- */
-public class HTTPProxyConfigurationUtil {
- private static Log log = LogFactory.getLog(HTTPProxyConfigurationUtil.class);
-
- protected static final String HTTP_PROXY_HOST = "http.proxyHost";
- protected static final String HTTP_PROXY_PORT = "http.proxyPort";
- protected static final String HTTP_NON_PROXY_HOSTS = "http.nonProxyHosts";
-
- protected static final String ATTR_PROXY = "Proxy";
- protected static final String PROXY_HOST_ELEMENT = "ProxyHost";
- protected static final String PROXY_PORT_ELEMENT = "ProxyPort";
- protected static final String PROXY_USER_ELEMENT = "ProxyUser";
- protected static final String PROXY_PASSWORD_ELEMENT = "ProxyPassword";
-
-
- protected static final String PROXY_CONFIGURATION_NOT_FOUND =
- "HTTP Proxy is enabled, but proxy configuration element is missing in axis2.xml";
- protected static final String PROXY_HOST_ELEMENT_NOT_FOUND =
- "HTTP Proxy is enabled, but proxy host element is missing in axis2.xml";
- protected static final String PROXY_PORT_ELEMENT_NOT_FOUND =
- "HTTP Proxy is enabled, but proxy port element is missing in axis2.xml";
- protected static final String PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE =
- "HTTP Proxy is enabled, but proxy host value is empty.";
- protected static final String PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE =
- "HTTP Proxy is enabled, but proxy port value is empty.";
+ private static Log log = LogFactory.getLog(HTTPProxcyConfigurator.class);
/**
- * Configure HTTP Proxy settings of commons-httpclient HostConfiguration. Proxy settings can be get from
- * axis2.xml, Java proxy settings or can be override through property in message context.
+ * Configure HTTP Proxy settings of commons-httpclient HostConfiguration.
+ * Proxy settings can be get from axis2.xml, Java proxy settings or can be
+ * override through property in message context.
* <p/>
- * HTTP Proxy setting element format:
- * <parameter name="Proxy">
- * <Configuration>
- * <ProxyHost>example.org</ProxyHost>
- * <ProxyPort>3128</ProxyPort>
- * <ProxyUser>EXAMPLE/John</ProxyUser>
- * <ProxyPassword>password</ProxyPassword>
- * <Configuration>
- * <parameter>
- *
- * @param messageContext in message context for
- * @param httpClient commons-httpclient instance
- * @param config commons-httpclient HostConfiguration
- * @throws AxisFault if Proxy settings are invalid
+ * HTTP Proxy setting element format: <parameter name="Proxy">
+ * <Configuration> <ProxyHost>example.org</ProxyHost>
+ * <ProxyPort>3128</ProxyPort> <ProxyUser>EXAMPLE/John</ProxyUser>
+ * <ProxyPassword>password</ProxyPassword> <Configuration> <parameter>
+ *
+ * @param messageContext
+ * in message context for
+ * @param httpClient
+ * commons-httpclient instance
+ * @param config
+ * commons-httpclient HostConfiguration
+ * @throws AxisFault
+ * if Proxy settings are invalid
*/
- public static void configure(MessageContext messageContext,
- HttpClient httpClient,
- HostConfiguration config) throws AxisFault {
+ public static void configure(MessageContext messageContext, HttpClient httpClient,
+ HostConfiguration config) throws AxisFault {
Credentials proxyCredentials = null;
String proxyHost = null;
@@ -97,23 +74,23 @@ public class HTTPProxyConfigurationUtil {
String proxyUser = null;
String proxyPassword = null;
- //Getting configuration values from Axis2.xml
- Parameter proxySettingsFromAxisConfig = messageContext.getConfigurationContext().getAxisConfiguration()
- .getParameter(ATTR_PROXY);
+ // Getting configuration values from Axis2.xml
+ Parameter proxySettingsFromAxisConfig = messageContext.getConfigurationContext()
+ .getAxisConfiguration().getParameter(HTTPTransportConstants.ATTR_PROXY);
if (proxySettingsFromAxisConfig != null) {
OMElement proxyConfiguration = getProxyConfigurationElement(proxySettingsFromAxisConfig);
proxyHost = getProxyHost(proxyConfiguration);
proxyPort = getProxyPort(proxyConfiguration);
proxyUser = getProxyUser(proxyConfiguration);
proxyPassword = getProxyPassword(proxyConfiguration);
- if(proxyUser != null){
- if(proxyPassword == null){
+ if (proxyUser != null) {
+ if (proxyPassword == null) {
proxyPassword = "";
}
int proxyUserDomainIndex = proxyUser.indexOf("\\");
- if( proxyUserDomainIndex > 0){
+ if (proxyUserDomainIndex > 0) {
String domain = proxyUser.substring(0, proxyUserDomainIndex);
- if(proxyUser.length() > proxyUserDomainIndex + 1) {
+ if (proxyUser.length() > proxyUserDomainIndex + 1) {
String user = proxyUser.substring(proxyUserDomainIndex + 1);
proxyCredentials = new NTCredentials(user, proxyPassword, proxyHost, domain);
}
@@ -123,12 +100,13 @@ public class HTTPProxyConfigurationUtil {
}
- // If there is runtime proxy settings, these settings will override settings from axis2.xml
- HttpTransportProperties.ProxyProperties proxyProperties =
- (HttpTransportProperties.ProxyProperties) messageContext.getProperty(HTTPConstants.PROXY);
- if(proxyProperties != null) {
+ // If there is runtime proxy settings, these settings will override
+ // settings from axis2.xml
+ HttpTransportProperties.ProxyProperties proxyProperties = (HttpTransportProperties.ProxyProperties) messageContext
+ .getProperty(HTTPConstants.PROXY);
+ if (proxyProperties != null) {
String proxyHostProp = proxyProperties.getProxyHostName();
- if(proxyHostProp == null || proxyHostProp.length() <= 0) {
+ if (proxyHostProp == null || proxyHostProp.length() <= 0) {
throw new AxisFault("HTTP Proxy host is not available. Host is a MUST parameter");
} else {
proxyHost = proxyHostProp;
@@ -140,29 +118,30 @@ public class HTTPProxyConfigurationUtil {
String password = proxyProperties.getPassWord();
String domain = proxyProperties.getDomain();
- if(userName != null && password != null && domain != null){
+ if (userName != null && password != null && domain != null) {
proxyCredentials = new NTCredentials(userName, password, proxyHost, domain);
- } else if(userName != null && domain == null){
+ } else if (userName != null && domain == null) {
proxyCredentials = new UsernamePasswordCredentials(userName, password);
}
}
// Overriding proxy settings if proxy is available from JVM settings
- String host = System.getProperty(HTTP_PROXY_HOST);
- if(host != null) {
+ String host = System.getProperty(HTTPTransportConstants.HTTP_PROXY_HOST);
+ if (host != null) {
proxyHost = host;
}
- String port = System.getProperty(HTTP_PROXY_PORT);
- if(port != null) {
+ String port = System.getProperty(HTTPTransportConstants.HTTP_PROXY_PORT);
+ if (port != null) {
proxyPort = Integer.parseInt(port);
}
- if(proxyCredentials != null) {
+ if (proxyCredentials != null) {
httpClient.getParams().setAuthenticationPreemptive(true);
- HttpState cachedHttpState = (HttpState)messageContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
- if(cachedHttpState != null){
+ HttpState cachedHttpState = (HttpState) messageContext
+ .getProperty(HTTPConstants.CACHED_HTTP_STATE);
+ if (cachedHttpState != null) {
httpClient.setState(cachedHttpState);
}
httpClient.getState().setProxyCredentials(AuthScope.ANY, proxyCredentials);
@@ -170,45 +149,50 @@ public class HTTPProxyConfigurationUtil {
config.setProxy(proxyHost, proxyPort);
}
- private static OMElement getProxyConfigurationElement(Parameter proxySettingsFromAxisConfig) throws AxisFault {
- OMElement proxyConfigurationElement = proxySettingsFromAxisConfig.getParameterElement().getFirstElement();
+ private static OMElement getProxyConfigurationElement(Parameter proxySettingsFromAxisConfig)
+ throws AxisFault {
+ OMElement proxyConfigurationElement = proxySettingsFromAxisConfig.getParameterElement()
+ .getFirstElement();
if (proxyConfigurationElement == null) {
- log.error(PROXY_CONFIGURATION_NOT_FOUND);
- throw new AxisFault(PROXY_CONFIGURATION_NOT_FOUND);
+ log.error(HTTPTransportConstants.PROXY_CONFIGURATION_NOT_FOUND);
+ throw new AxisFault(HTTPTransportConstants.PROXY_CONFIGURATION_NOT_FOUND);
}
return proxyConfigurationElement;
}
private static String getProxyHost(OMElement proxyConfiguration) throws AxisFault {
- OMElement proxyHostElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_HOST_ELEMENT));
+ OMElement proxyHostElement = proxyConfiguration.getFirstChildWithName(new QName(
+ HTTPTransportConstants.PROXY_HOST_ELEMENT));
if (proxyHostElement == null) {
- log.error(PROXY_HOST_ELEMENT_NOT_FOUND);
- throw new AxisFault(PROXY_HOST_ELEMENT_NOT_FOUND);
+ log.error(HTTPTransportConstants.PROXY_HOST_ELEMENT_NOT_FOUND);
+ throw new AxisFault(HTTPTransportConstants.PROXY_HOST_ELEMENT_NOT_FOUND);
}
String proxyHost = proxyHostElement.getText();
if (proxyHost == null) {
- log.error(PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
- throw new AxisFault(PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
+ log.error(HTTPTransportConstants.PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
+ throw new AxisFault(HTTPTransportConstants.PROXY_HOST_ELEMENT_WITH_EMPTY_VALUE);
}
return proxyHost;
}
private static Integer getProxyPort(OMElement proxyConfiguration) throws AxisFault {
- OMElement proxyPortElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_PORT_ELEMENT));
+ OMElement proxyPortElement = proxyConfiguration.getFirstChildWithName(new QName(
+ HTTPTransportConstants.PROXY_PORT_ELEMENT));
if (proxyPortElement == null) {
- log.error(PROXY_PORT_ELEMENT_NOT_FOUND);
- throw new AxisFault(PROXY_PORT_ELEMENT_NOT_FOUND);
+ log.error(HTTPTransportConstants.PROXY_PORT_ELEMENT_NOT_FOUND);
+ throw new AxisFault(HTTPTransportConstants.PROXY_PORT_ELEMENT_NOT_FOUND);
}
String proxyPort = proxyPortElement.getText();
if (proxyPort == null) {
- log.error(PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
- throw new AxisFault(PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
+ log.error(HTTPTransportConstants.PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
+ throw new AxisFault(HTTPTransportConstants.PROXY_PORT_ELEMENT_WITH_EMPTY_VALUE);
}
return Integer.parseInt(proxyPort);
}
private static String getProxyUser(OMElement proxyConfiguration) {
- OMElement proxyUserElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_USER_ELEMENT));
+ OMElement proxyUserElement = proxyConfiguration.getFirstChildWithName(new QName(
+ HTTPTransportConstants.PROXY_USER_ELEMENT));
if (proxyUserElement == null) {
return null;
}
@@ -222,7 +206,8 @@ public class HTTPProxyConfigurationUtil {
}
private static String getProxyPassword(OMElement proxyConfiguration) {
- OMElement proxyPasswordElement = proxyConfiguration.getFirstChildWithName(new QName(PROXY_PASSWORD_ELEMENT));
+ OMElement proxyPasswordElement = proxyConfiguration.getFirstChildWithName(new QName(
+ HTTPTransportConstants.PROXY_PASSWORD_ELEMENT));
if (proxyPasswordElement == null) {
return null;
}
@@ -236,24 +221,26 @@ public class HTTPProxyConfigurationUtil {
}
/**
- * Check whether http proxy is configured or active.
- * This is not a deep check.
- *
- * @param messageContext in message context
- * @param targetURL URL of the edpoint which we are sending the request
+ * Check whether http proxy is configured or active. This is not a deep
+ * check.
+ *
+ * @param messageContext
+ * in message context
+ * @param targetURL
+ * URL of the edpoint which we are sending the request
* @return true if proxy is enabled, false otherwise
*/
public static boolean isProxyEnabled(MessageContext messageContext, URL targetURL) {
boolean proxyEnabled = false;
Parameter param = messageContext.getConfigurationContext().getAxisConfiguration()
- .getParameter(ATTR_PROXY);
+ .getParameter(HTTPTransportConstants.ATTR_PROXY);
- //If configuration is over ridden
+ // If configuration is over ridden
Object obj = messageContext.getProperty(HTTPConstants.PROXY);
- //From Java Networking Properties
- String sp = System.getProperty(HTTP_PROXY_HOST);
+ // From Java Networking Properties
+ String sp = System.getProperty(HTTPTransportConstants.HTTP_PROXY_HOST);
if (param != null || obj != null || sp != null) {
proxyEnabled = true;
@@ -265,31 +252,35 @@ public class HTTPProxyConfigurationUtil {
}
/**
- * Validates for names that shouldn't be listered as proxies.
- * The http.nonProxyHosts can be set to specify the hosts which should be
- * connected to directly (not through the proxy server).
- * The value of the http.nonProxyHosts property can be a list of hosts,
- * each separated by a |; it can also take a regular expression for matches;
- * for example: *.sfbay.sun.com would match any fully qualified hostname in the sfbay domain.
+ * Validates for names that shouldn't be listered as proxies. The
+ * http.nonProxyHosts can be set to specify the hosts which should be
+ * connected to directly (not through the proxy server). The value of the
+ * http.nonProxyHosts property can be a list of hosts, each separated by a
+ * |; it can also take a regular expression for matches; for example:
+ * *.sfbay.sun.com would match any fully qualified hostname in the sfbay
+ * domain.
* <p/>
- * For more information refer to : http://java.sun.com/features/2002/11/hilevel_network.html
+ * For more information refer to :
+ * http://java.sun.com/features/2002/11/hilevel_network.html
* <p/>
- * false : validation fail : User can use the proxy
- * true : validation pass ; User can't use the proxy
- *
+ * false : validation fail : User can use the proxy true : validation pass ;
+ * User can't use the proxy
+ *
* @return boolean
*/
private static boolean validateNonProxyHosts(String host) {
- //From system property http.nonProxyHosts
- String nonProxyHosts = System.getProperty(HTTP_NON_PROXY_HOSTS);
+ // From system property http.nonProxyHosts
+ String nonProxyHosts = System.getProperty(HTTPTransportConstants.HTTP_NON_PROXY_HOSTS);
return isHostInNonProxyList(host, nonProxyHosts);
}
/**
* Check if the specified host is in the list of non proxy hosts.
- *
- * @param host host name
- * @param nonProxyHosts string containing the list of non proxy hosts
+ *
+ * @param host
+ * host name
+ * @param nonProxyHosts
+ * string containing the list of non proxy hosts
* @return true/false
*/
public static boolean isHostInNonProxyList(String host, String nonProxyHosts) {
@@ -298,8 +289,8 @@ public class HTTPProxyConfigurationUtil {
}
/*
- * The http.nonProxyHosts system property is a list enclosed in
- * double quotes with items separated by a vertical bar.
+ * The http.nonProxyHosts system property is a list enclosed in double
+ * quotes with items separated by a vertical bar.
*/
StringTokenizer tokenizer = new StringTokenizer(nonProxyHosts, "|\"");
@@ -314,18 +305,17 @@ public class HTTPProxyConfigurationUtil {
/**
* Matches a string against a pattern. The pattern contains two special
- * characters:
- * '*' which means zero or more characters,
- *
- * @param pattern the (non-null) pattern to match against
- * @param str the (non-null) string that must be matched against the
- * pattern
+ * characters: '*' which means zero or more characters,
+ *
+ * @param pattern
+ * the (non-null) pattern to match against
+ * @param str
+ * the (non-null) string that must be matched against the pattern
* @param isCaseSensitive
* @return <code>true</code> when the string matches against the pattern,
* <code>false</code> otherwise.
*/
- private static boolean match(String pattern, String str,
- boolean isCaseSensitive) {
+ private static boolean match(String pattern, String str, boolean isCaseSensitive) {
char[] patArr = pattern.toCharArray();
char[] strArr = str.toCharArray();
@@ -346,35 +336,32 @@ public class HTTPProxyConfigurationUtil {
// No '*'s, so we make a shortcut
if (patIdxEnd != strIdxEnd) {
- return false; // Pattern and string do not have the same size
+ return false; // Pattern and string do not have the same size
}
for (int i = 0; i <= patIdxEnd; i++) {
ch = patArr[i];
if (isCaseSensitive && (ch != strArr[i])) {
- return false; // Character mismatch
+ return false; // Character mismatch
}
if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[i]))) {
- return false; // Character mismatch
+ && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[i]))) {
+ return false; // Character mismatch
}
}
- return true; // String matches against pattern
+ return true; // String matches against pattern
}
if (patIdxEnd == 0) {
- return true; // Pattern contains only '*', which matches anything
+ return true; // Pattern contains only '*', which matches anything
}
// Process characters before first star
- while ((ch = patArr[patIdxStart]) != '*'
- && (strIdxStart <= strIdxEnd)) {
+ while ((ch = patArr[patIdxStart]) != '*' && (strIdxStart <= strIdxEnd)) {
if (isCaseSensitive && (ch != strArr[strIdxStart])) {
- return false; // Character mismatch
+ return false; // Character mismatch
}
if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxStart]))) {
- return false; // Character mismatch
+ && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[strIdxStart]))) {
+ return false; // Character mismatch
}
patIdxStart++;
strIdxStart++;
@@ -394,12 +381,11 @@ public class HTTPProxyConfigurationUtil {
// Process characters after last star
while ((ch = patArr[patIdxEnd]) != '*' && (strIdxStart <= strIdxEnd)) {
if (isCaseSensitive && (ch != strArr[strIdxEnd])) {
- return false; // Character mismatch
+ return false; // Character mismatch
}
if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxEnd]))) {
- return false; // Character mismatch
+ && (Character.toUpperCase(ch) != Character.toUpperCase(strArr[strIdxEnd]))) {
+ return false; // Character mismatch
}
patIdxEnd--;
strIdxEnd--;
@@ -440,17 +426,15 @@ public class HTTPProxyConfigurationUtil {
int strLength = (strIdxEnd - strIdxStart + 1);
int foundIdx = -1;
- strLoop:
- for (int i = 0; i <= strLength - patLength; i++) {
+ strLoop: for (int i = 0; i <= strLength - patLength; i++) {
for (int j = 0; j < patLength; j++) {
ch = patArr[patIdxStart + j + 1];
- if (isCaseSensitive
- && (ch != strArr[strIdxStart + i + j])) {
+ if (isCaseSensitive && (ch != strArr[strIdxStart + i + j])) {
continue strLoop;
}
- if (!isCaseSensitive && (Character
- .toUpperCase(ch) != Character
- .toUpperCase(strArr[strIdxStart + i + j]))) {
+ if (!isCaseSensitive
+ && (Character.toUpperCase(ch) != Character
+ .toUpperCase(strArr[strIdxStart + i + j]))) {
continue strLoop;
}
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
similarity index 52%
copy from modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
index f02875a..4c5d7b8 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java
@@ -17,31 +17,51 @@
* under the License.
*/
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.GZIPInputStream;
+
+import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
+import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.NamedValue;
import org.apache.axis2.context.OperationContext;
-import org.apache.axis2.context.ConfigurationContext;
-import org.apache.axis2.description.TransportOutDescription;
import org.apache.axis2.i18n.Messages;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.transport.TransportUtils;
-import org.apache.axis2.transport.http.util.HTTPProxyConfigurationUtil;
+import org.apache.axis2.transport.http.HTTPAuthenticator;
+import org.apache.axis2.transport.http.HTTPConstants;
+import org.apache.axis2.transport.http.HTTPSender;
+import org.apache.axis2.transport.http.HTTPTransportConstants;
import org.apache.axis2.wsdl.WSDLConstants;
-import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HeaderElement;
-import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HeaderElement;
+import org.apache.commons.httpclient.HostConfiguration;
+import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
@@ -56,75 +76,306 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.protocol.HTTP;
-import javax.xml.namespace.QName;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.GZIPInputStream;
+public class HTTPSenderImpl extends HTTPSender {
+
+ private static final Log log = LogFactory.getLog(HTTPSenderImpl.class);
-public abstract class AbstractHTTPSender {
- protected static final String ANONYMOUS = "anonymous";
- protected static final String PROXY_HOST_NAME = "proxy_host";
- protected static final String PROXY_PORT = "proxy_port";
- protected boolean chunked = false;
- protected String httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
- private static final Log log = LogFactory.getLog(AbstractHTTPSender.class);
+ /**
+ * Used to send a request via HTTP Get method
+ *
+ * @param msgContext
+ * - The MessageContext of the message
+ * @param url
+ * - The target URL
+ * @param soapActiionString
+ * - The soapAction string of the request
+ * @throws AxisFault
+ * - Thrown in case an exception occurs
+ */
+ protected void sendViaGet(MessageContext msgContext, URL url, String soapActiionString)
+ throws AxisFault {
+
+ GetMethod getMethod = new GetMethod();
+ HttpClient httpClient = getHttpClient(msgContext);
+ MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, getMethod,
+ httpClient, soapActiionString);
+
+ // Need to have this here because we can have soap action when using the
+ // soap response MEP
+ String soapAction = messageFormatter
+ .formatSOAPAction(msgContext, format, soapActiionString);
+
+ if (soapAction != null) {
+ getMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+ }
+ try {
+ executeMethod(httpClient, msgContext, url, getMethod);
+ handleResponse(msgContext, getMethod);
+ } catch (IOException e) {
+ log.info("Unable to sendViaGet to url[" + url + "]", e);
+ throw AxisFault.makeFault(e);
+ } finally {
+ cleanup(msgContext, getMethod);
+ }
+ }
- protected static final String PROTOCOL_HTTP = "http";
- protected static final String PROTOCOL_HTTPS = "https";
+ protected void cleanup(MessageContext msgContext, Object httpMmethod) {
+ if (httpMmethod instanceof HttpMethod) {
+ if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) {
+ log.trace("AutoReleasing " + httpMmethod);
+ ((HttpMethod) httpMmethod).releaseConnection();
+ }
+ }
+ }
/**
- * proxydiscription
+ * Used to send a request via HTTP Delete Method
+ *
+ * @param msgContext
+ * - The MessageContext of the message
+ * @param url
+ * - The target URL
+ * @param soapActiionString
+ * - The soapAction string of the request
+ * @throws AxisFault
+ * - Thrown in case an exception occurs
*/
- protected TransportOutDescription proxyOutSetting = null;
- protected OMOutputFormat format = new OMOutputFormat();
+ protected void sendViaDelete(MessageContext msgContext, URL url, String soapActiionString)
+ throws AxisFault {
+
+ DeleteMethod deleteMethod = new DeleteMethod();
+ HttpClient httpClient = getHttpClient(msgContext);
+ populateCommonProperties(msgContext, url, deleteMethod, httpClient, soapActiionString);
+
+ try {
+ executeMethod(httpClient, msgContext, url, deleteMethod);
+ handleResponse(msgContext, deleteMethod);
+ } catch (IOException e) {
+ log.info("Unable to sendViaDelete to url[" + url + "]", e);
+ throw AxisFault.makeFault(e);
+ } finally {
+ cleanup(msgContext, deleteMethod);
+ }
+ }
/**
- * isAllowedRetry will be using to check where the
- * retry should be allowed or not.
+ * Used to send a request via HTTP Post Method
+ *
+ * @param msgContext
+ * - The MessageContext of the message
+ * @param url
+ * - The target URL
+ * @param soapActionString
+ * - The soapAction string of the request
+ * @throws AxisFault
+ * - Thrown in case an exception occurs
*/
- protected boolean isAllowedRetry = false;
+ protected void sendViaPost(MessageContext msgContext, URL url, String soapActionString)
+ throws AxisFault {
- public void setChunked(boolean chunked) {
- this.chunked = chunked;
+ HttpClient httpClient = getHttpClient(msgContext);
+
+ /*
+ * What's up with this, it never gets used anywhere?? --Glen String
+ * charEncoding = (String)
+ * msgContext.getProperty(Constants.Configuration
+ * .CHARACTER_SET_ENCODING);
+ *
+ * if (charEncoding == null) { charEncoding =
+ * MessageContext.DEFAULT_CHAR_SET_ENCODING; }
+ */
+
+ PostMethod postMethod = new PostMethod();
+ if (log.isTraceEnabled()) {
+ log.trace(Thread.currentThread() + " PostMethod " + postMethod + " / " + httpClient);
+ }
+ MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, postMethod,
+ httpClient, soapActionString);
+
+ postMethod.setRequestEntity(new AxisRequestEntityImpl(messageFormatter, msgContext, format,
+ soapActionString, chunked, isAllowedRetry));
+
+ if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
+ postMethod.setContentChunked(true);
+ }
+
+ String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
+
+ if (soapAction != null) {
+ postMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+ }
+
+ /*
+ * main excecution takes place..
+ */
+ try {
+ executeMethod(httpClient, msgContext, url, postMethod);
+ handleResponse(msgContext, postMethod);
+ } catch (IOException e) {
+ log.info("Unable to sendViaPost to url[" + url + "]", e);
+ throw AxisFault.makeFault(e);
+ } finally {
+ cleanup(msgContext, postMethod);
+ }
}
- public void setHttpVersion(String version) throws AxisFault {
- if (version != null) {
- if (HTTPConstants.HEADER_PROTOCOL_11.equals(version)) {
- this.httpVersion = HTTPConstants.HEADER_PROTOCOL_11;
- } else if (HTTPConstants.HEADER_PROTOCOL_10.equals(version)) {
- this.httpVersion = HTTPConstants.HEADER_PROTOCOL_10;
- // chunked is not possible with HTTP/1.0
- this.chunked = false;
- } else {
- throw new AxisFault(
- "Parameter " + HTTPConstants.PROTOCOL_VERSION
- + " Can have values only HTTP/1.0 or HTTP/1.1");
+ /**
+ * Used to send a request via HTTP Put Method
+ *
+ * @param msgContext
+ * - The MessageContext of the message
+ * @param url
+ * - The target URL
+ * @param soapActionString
+ * - The soapAction string of the request
+ * @throws AxisFault
+ * - Thrown in case an exception occurs
+ */
+ protected void sendViaPut(MessageContext msgContext, URL url, String soapActionString)
+ throws AxisFault {
+
+ HttpClient httpClient = getHttpClient(msgContext);
+
+ /*
+ * Same deal - this value never gets used, why is it here? --Glen String
+ * charEncoding = (String)
+ * msgContext.getProperty(Constants.Configuration
+ * .CHARACTER_SET_ENCODING);
+ *
+ * if (charEncoding == null) { charEncoding =
+ * MessageContext.DEFAULT_CHAR_SET_ENCODING; }
+ */
+
+ PutMethod putMethod = new PutMethod();
+ MessageFormatter messageFormatter = populateCommonProperties(msgContext, url, putMethod,
+ httpClient, soapActionString);
+
+ putMethod.setRequestEntity(new AxisRequestEntityImpl(messageFormatter, msgContext, format,
+ soapActionString, chunked, isAllowedRetry));
+
+ if (!httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10) && chunked) {
+ putMethod.setContentChunked(true);
+ }
+
+ String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
+ if (soapAction != null) {
+ putMethod.setRequestHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
+ }
+
+ /*
+ * main excecution takes place..
+ */
+ try {
+ executeMethod(httpClient, msgContext, url, putMethod);
+ handleResponse(msgContext, putMethod);
+ } catch (IOException e) {
+ log.info("Unable to sendViaPut to url[" + url + "]", e);
+ throw AxisFault.makeFault(e);
+ } finally {
+ cleanup(msgContext, putMethod);
+ }
+ }
+
+ /**
+ * Used to handle the HTTP Response
+ *
+ * @param msgContext
+ * - The MessageContext of the message
+ * @param method
+ * - The HTTP method used
+ * @throws IOException
+ * - Thrown in case an exception occurs
+ */
+ protected void handleResponse(MessageContext msgContext, Object httpMethodBase)
+ throws IOException {
+ HttpMethodBase method;
+ if (httpMethodBase instanceof HttpMethodBase) {
+ method = (HttpMethodBase) httpMethodBase;
+ } else {
+ log.trace("HttpMethodBase expected, but found - " + httpMethodBase);
+ return;
+ }
+ int statusCode = method.getStatusCode();
+ log.trace("Handling response - " + statusCode);
+ if (statusCode == HttpStatus.SC_OK) {
+ // Save the HttpMethod so that we can release the connection when
+ // cleaning up
+ msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
+ processResponse(method, msgContext);
+ } else if (statusCode == HttpStatus.SC_ACCEPTED) {
+ /*
+ * When an HTTP 202 Accepted code has been received, this will be
+ * the case of an execution of an in-only operation. In such a
+ * scenario, the HTTP response headers should be returned, i.e.
+ * session cookies.
+ */
+ obtainHTTPHeaderInformation(method, msgContext);
+ // Since we don't expect any content with a 202 response, we must
+ // release the connection
+ method.releaseConnection();
+ } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR
+ || statusCode == HttpStatus.SC_BAD_REQUEST) {
+ // Save the HttpMethod so that we can release the connection when
+ // cleaning up
+ msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
+ Header contenttypeHeader = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
+ String value = null;
+ if (contenttypeHeader != null) {
+ value = contenttypeHeader.getValue();
+ }
+ OperationContext opContext = msgContext.getOperationContext();
+ if (opContext != null) {
+ MessageContext inMessageContext = opContext
+ .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
+ if (inMessageContext != null) {
+ inMessageContext.setProcessingFault(true);
+ }
+ }
+ if (value != null) {
+
+ processResponse(method, msgContext);
+ }
+
+ if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext)) {
+ throw new AxisFault(Messages.getMessage("transportError",
+ String.valueOf(statusCode), method.getStatusText()));
}
+ } else {
+ // Since we don't process the response, we must release the
+ // connection immediately
+ method.releaseConnection();
+ throw new AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode),
+ method.getStatusText()));
}
}
/**
* Collect the HTTP header information and set them in the message context
- *
- * @param method HttpMethodBase from which to get information
- * @param msgContext the MessageContext in which to place the information... OR NOT!
- * @throws AxisFault if problems occur
+ *
+ * @param method
+ * HttpMethodBase from which to get information
+ * @param msgContext
+ * the MessageContext in which to place the information... OR
+ * NOT!
+ * @throws AxisFault
+ * if problems occur
*/
- protected void obtainHTTPHeaderInformation(HttpMethodBase method,
- MessageContext msgContext) throws AxisFault {
- // Set RESPONSE properties onto the REQUEST message context. They will need to be copied off the request context onto
- // the response context elsewhere, for example in the OutInOperationClient.
- Map transportHeaders = new CommonsTransportHeaders(method.getResponseHeaders());
+ protected void obtainHTTPHeaderInformation(Object httpMethodBase, MessageContext msgContext)
+ throws AxisFault {
+ HttpMethod method;
+ if (httpMethodBase instanceof HttpMethodBase) {
+ method = (HttpMethod) httpMethodBase;
+ } else {
+ return;
+ }
+ // Set RESPONSE properties onto the REQUEST message context. They will
+ // need to be copied off the request context onto
+ // the response context elsewhere, for example in the
+ // OutInOperationClient.
+ Map transportHeaders = new HTTPTransportHeaders(method.getResponseHeaders());
msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders);
- msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, new Integer(method.getStatusCode()));
+ msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE,
+ new Integer(method.getStatusCode()));
Header header = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
if (header != null) {
@@ -136,29 +387,29 @@ public abstract class AbstractHTTPSender {
Object charSetEnc = null;
for (int i = 0; i < headers.length; i++) {
- NameValuePair charsetEnc = headers[i].getParameterByName(
- HTTPConstants.CHAR_SET_ENCODING);
+ NameValuePair charsetEnc = headers[i]
+ .getParameterByName(HTTPConstants.CHAR_SET_ENCODING);
if (charsetEnc != null) {
charSetEnc = charsetEnc.getValue();
}
}
if (inMessageContext != null) {
- inMessageContext
- .setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
- inMessageContext
- .setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
+ inMessageContext.setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
+ inMessageContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING,
+ charSetEnc);
} else {
- // Transport details will be stored in a HashMap so that anybody interested can
+ // Transport details will be stored in a HashMap so that anybody
+ // interested can
// retrieve them
HashMap transportInfoMap = new HashMap();
transportInfoMap.put(Constants.Configuration.CONTENT_TYPE, contentType);
transportInfoMap.put(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc);
- //the HashMap is stored in the outgoing message.
- msgContext.setProperty(Constants.Configuration.TRANSPORT_INFO_MAP,
- transportInfoMap);
+ // the HashMap is stored in the outgoing message.
+ msgContext
+ .setProperty(Constants.Configuration.TRANSPORT_INFO_MAP, transportInfoMap);
}
}
@@ -170,8 +421,8 @@ public abstract class AbstractHTTPSender {
HeaderElement[] elements = cookieHeaders[i].getElements();
for (int e = 0; e < elements.length; e++) {
HeaderElement element = elements[e];
- if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
- Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
+ if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName())
+ || Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
sessionCookie = processCookieHeader(element);
}
if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
@@ -185,11 +436,11 @@ public abstract class AbstractHTTPSender {
HeaderElement[] elements = cookieHeaders[i].getElements();
for (int e = 0; e < elements.length; e++) {
HeaderElement element = elements[e];
- if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName()) ||
- Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
+ if (Constants.SESSION_COOKIE.equalsIgnoreCase(element.getName())
+ || Constants.SESSION_COOKIE_JSESSIONID.equalsIgnoreCase(element.getName())) {
sessionCookie = processCookieHeader(element);
}
- if(customCoookiId!=null&&customCoookiId.equalsIgnoreCase(element.getName())){
+ if (customCoookiId != null && customCoookiId.equalsIgnoreCase(element.getName())) {
sessionCookie = processCookieHeader(element);
}
}
@@ -202,7 +453,7 @@ public abstract class AbstractHTTPSender {
private String processCookieHeader(HeaderElement element) {
String cookie = element.getName() + "=" + element.getValue();
- NameValuePair[] parameters = element.getParameters();
+ NameValuePair[] parameters = element.getParameters();
for (int j = 0; parameters != null && j < parameters.length; j++) {
NameValuePair parameter = parameters[j];
cookie = cookie + "; " + parameter.getName() + "=" + parameter.getValue();
@@ -210,8 +461,7 @@ public abstract class AbstractHTTPSender {
return cookie;
}
- protected void processResponse(HttpMethodBase httpMethod,
- MessageContext msgContext)
+ protected void processResponse(HttpMethodBase httpMethod, MessageContext msgContext)
throws IOException {
obtainHTTPHeaderInformation(httpMethod, msgContext);
@@ -219,13 +469,13 @@ public abstract class AbstractHTTPSender {
if (in == null) {
throw new AxisFault(Messages.getMessage("canNotBeNull", "InputStream"));
}
- Header contentEncoding =
- httpMethod.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
+ Header contentEncoding = httpMethod
+ .getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
if (contentEncoding != null) {
- if (contentEncoding.getValue().
- equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
+ if (contentEncoding.getValue().equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
in = new GZIPInputStream(in);
- // If the content-encoding is identity we can basically ignore it.
+ // If the content-encoding is identity we can basically ignore
+ // it.
} else if (!"identity".equalsIgnoreCase(contentEncoding.getValue())) {
throw new AxisFault("HTTP :" + "unsupported content-encoding of '"
+ contentEncoding.getValue() + "' found");
@@ -238,44 +488,48 @@ public abstract class AbstractHTTPSender {
}
}
- public abstract void send(MessageContext msgContext, URL url, String soapActionString)
- throws IOException;
-
/**
- * getting host configuration to support standard http/s, proxy and NTLM support
- *
- * @param client active HttpClient
- * @param msgCtx active MessageContext
- * @param targetURL the target URL
+ * getting host configuration to support standard http/s, proxy and NTLM
+ * support
+ *
+ * @param client
+ * active HttpClient
+ * @param msgCtx
+ * active MessageContext
+ * @param targetURL
+ * the target URL
* @return a HostConfiguration set up with proxy information
- * @throws AxisFault if problems occur
+ * @throws AxisFault
+ * if problems occur
*/
- protected HostConfiguration getHostConfiguration(HttpClient client,
- MessageContext msgCtx,
- URL targetURL)throws AxisFault {
+ protected HostConfiguration getHostConfiguration(HttpClient client, MessageContext msgCtx,
+ URL targetURL) throws AxisFault {
boolean isAuthenticationEnabled = isAuthenticationEnabled(msgCtx);
int port = targetURL.getPort();
String protocol = targetURL.getProtocol();
if (port == -1) {
- if (PROTOCOL_HTTP.equals(protocol)) {
+ if (HTTPTransportConstants.PROTOCOL_HTTP.equals(protocol)) {
port = 80;
- } else if (PROTOCOL_HTTPS.equals(protocol)) {
+ } else if (HTTPTransportConstants.PROTOCOL_HTTPS.equals(protocol)) {
port = 443;
}
}
- // to see the host is a proxy and in the proxy list - available in axis2.xml
+ // to see the host is a proxy and in the proxy list - available in
+ // axis2.xml
HostConfiguration config = new HostConfiguration();
- // one might need to set his own socket factory. Let's allow that case as well.
- Protocol protocolHandler =
- (Protocol)msgCtx.getOptions().getProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
+ // one might need to set his own socket factory. Let's allow that case
+ // as well.
+ Protocol protocolHandler = (Protocol) msgCtx.getOptions().getProperty(
+ HTTPConstants.CUSTOM_PROTOCOL_HANDLER);
// setting the real host configuration
- // I assume the 90% case, or even 99% case will be no protocol handler case.
+ // I assume the 90% case, or even 99% case will be no protocol handler
+ // case.
if (protocolHandler == null) {
config.setHost(targetURL.getHost(), port, targetURL.getProtocol());
} else {
@@ -288,11 +542,11 @@ public abstract class AbstractHTTPSender {
}
// proxy configuration
- if (HTTPProxyConfigurationUtil.isProxyEnabled(msgCtx, targetURL)) {
- if(log.isDebugEnabled()){
+ if (HTTPProxcyConfigurator.isProxyEnabled(msgCtx, targetURL)) {
+ if (log.isDebugEnabled()) {
log.debug("Configuring HTTP proxy.");
}
- HTTPProxyConfigurationUtil.configure(msgCtx, client, config);
+ HTTPProxcyConfigurator.configure(msgCtx, client, config);
}
return config;
@@ -303,17 +557,17 @@ public abstract class AbstractHTTPSender {
}
/*
- This will handle server Authentication, It could be either NTLM, Digest or Basic Authentication.
- Apart from that user can change the priory or add a custom authentication scheme.
- */
- protected void setAuthenticationInfo(HttpClient agent,
- MessageContext msgCtx,
- HostConfiguration config) throws AxisFault {
- HttpTransportProperties.Authenticator authenticator;
+ * This will handle server Authentication, It could be either NTLM, Digest
+ * or Basic Authentication. Apart from that user can change the priory or
+ * add a custom authentication scheme.
+ */
+ protected void setAuthenticationInfo(HttpClient agent, MessageContext msgCtx,
+ HostConfiguration config) throws AxisFault {
+ HTTPAuthenticator authenticator;
Object obj = msgCtx.getProperty(HTTPConstants.AUTHENTICATE);
if (obj != null) {
- if (obj instanceof HttpTransportProperties.Authenticator) {
- authenticator = (HttpTransportProperties.Authenticator) obj;
+ if (obj instanceof HTTPAuthenticator) {
+ authenticator = (HTTPAuthenticator) obj;
String username = authenticator.getUsername();
String password = authenticator.getPassword();
@@ -329,33 +583,37 @@ public abstract class AbstractHTTPSender {
Credentials creds;
HttpState tmpHttpState = null;
- HttpState httpState = (HttpState)msgCtx.getProperty(HTTPConstants.CACHED_HTTP_STATE);
+ HttpState httpState = (HttpState) msgCtx
+ .getProperty(HTTPConstants.CACHED_HTTP_STATE);
if (httpState != null) {
tmpHttpState = httpState;
} else {
tmpHttpState = agent.getState();
}
-
- agent.getParams()
- .setAuthenticationPreemptive(authenticator.getPreemptiveAuthentication());
+
+ agent.getParams().setAuthenticationPreemptive(
+ authenticator.getPreemptiveAuthentication());
if (host != null) {
if (domain != null) {
- /*Credentials for NTLM Authentication*/
+ /* Credentials for NTLM Authentication */
creds = new NTCredentials(username, password, host, domain);
} else {
- /*Credentials for Digest and Basic Authentication*/
+ /* Credentials for Digest and Basic Authentication */
creds = new UsernamePasswordCredentials(username, password);
}
tmpHttpState.setCredentials(new AuthScope(host, port, realm), creds);
} else {
if (domain != null) {
- /*Credentials for NTLM Authentication when host is ANY_HOST*/
+ /*
+ * Credentials for NTLM Authentication when host is
+ * ANY_HOST
+ */
creds = new NTCredentials(username, password, AuthScope.ANY_HOST, domain);
- tmpHttpState.setCredentials(
- new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
+ tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY_HOST, port, realm),
+ creds);
} else {
- /*Credentials only for Digest and Basic Authentication*/
+ /* Credentials only for Digest and Basic Authentication */
creds = new UsernamePasswordCredentials(username, password);
tmpHttpState.setCredentials(new AuthScope(AuthScope.ANY), creds);
}
@@ -370,16 +628,10 @@ public abstract class AbstractHTTPSender {
continue;
}
String scheme = (String) schemes.get(i);
- if (HttpTransportProperties.Authenticator.BASIC.equals(scheme)) {
- authPrefs.add(AuthPolicy.BASIC);
- } else if (HttpTransportProperties.Authenticator.NTLM.equals(scheme)) {
- authPrefs.add(AuthPolicy.NTLM);
- } else if (HttpTransportProperties.Authenticator.DIGEST.equals(scheme)) {
- authPrefs.add(AuthPolicy.DIGEST);
- }
+ authPrefs.add(authenticator.getAuthPolicyPref(scheme));
+
}
- agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY,
- authPrefs);
+ agent.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
}
} else {
@@ -391,27 +643,31 @@ public abstract class AbstractHTTPSender {
/**
* Method used to copy all the common properties
- *
- * @param msgContext - The messageContext of the request message
- * @param url - The target URL
- * @param httpMethod - The http method used to send the request
- * @param httpClient - The httpclient used to send the request
- * @param soapActionString - The soap action atring of the request message
- * @return MessageFormatter - The messageFormatter for the relavent request message
- * @throws AxisFault - Thrown in case an exception occurs
+ *
+ * @param msgContext
+ * - The messageContext of the request message
+ * @param url
+ * - The target URL
+ * @param httpMethod
+ * - The http method used to send the request
+ * @param httpClient
+ * - The httpclient used to send the request
+ * @param soapActionString
+ * - The soap action atring of the request message
+ * @return MessageFormatter - The messageFormatter for the relavent request
+ * message
+ * @throws AxisFault
+ * - Thrown in case an exception occurs
*/
protected MessageFormatter populateCommonProperties(MessageContext msgContext, URL url,
- HttpMethodBase httpMethod,
- HttpClient httpClient,
- String soapActionString)
+ HttpMethodBase httpMethod, HttpClient httpClient, String soapActionString)
throws AxisFault {
if (isAuthenticationEnabled(msgContext)) {
httpMethod.setDoAuthentication(true);
}
- MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(
- msgContext);
+ MessageFormatter messageFormatter = TransportUtils.getMessageFormatter(msgContext);
url = messageFormatter.getTargetAddress(msgContext, format, url);
@@ -420,8 +676,7 @@ public abstract class AbstractHTTPSender {
httpMethod.setQueryString(url.getQuery());
httpMethod.setRequestHeader(HTTPConstants.HEADER_CONTENT_TYPE,
- messageFormatter.getContentType(msgContext, format,
- soapActionString));
+ messageFormatter.getContentType(msgContext, format, soapActionString));
httpMethod.setRequestHeader(HTTPConstants.HEADER_HOST, url.getHost());
@@ -443,31 +698,32 @@ public abstract class AbstractHTTPSender {
}
/**
- * This is used to get the dynamically set time out values from the
- * message context. If the values are not available or invalid then
- * the default values or the values set by the configuration will be used
- *
- * @param msgContext the active MessageContext
+ * This is used to get the dynamically set time out values from the message
+ * context. If the values are not available or invalid then the default
+ * values or the values set by the configuration will be used
+ *
+ * @param msgContext
+ * the active MessageContext
* @param httpClient
*/
protected void initializeTimeouts(MessageContext msgContext, HttpClient httpClient) {
// If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
// override the static config
- Integer tempSoTimeoutProperty =
- (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
- Integer tempConnTimeoutProperty =
- (Integer) msgContext
- .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
+ Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
+ Integer tempConnTimeoutProperty = (Integer) msgContext
+ .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
if (tempConnTimeoutProperty != null) {
int connectionTimeout = tempConnTimeoutProperty.intValue();
// timeout for initial connection
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connectionTimeout);
+ httpClient.getHttpConnectionManager().getParams()
+ .setConnectionTimeout(connectionTimeout);
} else {
// set timeout in client
if (timeout > 0) {
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout((int) timeout);
+ httpClient.getHttpConnectionManager().getParams()
+ .setConnectionTimeout((int) timeout);
}
}
@@ -486,27 +742,26 @@ public abstract class AbstractHTTPSender {
}
/**
- * This is used to get the dynamically set time out values from the
- * message context. If the values are not available or invalid then
- * the default values or the values set by the configuration will be used
- *
- * @param msgContext the active MessageContext
- * @param httpMethod method
+ * This is used to get the dynamically set time out values from the message
+ * context. If the values are not available or invalid then the default
+ * values or the values set by the configuration will be used
+ *
+ * @param msgContext
+ * the active MessageContext
+ * @param httpMethod
+ * method
*/
protected void setTimeouts(MessageContext msgContext, HttpMethod httpMethod) {
// If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the
// override the static config
- Integer tempSoTimeoutProperty =
- (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
- Integer tempConnTimeoutProperty =
- (Integer) msgContext
- .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
+ Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT);
+ Integer tempConnTimeoutProperty = (Integer) msgContext
+ .getProperty(HTTPConstants.CONNECTION_TIMEOUT);
long timeout = msgContext.getOptions().getTimeOutInMilliSeconds();
if (tempConnTimeoutProperty != null) {
// timeout for initial connection
- httpMethod.getParams().setParameter("http.connection.timeout",
- tempConnTimeoutProperty);
+ httpMethod.getParams().setParameter("http.connection.timeout", tempConnTimeoutProperty);
}
if (tempSoTimeoutProperty != null) {
@@ -520,15 +775,11 @@ public abstract class AbstractHTTPSender {
}
}
- public void setFormat(OMOutputFormat format) {
- this.format = format;
- }
-
protected HttpClient getHttpClient(MessageContext msgContext) {
ConfigurationContext configContext = msgContext.getConfigurationContext();
- HttpClient httpClient = (HttpClient) msgContext.getProperty(
- HTTPConstants.CACHED_HTTP_CLIENT);
+ HttpClient httpClient = (HttpClient) msgContext
+ .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
if (httpClient == null) {
httpClient = (HttpClient) configContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
@@ -542,27 +793,25 @@ public abstract class AbstractHTTPSender {
httpClient = (HttpClient) msgContext.getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
if (httpClient == null) {
- httpClient = (HttpClient) configContext.getProperty(
- HTTPConstants.CACHED_HTTP_CLIENT);
+ httpClient = (HttpClient) configContext
+ .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
}
if (httpClient != null) {
return httpClient;
}
- HttpConnectionManager connManager =
- (HttpConnectionManager) msgContext.getProperty(
- HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+ HttpConnectionManager connManager = (HttpConnectionManager) msgContext
+ .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
if (connManager == null) {
- connManager =
- (HttpConnectionManager) msgContext.getProperty(
- HTTPConstants.MUTTITHREAD_HTTP_CONNECTION_MANAGER);
+ connManager = (HttpConnectionManager) msgContext
+ .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
}
if (connManager == null) {
// reuse HttpConnectionManager
synchronized (configContext) {
- connManager = (HttpConnectionManager) configContext.getProperty(
- HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
+ connManager = (HttpConnectionManager) configContext
+ .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER);
if (connManager == null) {
log.trace("Making new ConnectionManager");
connManager = new MultiThreadedHttpConnectionManager();
@@ -572,12 +821,13 @@ public abstract class AbstractHTTPSender {
}
}
/*
- * Create a new instance of HttpClient since the way
- * it is used here it's not fully thread-safe.
+ * Create a new instance of HttpClient since the way it is used here
+ * it's not fully thread-safe.
*/
httpClient = new HttpClient(connManager);
- // Set the default timeout in case we have a connection pool starvation to 30sec
+ // Set the default timeout in case we have a connection pool
+ // starvation to 30sec
httpClient.getParams().setConnectionManagerTimeout(30000);
// Get the timeout values set in the runtime
@@ -588,7 +838,7 @@ public abstract class AbstractHTTPSender {
}
protected void executeMethod(HttpClient httpClient, MessageContext msgContext, URL url,
- HttpMethod method) throws IOException {
+ HttpMethod method) throws IOException {
HostConfiguration config = this.getHostConfiguration(httpClient, msgContext, url);
// set the custom headers, if available
@@ -604,18 +854,18 @@ public abstract class AbstractHTTPSender {
method.addRequestHeader(HTTPConstants.HEADER_CONTENT_ENCODING,
HTTPConstants.COMPRESSION_GZIP);
}
-
+
if (msgContext.getProperty(HTTPConstants.HTTP_METHOD_PARAMS) != null) {
- HttpMethodParams params = (HttpMethodParams)msgContext
+ HttpMethodParams params = (HttpMethodParams) msgContext
.getProperty(HTTPConstants.HTTP_METHOD_PARAMS);
method.setParams(params);
}
String cookiePolicy = (String) msgContext.getProperty(HTTPConstants.COOKIE_POLICY);
if (cookiePolicy != null) {
- method.getParams().setCookiePolicy(cookiePolicy);
+ method.getParams().setCookiePolicy(cookiePolicy);
}
- HttpState httpState = (HttpState)msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
+ HttpState httpState = (HttpState) msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE);
setTimeouts(msgContext, method);
@@ -640,12 +890,12 @@ public abstract class AbstractHTTPSender {
method.addRequestHeader(header);
}
}
-
+
}
if (httpHeadersObj instanceof Map) {
Map httpHeaders = (Map) httpHeadersObj;
for (Iterator iterator = httpHeaders.entrySet().iterator(); iterator.hasNext();) {
- Map.Entry entry = (Map.Entry) iterator.next();
+ Map.Entry entry = (Map.Entry) iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
if (HTTPConstants.HEADER_USER_AGENT.equals(key)) {
@@ -669,8 +919,8 @@ public abstract class AbstractHTTPSender {
boolean headerAdded = false;
for (Header header : headers) {
- if (header.getName() != null &&
- header.getName().equals(((Map.Entry) headerEntry).getKey())) {
+ if (header.getName() != null
+ && header.getName().equals(((Map.Entry) headerEntry).getKey())) {
headerAdded = true;
break;
}
@@ -691,13 +941,15 @@ public abstract class AbstractHTTPSender {
}
-
/**
- * Remove unwanted headers from the transport headers map of outgoing request. These are headers which
- * should be dictated by the transport and not the user. We remove these as these may get
- * copied from the request messages
- *
- * @param msgContext the Axis2 Message context from which these headers should be removed
+ * Remove unwanted headers from the transport headers map of outgoing
+ * request. These are headers which should be dictated by the transport and
+ * not the user. We remove these as these may get copied from the request
+ * messages
+ *
+ * @param msgContext
+ * the Axis2 Message context from which these headers should be
+ * removed
*/
private void removeUnwantedHeaders(MessageContext msgContext) {
Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
@@ -709,11 +961,11 @@ public abstract class AbstractHTTPSender {
Iterator iter = headers.keySet().iterator();
while (iter.hasNext()) {
String headerName = (String) iter.next();
- if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName) ||
- HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName) ||
- HTTP.DATE_HEADER.equalsIgnoreCase(headerName) ||
- HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName) ||
- HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
+ if (HTTP.CONN_DIRECTIVE.equalsIgnoreCase(headerName)
+ || HTTP.TRANSFER_ENCODING.equalsIgnoreCase(headerName)
+ || HTTP.DATE_HEADER.equalsIgnoreCase(headerName)
+ || HTTP.CONTENT_TYPE.equalsIgnoreCase(headerName)
+ || HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) {
iter.remove();
}
}
@@ -723,8 +975,8 @@ public abstract class AbstractHTTPSender {
String userAgentString = "Axis2";
boolean locked = false;
if (messageContext.getParameter(HTTPConstants.USER_AGENT) != null) {
- OMElement userAgentElement =
- messageContext.getParameter(HTTPConstants.USER_AGENT).getParameterElement();
+ OMElement userAgentElement = messageContext.getParameter(HTTPConstants.USER_AGENT)
+ .getParameterElement();
userAgentString = userAgentElement.getText().trim();
OMAttribute lockedAttribute = userAgentElement.getAttribute(new QName("locked"));
if (lockedAttribute != null) {
@@ -742,5 +994,5 @@ public abstract class AbstractHTTPSender {
return userAgentString;
}
-
+
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
similarity index 50%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
index 81a3c6e..6f6deac 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HTTPTransportHeaders.java
@@ -17,35 +17,27 @@
* under the License.
*/
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
-import org.apache.commons.httpclient.methods.RequestEntity;
+import java.util.HashMap;
-import java.io.IOException;
-import java.io.OutputStream;
+import org.apache.axis2.transport.http.CommonsTransportHeaders;
+import org.apache.commons.httpclient.Header;
-public class RESTRequestEntity2 implements RequestEntity {
- private String contentType;
- private String postRequestBody;
+public class HTTPTransportHeaders extends CommonsTransportHeaders {
- public RESTRequestEntity2(String postRequestBody, String contentType) {
- this.postRequestBody = postRequestBody;
- this.contentType = contentType;
- }
+ private Header[] headers;
- public void writeRequest(OutputStream output) throws IOException {
- output.write(postRequestBody.getBytes());
- }
+ public HTTPTransportHeaders(Header[] headers) {
+ this.headers = headers;
- public long getContentLength() {
- return this.postRequestBody.getBytes().length;
}
- public String getContentType() {
- return this.contentType;
+ protected void init() {
+ setHeaderMap(new HashMap());
+ for (int i = 0; i < headers.length; i++) {
+ getHeaderMap().put(headers[i].getName(), headers[i].getValue());
+ }
}
- public boolean isRepeatable() {
- return true;
- }
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java
new file mode 100644
index 0000000..502611e
--- /dev/null
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/HttpTransportPropertiesImpl.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF 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.axis2.transport.http.impl.httpclient3;
+
+import org.apache.axis2.transport.http.HTTPAuthenticator;
+import org.apache.axis2.transport.http.HttpTransportProperties;
+import org.apache.commons.httpclient.HttpVersion;
+import org.apache.commons.httpclient.auth.AuthPolicy;
+import org.apache.commons.httpclient.auth.AuthScope;
+
+public class HttpTransportPropertiesImpl extends HttpTransportProperties {
+
+ protected HttpVersion httpVersion;
+
+ @Override
+ public void setHttpVersion(Object httpVerion) {
+ this.httpVersion = (HttpVersion) httpVerion;
+ }
+
+ @Override
+ public Object getHttpVersion() {
+ return this.httpVersion;
+ }
+
+ /*
+ * This class is responsible for holding all the necessary information
+ * needed for NTML, Digest and Basic Authentication. Authentication itself
+ * is handled by httpclient. User doesn't need to warry about what
+ * authentication mechanism it uses. Axis2 uses httpclinet's default
+ * authentication patterns.
+ */
+ public static class Authenticator extends HTTPAuthenticator {
+
+ /* port of the host that needed to be authenticated with */
+ private int port = AuthScope.ANY_PORT;
+ /* Realm for authentication scope */
+ private String realm = AuthScope.ANY_REALM;
+ /* Default Auth Schems */
+ public static final String NTLM = AuthPolicy.NTLM;
+ public static final String DIGEST = AuthPolicy.DIGEST;
+ public static final String BASIC = AuthPolicy.BASIC;
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getRealm() {
+ return realm;
+ }
+
+ public void setRealm(String realm) {
+ this.realm = realm;
+ }
+
+ @Override
+ public Object getAuthPolicyPref(String scheme) {
+ if (BASIC.equals(scheme)) {
+ return AuthPolicy.BASIC;
+ } else if (NTLM.equals(scheme)) {
+ return AuthPolicy.NTLM;
+ } else if (DIGEST.equals(scheme)) {
+ return AuthPolicy.DIGEST;
+ }
+ return null;
+ }
+
+ }
+
+}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
similarity index 56%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
index 81a3c6e..2ccf3c8 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntity2Impl.java
@@ -17,35 +17,19 @@
* under the License.
*/
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
+import org.apache.axis2.transport.http.RESTRequestEntity2;
import org.apache.commons.httpclient.methods.RequestEntity;
-import java.io.IOException;
-import java.io.OutputStream;
+public class RESTRequestEntity2Impl extends RESTRequestEntity2 implements RequestEntity {
-public class RESTRequestEntity2 implements RequestEntity {
- private String contentType;
- private String postRequestBody;
-
- public RESTRequestEntity2(String postRequestBody, String contentType) {
- this.postRequestBody = postRequestBody;
- this.contentType = contentType;
- }
-
- public void writeRequest(OutputStream output) throws IOException {
- output.write(postRequestBody.getBytes());
- }
-
- public long getContentLength() {
- return this.postRequestBody.getBytes().length;
+ public RESTRequestEntity2Impl(String postRequestBody, String contentType) {
+ super(postRequestBody, contentType);
}
public String getContentType() {
- return this.contentType;
+ return getContentTypeAsString();
}
- public boolean isRepeatable() {
- return true;
- }
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
similarity index 56%
copy from modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
copy to modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
index 81a3c6e..387729a 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/RESTRequestEntity2.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient3/RESTRequestEntityImpl.java
@@ -17,35 +17,23 @@
* under the License.
*/
-package org.apache.axis2.transport.http;
+package org.apache.axis2.transport.http.impl.httpclient3;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMOutputFormat;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.transport.http.RESTRequestEntity;
import org.apache.commons.httpclient.methods.RequestEntity;
-import java.io.IOException;
-import java.io.OutputStream;
+public class RESTRequestEntityImpl extends RESTRequestEntity implements RequestEntity {
-public class RESTRequestEntity2 implements RequestEntity {
- private String contentType;
- private String postRequestBody;
-
- public RESTRequestEntity2(String postRequestBody, String contentType) {
- this.postRequestBody = postRequestBody;
- this.contentType = contentType;
- }
-
- public void writeRequest(OutputStream output) throws IOException {
- output.write(postRequestBody.getBytes());
- }
-
- public long getContentLength() {
- return this.postRequestBody.getBytes().length;
+ public RESTRequestEntityImpl(OMElement element, boolean chunked, MessageContext msgCtxt,
+ String charSetEncoding, String soapActionString, OMOutputFormat format) {
+ super(element, chunked, msgCtxt, charSetEncoding, soapActionString, format);
}
public String getContentType() {
- return this.contentType;
+ return getContentTypeAsString();
}
- public boolean isRepeatable() {
- return true;
- }
}
diff --git a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java b/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
index a163450..dcd7b90 100644
--- a/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
+++ b/modules/transport/http/src/org/apache/axis2/transport/http/util/HTTPProxyConfigurationUtil.java
@@ -42,6 +42,7 @@ import java.util.StringTokenizer;
/**
* Contains utility functions used when configuring HTTP Proxy for HTTP Sender.
*/
+@Deprecated
public class HTTPProxyConfigurationUtil {
private static Log log = LogFactory.getLog(HTTPProxyConfigurationUtil.class);