You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by ve...@apache.org on 2008/11/03 22:07:21 UTC
svn commit: r710158 [3/20] - in
/webservices/commons/trunk/modules/transport: ./ modules/base/
modules/base/src/main/java/org/apache/axis2/format/
modules/base/src/main/java/org/apache/axis2/transport/base/
modules/base/src/main/java/org/apache/axis2/t...
Modified: webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java?rev=710158&r1=710157&r2=710158&view=diff
==============================================================================
--- webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java (original)
+++ webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java Mon Nov 3 13:07:13 2008
@@ -1,616 +1,616 @@
-/*
- * 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 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.MessageContext;
-import org.apache.axis2.context.OperationContext;
-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.util.JavaUtils;
-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.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 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.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";
-
- /**
- * proxydiscription
- */
- protected TransportOutDescription proxyOutSetting = null;
- protected OMOutputFormat format = new OMOutputFormat();
-
- /**
- * isAllowedRetry will be using to check where the
- * retry should be allowed or not.
- */
- protected boolean isAllowedRetry = false;
-
- public void setChunked(boolean chunked) {
- this.chunked = chunked;
- }
-
- 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");
- }
- }
- }
-
- /**
- * 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 (ProxyConfiguration.isProxyEnabled(msgCtx,targetURL)) {
- log.debug("ProxyConfiguration");
- ProxyConfiguration proxyConfiguration = new ProxyConfiguration();
- proxyConfiguration.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;
-
- 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);
- }
- agent.getState().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);
- agent.getState().setCredentials(
- new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
- } else {
- /*Credentials only for Digest and Basic Authentication*/
- creds = new UsernamePasswordCredentials(username, password);
- agent.getState().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);
- }
- }
- }
-
- public void setFormat(OMOutputFormat format) {
- this.format = format;
- }
-
- protected HttpClient getHttpClient(MessageContext msgContext) {
- HttpClient httpClient;
- Object reuse = msgContext.getOptions().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
- if (reuse == null) {
- reuse = msgContext.getConfigurationContext().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
- }
- if (reuse != null && JavaUtils.isTrueExplicitly(reuse)) {
- httpClient = (HttpClient) msgContext.getOptions().getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
- if (httpClient == null) {
- httpClient = (HttpClient) msgContext.getConfigurationContext()
- .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
- }
- if (httpClient != null)
- return httpClient;
- MultiThreadedHttpConnectionManager connectionManager =
- new MultiThreadedHttpConnectionManager();
- httpClient = new HttpClient(connectionManager);
- msgContext.getConfigurationContext()
- .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
- } else {
- 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){
- httpClient = new HttpClient(connManager);
- } else {
- //Multi threaded http connection manager has set as the default
- connManager = new MultiThreadedHttpConnectionManager();
- httpClient = new HttpClient(connManager);
- }
- }
-
- // 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);
-
- msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
-
- // 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);
- }
- httpClient.executeMethod(config, method);
- }
-
- 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 ArrayList) {
- ArrayList httpHeaders = (ArrayList) httpHeadersObj;
- Header header;
- for (int i = 0; i < httpHeaders.size(); i++) {
- header = (Header) httpHeaders.get(i);
- 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);
- }
- }
- }
-
- if (!isCustomUserAgentSet) {
- String userAgentString = getUserAgent(msgContext);
- method.setRequestHeader(HTTPConstants.HEADER_USER_AGENT, userAgentString);
- }
-
- }
-
- 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;
- }
-
-}
+/*
+ * 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 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.MessageContext;
+import org.apache.axis2.context.OperationContext;
+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.util.JavaUtils;
+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.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 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.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";
+
+ /**
+ * proxydiscription
+ */
+ protected TransportOutDescription proxyOutSetting = null;
+ protected OMOutputFormat format = new OMOutputFormat();
+
+ /**
+ * isAllowedRetry will be using to check where the
+ * retry should be allowed or not.
+ */
+ protected boolean isAllowedRetry = false;
+
+ public void setChunked(boolean chunked) {
+ this.chunked = chunked;
+ }
+
+ 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");
+ }
+ }
+ }
+
+ /**
+ * 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 (ProxyConfiguration.isProxyEnabled(msgCtx,targetURL)) {
+ log.debug("ProxyConfiguration");
+ ProxyConfiguration proxyConfiguration = new ProxyConfiguration();
+ proxyConfiguration.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;
+
+ 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);
+ }
+ agent.getState().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);
+ agent.getState().setCredentials(
+ new AuthScope(AuthScope.ANY_HOST, port, realm), creds);
+ } else {
+ /*Credentials only for Digest and Basic Authentication*/
+ creds = new UsernamePasswordCredentials(username, password);
+ agent.getState().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);
+ }
+ }
+ }
+
+ public void setFormat(OMOutputFormat format) {
+ this.format = format;
+ }
+
+ protected HttpClient getHttpClient(MessageContext msgContext) {
+ HttpClient httpClient;
+ Object reuse = msgContext.getOptions().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
+ if (reuse == null) {
+ reuse = msgContext.getConfigurationContext().getProperty(HTTPConstants.REUSE_HTTP_CLIENT);
+ }
+ if (reuse != null && JavaUtils.isTrueExplicitly(reuse)) {
+ httpClient = (HttpClient) msgContext.getOptions().getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
+ if (httpClient == null) {
+ httpClient = (HttpClient) msgContext.getConfigurationContext()
+ .getProperty(HTTPConstants.CACHED_HTTP_CLIENT);
+ }
+ if (httpClient != null)
+ return httpClient;
+ MultiThreadedHttpConnectionManager connectionManager =
+ new MultiThreadedHttpConnectionManager();
+ httpClient = new HttpClient(connectionManager);
+ msgContext.getConfigurationContext()
+ .setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
+ } else {
+ 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){
+ httpClient = new HttpClient(connManager);
+ } else {
+ //Multi threaded http connection manager has set as the default
+ connManager = new MultiThreadedHttpConnectionManager();
+ httpClient = new HttpClient(connManager);
+ }
+ }
+
+ // 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);
+
+ msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
+
+ // 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);
+ }
+ httpClient.executeMethod(config, method);
+ }
+
+ 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 ArrayList) {
+ ArrayList httpHeaders = (ArrayList) httpHeadersObj;
+ Header header;
+ for (int i = 0; i < httpHeaders.size(); i++) {
+ header = (Header) httpHeaders.get(i);
+ 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);
+ }
+ }
+ }
+
+ if (!isCustomUserAgentSet) {
+ String userAgentString = getUserAgent(msgContext);
+ method.setRequestHeader(HTTPConstants.HEADER_USER_AGENT, userAgentString);
+ }
+
+ }
+
+ 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;
+ }
+
+}
Propchange: webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
------------------------------------------------------------------------------
svn:eol-style = native