You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2012/11/25 20:36:18 UTC
svn commit: r1413394 - in /manifoldcf/branches/CONNECTORS-120/connectors:
meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/
meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/...
Author: kwright
Date: Sun Nov 25 19:36:15 2012
New Revision: 1413394
URL: http://svn.apache.org/viewvc?rev=1413394&view=rev
Log:
Convert meridio connector to httpcomponents.
Removed:
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/ConnectionConfig.java
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioSecureSocketFactory.java
Modified:
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/CommonsHTTPSender.java
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioAuthority.java
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java
manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/MeridioWrapper.java
manifoldcf/branches/CONNECTORS-120/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/CommonsHTTPSender.java
Modified: manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/CommonsHTTPSender.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/CommonsHTTPSender.java?rev=1413394&r1=1413393&r2=1413394&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/CommonsHTTPSender.java (original)
+++ manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/CommonsHTTPSender.java Sun Nov 25 19:36:15 2012
@@ -17,6 +17,8 @@
*/
package org.apache.manifoldcf.crawler.connectors.meridio;
+import org.apache.manifoldcf.core.common.XThreadInputStream;
+
import org.apache.axis.AxisFault;
import org.apache.axis.Constants;
import org.apache.axis.Message;
@@ -33,26 +35,26 @@ import org.apache.axis.soap.SOAPConstant
import org.apache.axis.utils.JavaUtils;
import org.apache.axis.utils.Messages;
import org.apache.axis.utils.NetworkUtils;
-import org.apache.commons.httpclient.Cookie;
-import org.apache.commons.httpclient.Credentials;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HostConfiguration;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
-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.UsernamePasswordCredentials;
-import org.apache.commons.httpclient.auth.AuthScope;
-import org.apache.commons.httpclient.cookie.CookiePolicy;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.RequestEntity;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolFactory;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.Header;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.ProtocolVersion;
+import org.apache.http.util.EntityUtils;
+import org.apache.http.message.BasicHeader;
+
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.client.RedirectException;
+import org.apache.http.client.CircularRedirectException;
+import org.apache.http.NoHttpResponseException;
+import org.apache.http.HttpException;
+
import org.apache.commons.logging.Log;
import javax.xml.soap.MimeHeader;
@@ -60,116 +62,42 @@ import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPException;
import java.io.ByteArrayOutputStream;
import java.io.FilterInputStream;
+import java.io.InterruptedIOException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.Reader;
+import java.io.InputStreamReader;
+import java.io.Writer;
+import java.io.StringWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileInputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.HashMap;
import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-import org.apache.manifoldcf.crawler.connectors.meridio.meridiowrapper.MeridioWrapper;
-import org.apache.manifoldcf.crawler.connectors.meridio.ConnectionConfig;
-
-/**
-* This class uses Jakarta Commons's HttpClient to call a SOAP server.
-*
-* @author Davanum Srinivas (dims@yahoo.com)
-* History: By Chandra Talluri
-* Modifications done for maintaining sessions. Cookies needed to be set on
-* HttpState not on MessageContext, since ttpMethodBase overwrites the cookies
-* from HttpState. Also we need to setCookiePolicy on HttpState to
-* CookiePolicy.COMPATIBILITY else it is defaulting to RFC2109Spec and adding
-* Version information to it and tomcat server not recognizing it
+import java.util.List;
+
+/* Class to use httpcomponents to communicate with a SOAP server.
+* I've replaced the original rather complicated class with a much simpler one that
+* relies on having an HttpClient object passed into the invoke() method. Since
+* the object is already set up, not much needs to be done in here.
*/
+
public class CommonsHTTPSender extends BasicHandler {
/** Field log */
protected static Log log =
LogFactory.getLog(CommonsHTTPSender.class.getName());
- /** Connection pool, and initialization lock */
- protected static HttpConnectionManager connectionManager = null;
- protected static Object lockObject = new Object();
-
+ /** Properties */
protected CommonsHTTPClientProperties clientProperties;
- boolean httpChunkStream = true; //Use HTTP chunking or not.
public CommonsHTTPSender() {
- initialize();
- }
-
- protected void initialize() {
this.clientProperties = CommonsHTTPClientPropertiesFactory.create();
- synchronized (lockObject)
- {
- if (connectionManager == null)
- {
- MultiThreadedHttpConnectionManager cm = new MultiThreadedHttpConnectionManager();
- // I don't know where CommonsHTTPClientPropertiesFactory.create() gets its parameters, but it was too small
- // by default. Since we control
- // the pool sizes at a higher level, these should be pretty much wide open at this level
- //cm.getParams().setDefaultMaxConnectionsPerHost(clientProperties.getMaximumConnectionsPerHost());
- //cm.getParams().setMaxTotalConnections(clientProperties.getMaximumTotalConnections());
- cm.getParams().setDefaultMaxConnectionsPerHost(1000);
- cm.getParams().setMaxTotalConnections(1000);
-
- // If defined, set the default timeouts
- // Can be overridden by the MessageContext
- if(this.clientProperties.getDefaultConnectionTimeout()>0) {
- cm.getParams().setConnectionTimeout(this.clientProperties.getDefaultConnectionTimeout());
- }
- if(this.clientProperties.getDefaultSoTimeout()>0) {
- cm.getParams().setSoTimeout(this.clientProperties.getDefaultSoTimeout());
- }
- connectionManager = cm;
- }
- }
- }
-
- protected static class ExecuteMethodThread extends Thread
- {
- protected HttpClient client;
- protected HostConfiguration hostConfiguration;
- protected HttpMethodBase executeMethod;
- protected Throwable exception = null;
- protected int rval = 0;
-
- public ExecuteMethodThread(HttpClient client, HostConfiguration hostConfiguration, HttpMethodBase executeMethod)
- {
- super();
- setDaemon(true);
- this.client = client;
- this.hostConfiguration = hostConfiguration;
- this.executeMethod = executeMethod;
- }
-
- public void run()
- {
- try
- {
- // Call the execute method appropriately
- rval = client.executeMethod(hostConfiguration,executeMethod,null);
- }
- catch (Throwable e)
- {
- this.exception = e;
- }
- }
-
- public Throwable getException()
- {
- return exception;
- }
-
- public int getResponse()
- {
- return rval;
- }
}
/**
@@ -181,40 +109,23 @@ public class CommonsHTTPSender extends B
* @throws AxisFault
*/
public void invoke(MessageContext msgContext) throws AxisFault {
- HttpMethodBase method = null;
- if (log.isDebugEnabled()) {
+ if (log.isDebugEnabled())
+ {
log.debug(Messages.getMessage("enter00",
"CommonsHTTPSender::invoke"));
}
- try {
+
+ // Catch all exceptions and turn them into AxisFaults
+ try
+ {
+ // Get the URL
URL targetURL =
new URL(msgContext.getStrProp(MessageContext.TRANS_URL));
- ConnectionConfig configInfo = (ConnectionConfig)msgContext.getProperty(MeridioWrapper.CONFIGURATION_PROPERTY);
- HttpConnectionManager localConnectionManager = configInfo.getConnectionManager();
- if (localConnectionManager == null)
- localConnectionManager = connectionManager;
-
- // no need to retain these, as the cookies/credentials are
- // stored in the message context across multiple requests.
- // the underlying connection manager, however, is retained
- // so sockets get recycled when possible.
- HttpClient httpClient = new HttpClient(localConnectionManager);
- // the timeout value for allocation of connections from the pool
- httpClient.getParams().setConnectionManagerTimeout(this.clientProperties.getConnectionPoolTimeout());
- // Set our protocol factory, in case there's a redirect
- ProtocolFactory myFactory = configInfo.getProtocolFactory();
- if (myFactory != null)
- httpClient.getParams().setParameter(org.apache.commons.httpclient.params.HttpClientParams.PROTOCOL_FACTORY,myFactory);
- // Allow circular redirections
- httpClient.getParams().setParameter(org.apache.commons.httpclient.params.HttpClientParams.ALLOW_CIRCULAR_REDIRECTS,new Boolean(true));
-
-
- HostConfiguration hostConfiguration =
- getHostConfiguration(httpClient, msgContext, targetURL, configInfo);
+ // Get the HttpClient
+ HttpClient httpClient = (HttpClient)msgContext.getProperty(org.apache.manifoldcf.crawler.connectors.meridio.meridiowrapper.MeridioWrapper.HTTPCLIENT_PROPERTY);
boolean posting = true;
-
// If we're SOAP 1.2, allow the web method to be set from the
// MessageContext.
if (msgContext.getSOAPConstants() == SOAPConstants.SOAP12_CONSTANTS) {
@@ -224,130 +135,65 @@ public class CommonsHTTPSender extends B
}
}
- // Since the host configuration contains the host/port/protocol, we don't want to
- // have it overwritten. So, we need the relative url.
- String relativeTargetURL = targetURL.toString();
- int slashindex = relativeTargetURL.indexOf("/");
- if (slashindex != 0 && slashindex != -1)
- {
- slashindex = relativeTargetURL.indexOf("/",slashindex + 2);
- if (slashindex != -1)
- relativeTargetURL = relativeTargetURL.substring(slashindex);
+ boolean http10 = false;
+ String httpVersion = msgContext.getStrProp(MessageContext.HTTP_TRANSPORT_VERSION);
+ if (httpVersion != null) {
+ if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_V10)) {
+ http10 = true;
+ }
+ // assume 1.1
}
+ HttpRequestBase method;
+
if (posting) {
- method = new PostMethod(relativeTargetURL);
+ HttpPost postMethod = new HttpPost(targetURL.toString());
+
+ // set false as default, addContetInfo can overwrite
+ HttpProtocolParams.setUseExpectContinue(postMethod.getParams(),false);
+
+ Message reqMessage = msgContext.getRequestMessage();
+
+ boolean httpChunkStream = addContextInfo(postMethod, msgContext);
+
+ HttpEntity requestEntity = null;
+ requestEntity = new MessageRequestEntity(reqMessage, httpChunkStream,
+ http10 || !httpChunkStream);
+ postMethod.setEntity(requestEntity);
+ method = postMethod;
} else {
- method = new GetMethod(relativeTargetURL);
- method.setFollowRedirects(true);
+ method = new HttpGet(targetURL.toString());
}
+
+ if (http10)
+ HttpProtocolParams.setVersion(method.getParams(),new ProtocolVersion("HTTP",1,0));
- // The variable 'releaseMethod' is null if we no longer have to release the connection into the pool
- // on exit from this section. Otherwise it remains set to the method, so that all exceptions cause
- // the release to occur.
- HttpMethodBase releaseMethod = method;
+ BackgroundHTTPThread methodThread = new BackgroundHTTPThread(httpClient,method);
+ methodThread.start();
try
{
- // This stuff all needs to be inside the try above
- if (posting)
- {
- Message reqMessage = msgContext.getRequestMessage();
-
- // set false as default, addContetInfo can overwrite
- method.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE,
- false);
-
- // Do stuff similar to curl, for stat-oil
- method.addRequestHeader("Pragma","no-cache");
- method.addRequestHeader("Accept","*/*");
-
- addContextInfo(method, httpClient, msgContext, targetURL);
-
- Credentials c = httpClient.getState().getCredentials(AuthScope.ANY);
- //if (c instanceof NTCredentials)
- // System.out.println("Credential host "+((NTCredentials)c).getHost());
- //else
- // System.out.println("Not NT credentials!");
- MessageRequestEntity requestEntity = null;
- if (msgContext.isPropertyTrue(HTTPConstants.MC_GZIP_REQUEST)) {
- requestEntity = new GzipMessageRequestEntity(method, reqMessage, httpChunkStream);
- } else {
- requestEntity = new MessageRequestEntity(method, reqMessage, httpChunkStream);
- }
- ((PostMethod)method).setRequestEntity(requestEntity);
- }
- else
- {
- addContextInfo(method, httpClient, msgContext, targetURL);
- }
-
- String httpVersion = msgContext.getStrProp(MessageContext.HTTP_TRANSPORT_VERSION);
- if (httpVersion != null) {
- if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_V10)) {
- method.getParams().setVersion(HttpVersion.HTTP_1_0);
- }
- // assume 1.1
- }
-
- // don't forget the cookies!
- // Cookies need to be set on HttpState, since HttpMethodBase
- // overwrites the cookies from HttpState
- if (msgContext.getMaintainSession()) {
- HttpState state = httpClient.getState();
- method.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
- String host = hostConfiguration.getHost();
- String path = targetURL.getPath();
- boolean secure = hostConfiguration.getProtocol().isSecure();
- fillHeaders(msgContext, state, HTTPConstants.HEADER_COOKIE, host, path, secure);
- fillHeaders(msgContext, state, HTTPConstants.HEADER_COOKIE2, host, path, secure);
- httpClient.setState(state);
- }
-
- int returnCode;
-
- ExecuteMethodThread t = new ExecuteMethodThread(httpClient,hostConfiguration,method);
- try
- {
- t.start();
- t.join();
- Throwable thr = t.getException();
- if (thr != null)
- {
- if (thr instanceof Exception)
- throw (Exception)thr;
- else
- throw (Error)thr;
- }
- returnCode = t.getResponse();
- }
- catch (InterruptedException e)
- {
- t.interrupt();
- // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly.
- releaseMethod = null;
- throw e;
- }
-
+ int returnCode = methodThread.getResponseCode();
+
String contentType =
- getHeader(method, HTTPConstants.HEADER_CONTENT_TYPE);
+ getHeader(methodThread, HTTPConstants.HEADER_CONTENT_TYPE);
String contentLocation =
- getHeader(method, HTTPConstants.HEADER_CONTENT_LOCATION);
+ getHeader(methodThread, HTTPConstants.HEADER_CONTENT_LOCATION);
String contentLength =
- getHeader(method, HTTPConstants.HEADER_CONTENT_LENGTH);
-
+ getHeader(methodThread, HTTPConstants.HEADER_CONTENT_LENGTH);
+
if ((returnCode > 199) && (returnCode < 300)) {
// SOAP return is OK - so fall through
} else if (msgContext.getSOAPConstants() ==
- SOAPConstants.SOAP12_CONSTANTS) {
+ SOAPConstants.SOAP12_CONSTANTS) {
// For now, if we're SOAP 1.2, fall through, since the range of
// valid result codes is much greater
} else if ((contentType != null) && !contentType.equals("text/html")
- && ((returnCode > 499) && (returnCode < 600))) {
+ && ((returnCode > 499) && (returnCode < 600))) {
// SOAP Fault should be in here - so fall through
} else {
- String statusMessage = method.getStatusText();
+ String statusMessage = methodThread.getResponseStatus();
AxisFault fault = new AxisFault("HTTP",
"(" + returnCode + ")"
+ statusMessage, null,
@@ -356,104 +202,59 @@ public class CommonsHTTPSender extends B
fault.setFaultDetailString(
Messages.getMessage("return01",
"" + returnCode,
- method.getResponseBodyAsString()));
+ getResponseBodyAsString(methodThread)));
fault.addFaultDetail(Constants.QNAME_FAULTDETAIL_HTTPERRORCODE,
Integer.toString(returnCode));
throw fault;
}
- // wrap the response body stream so that close() also releases
- // the connection back to the pool.
- InputStream releaseConnectionOnCloseStream =
- createConnectionReleasingInputStream(method);
- // If something goes wrong after this point and before this is safely
- // saved in the msg, we'll have a dangling stream, so we need a
- // try/catch to guarantee that it doesn't hang around.
- InputStream streamToClose = releaseConnectionOnCloseStream;
- try
- {
- Header contentEncoding =
- method.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
- if (contentEncoding != null) {
- if (contentEncoding.getValue().
- equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) {
- releaseConnectionOnCloseStream =
- new GZIPInputStream(releaseConnectionOnCloseStream);
- streamToClose = releaseConnectionOnCloseStream;
- } else {
- AxisFault fault = new AxisFault("HTTP",
- "unsupported content-encoding of '"
- + contentEncoding.getValue()
- + "' found", null, null);
- throw fault;
- }
+ String contentEncoding =
+ methodThread.getFirstHeader(HTTPConstants.HEADER_CONTENT_ENCODING);
+ if (contentEncoding != null) {
+ AxisFault fault = new AxisFault("HTTP",
+ "unsupported content-encoding of '"
+ + contentEncoding
+ + "' found", null, null);
+ throw fault;
+ }
- }
- Message outMsg = new Message(releaseConnectionOnCloseStream,
- false, contentType, contentLocation);
- // Transfer HTTP headers of HTTP message to MIME headers of SOAP message
- Header[] responseHeaders = method.getResponseHeaders();
- MimeHeaders responseMimeHeaders = outMsg.getMimeHeaders();
- for (int i = 0; i < responseHeaders.length; i++) {
- Header responseHeader = responseHeaders[i];
- responseMimeHeaders.addHeader(responseHeader.getName(),
- responseHeader.getValue());
- }
- outMsg.setMessageType(Message.RESPONSE);
- // It's definitely not safe to not release the connection back to the pool until after the
- // successful execution of the following line (which, presumably, registers the
- // message in the msgcontext, where it will be closed if something goes wrong)
- msgContext.setResponseMessage(outMsg);
- releaseMethod = null;
- streamToClose = null;
- if (log.isDebugEnabled()) {
- if (null == contentLength) {
- log.debug("\n"
- + Messages.getMessage("no00", "Content-Length"));
- }
- log.debug("\n" + Messages.getMessage("xmlRecd00"));
- log.debug("-----------------------------------------------");
- log.debug(outMsg.getSOAPPartAsString());
- }
+ Map<String,List<String>> responseHeaders = methodThread.getResponseHeaders();
- // if we are maintaining session state,
- // handle cookies (if any)
- if (msgContext.getMaintainSession()) {
- Header[] headers = method.getResponseHeaders();
-
- for (int i = 0; i < headers.length; i++) {
- if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE)) {
- handleCookie(HTTPConstants.HEADER_COOKIE, headers[i].getValue(), msgContext);
- } else if (headers[i].getName().equalsIgnoreCase(HTTPConstants.HEADER_SET_COOKIE2)) {
- handleCookie(HTTPConstants.HEADER_COOKIE2, headers[i].getValue(), msgContext);
- }
- }
- }
+ InputStream dataStream = methodThread.getSafeInputStream();
- // always release the connection back to the pool if
- // it was one way invocation
- if (msgContext.isPropertyTrue("axis.one.way")) {
- method.releaseConnection();
- releaseMethod = null;
- }
- }
- finally
+ Message outMsg = new Message(new BackgroundInputStream(methodThread,dataStream),
+ false, contentType, contentLocation);
+
+ // Transfer HTTP headers of HTTP message to MIME headers of SOAP message
+ MimeHeaders responseMimeHeaders = outMsg.getMimeHeaders();
+ for (String name : responseHeaders.keySet())
{
- if (streamToClose != null)
- {
- streamToClose.close();
- releaseMethod = null;
+ List<String> values = responseHeaders.get(name);
+ for (String value : values) {
+ responseMimeHeaders.addHeader(name,value);
}
}
-
+ outMsg.setMessageType(Message.RESPONSE);
+
+ // Put the message in the message context.
+ msgContext.setResponseMessage(outMsg);
+
+ // Pass off the method thread to the stream for closure
+ methodThread = null;
}
finally
{
- if (releaseMethod != null)
- releaseMethod.releaseConnection();
+ if (methodThread != null)
+ {
+ methodThread.abort();
+ methodThread.finishUp();
+ }
}
+
+ } catch (AxisFault af) {
+ log.debug(af);
+ throw af;
} catch (Exception e) {
- //e.printStackTrace();
log.debug(e);
throw AxisFault.makeFault(e);
}
@@ -465,291 +266,49 @@ public class CommonsHTTPSender extends B
}
/**
- * little helper function for cookies. fills up the message context with
- * a string or an array of strings (if there are more than one Set-Cookie)
- *
- * @param cookieName
- * @param cookie
- * @param msgContext
- */
- public void handleCookie(String cookieName, String cookie,
- MessageContext msgContext) {
-
- cookie = cleanupCookie(cookie);
- int keyIndex = cookie.indexOf("=");
- String key = (keyIndex != -1) ? cookie.substring(0, keyIndex) : cookie;
-
- ArrayList cookies = new ArrayList();
- Object oldCookies = msgContext.getProperty(cookieName);
- boolean alreadyExist = false;
- if(oldCookies != null) {
- if(oldCookies instanceof String[]) {
- String[] oldCookiesArray = (String[])oldCookies;
- for(int i = 0; i < oldCookiesArray.length; i++) {
- String anOldCookie = oldCookiesArray[i];
- if (key != null && anOldCookie.indexOf(key) == 0) {
- // same cookie key
- anOldCookie = cookie; // update to new one
- alreadyExist = true;
- }
- cookies.add(anOldCookie);
- }
- } else {
- String oldCookie = (String)oldCookies;
- if (key != null && oldCookie.indexOf(key) == 0) {
- // same cookie key
- oldCookie = cookie; // update to new one
- alreadyExist = true;
- }
- cookies.add(oldCookie);
- }
- }
-
- if (!alreadyExist) {
- cookies.add(cookie);
- }
-
- if(cookies.size()==1) {
- msgContext.setProperty(cookieName, cookies.get(0));
- } else if (cookies.size() > 1) {
- msgContext.setProperty(cookieName, cookies.toArray(new String[cookies.size()]));
- }
- }
-
- /**
- * Add cookies from message context
- *
- * @param msgContext
- * @param state
- * @param header
- * @param host
- * @param path
- * @param secure
- */
- private void fillHeaders(MessageContext msgContext, HttpState state, String header, String host, String path, boolean secure) {
- Object ck1 = msgContext.getProperty(header);
- if (ck1 != null) {
- if (ck1 instanceof String[]) {
- String [] cookies = (String[]) ck1;
- for (int i = 0; i < cookies.length; i++) {
- addCookie(state, cookies[i], host, path, secure);
- }
- } else {
- addCookie(state, (String) ck1, host, path, secure);
- }
- }
- }
-
- /**
- * add cookie to state
- * @param state
- * @param cookie
- */
- private void addCookie(HttpState state, String cookie,String host, String path, boolean secure) {
- int index = cookie.indexOf('=');
- state.addCookie(new Cookie(host, cookie.substring(0, index),
- cookie.substring(index + 1), path,
- null, secure));
- }
-
- /**
- * cleanup the cookie value.
- *
- * @param cookie initial cookie value
- *
- * @return a cleaned up cookie value.
- */
- private String cleanupCookie(String cookie) {
- cookie = cookie.trim();
- // chop after first ; a la Apache SOAP (see HTTPUtils.java there)
- int index = cookie.indexOf(';');
- if (index != -1) {
- cookie = cookie.substring(0, index);
- }
- return cookie;
- }
-
- protected HostConfiguration getHostConfiguration(HttpClient client,
- MessageContext context,
- URL targetURL,
- ConnectionConfig configInfo)
- {
- // OK, this was very poor design on the part of Axis. The TransportClientProperties object
- // only has the proxy credentials and proxy host as members. This code apparently EXPECTED the
- // actual host credentials to be stuffed into the proxy credentials! There was no direct way to pass non-proxy
- // credentials in either.
- //
- // Instead, I wound up revamping this code pretty much completely, using my own configuration class to get properties
- // and protocols.
-
-
- HostConfiguration config = new HostConfiguration();
-
- String theProtocolString = targetURL.getProtocol();
-
- int port = targetURL.getPort();
- if (port == -1)
- {
- if(theProtocolString.equalsIgnoreCase("https")) {
- port = 443; // default port for https being 443
- } else {
- // it must be http
- port = 80; // default port for http being 80
- }
- }
-
- Protocol theProtocol = configInfo.getProtocol(theProtocolString);
-
- // Set the host parameters
- config.setHost(targetURL.getHost(), port, theProtocol);
-
- // Set the primary (host) credentials
- if (configInfo.getUserName() != null && configInfo.getUserName().length() > 0)
- {
- Credentials cred = null;
- if (configInfo.getDomain() != null && configInfo.getDomain().length() > 0)
- {
- cred = new NTCredentials(configInfo.getUserName(),
- configInfo.getPassword(),
- targetURL.getHost(),
- configInfo.getDomain());
- //System.out.println(targetURL.getHost());
- }
- else
- cred = new UsernamePasswordCredentials(configInfo.getUserName(),
- configInfo.getPassword());
- client.getState().setCredentials(AuthScope.ANY,cred);
- }
-
- // Now, if there's a proxy, set that up too.
- if (configInfo.getProxyHost() != null && configInfo.getProxyHost().length() > 0)
- {
- Credentials cred = null;
- if (configInfo.getDomain() != null && configInfo.getDomain().length() > 0)
- cred = new NTCredentials(configInfo.getUserName(),
- configInfo.getPassword(),
- configInfo.getProxyHost(),
- configInfo.getDomain());
- else
- cred = new UsernamePasswordCredentials(configInfo.getUserName(),
- configInfo.getPassword());
- client.getState().setProxyCredentials(AuthScope.ANY,cred);
- int proxyPort = 80;
- if (theProtocolString.equalsIgnoreCase("https"))
- proxyPort = 443;
- if (configInfo.getProxyPort() != null)
- proxyPort = configInfo.getProxyPort().intValue();
-
- config.setProxy(configInfo.getProxyHost(),proxyPort);
- }
-
- return config;
- }
-
- /**
* Extracts info from message context.
*
- * @param method Post method
- * @param httpClient The client used for posting
+ * @param method Post or get method
* @param msgContext the message context
- * @param tmpURL the url to post to.
- *
- * @throws Exception
*/
- private void addContextInfo(HttpMethodBase method,
- HttpClient httpClient,
- MessageContext msgContext,
- URL tmpURL)
- throws Exception {
-
- // optionally set a timeout for the request
- if (msgContext.getTimeout() != 0) {
- /* ISSUE: these are not the same, but MessageContext has only one
- definition of timeout */
- // SO_TIMEOUT -- timeout for blocking reads
- httpClient.getHttpConnectionManager().getParams().setSoTimeout(msgContext.getTimeout());
- // timeout for initial connection
- httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(msgContext.getTimeout());
- }
+ private static boolean addContextInfo(HttpPost method,
+ MessageContext msgContext)
+ throws AxisFault {
+
+ boolean httpChunkStream = false;
// Get SOAPAction, default to ""
String action = msgContext.useSOAPAction()
- ? msgContext.getSOAPActionURI()
- : "";
+ ? msgContext.getSOAPActionURI()
+ : "";
if (action == null) {
action = "";
}
Message msg = msgContext.getRequestMessage();
+
if (msg != null){
- method.setRequestHeader(new Header(HTTPConstants.HEADER_CONTENT_TYPE,
- msg.getContentType(msgContext.getSOAPConstants())));
- }
- method.setRequestHeader(new Header(HTTPConstants.HEADER_SOAP_ACTION,
- "\"" + action + "\""));
- method.setRequestHeader(new Header(HTTPConstants.HEADER_USER_AGENT, Messages.getMessage("axisUserAgent")));
- String userID = msgContext.getUsername();
- String passwd = msgContext.getPassword();
-
- // if UserID is not part of the context, but is in the URL, use
- // the one in the URL.
- if ((userID == null) && (tmpURL.getUserInfo() != null)) {
- String info = tmpURL.getUserInfo();
- int sep = info.indexOf(':');
-
- if ((sep >= 0) && (sep + 1 < info.length())) {
- userID = info.substring(0, sep);
- passwd = info.substring(sep + 1);
- } else {
- userID = info;
- }
- }
- if (userID != null) {
- Credentials proxyCred =
- new UsernamePasswordCredentials(userID,
- passwd);
- // if the username is in the form "user\domain"
- // then use NTCredentials instead.
- int domainIndex = userID.indexOf("\\");
- if (domainIndex > 0) {
- String domain = userID.substring(0, domainIndex);
- if (userID.length() > domainIndex + 1) {
- String user = userID.substring(domainIndex + 1);
- proxyCred = new NTCredentials(user,
- passwd,
- NetworkUtils.getLocalHostname(), domain);
- }
- }
- httpClient.getState().setCredentials(AuthScope.ANY, proxyCred);
- }
-
- // 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);
- }
-
- // Transfer MIME headers of SOAPMessage to HTTP headers.
- MimeHeaders mimeHeaders = msg.getMimeHeaders();
- if (mimeHeaders != null) {
- for (Iterator i = mimeHeaders.getAllHeaders(); i.hasNext(); ) {
- MimeHeader mimeHeader = (MimeHeader) i.next();
- //HEADER_CONTENT_TYPE and HEADER_SOAP_ACTION are already set.
- //Let's not duplicate them.
- String headerName = mimeHeader.getName();
- if (headerName.equals(HTTPConstants.HEADER_CONTENT_TYPE)
- || headerName.equals(HTTPConstants.HEADER_SOAP_ACTION)) {
- continue;
+
+ // First, transfer MIME headers of SOAPMessage to HTTP headers.
+ // Some of these might be overridden later.
+ MimeHeaders mimeHeaders = msg.getMimeHeaders();
+ if (mimeHeaders != null) {
+ for (Iterator i = mimeHeaders.getAllHeaders(); i.hasNext(); ) {
+ MimeHeader mimeHeader = (MimeHeader) i.next();
+ method.addHeader(mimeHeader.getName(),
+ mimeHeader.getValue());
}
- method.addRequestHeader(mimeHeader.getName(),
- mimeHeader.getValue());
}
+
+ method.setHeader(new BasicHeader(HTTPConstants.HEADER_CONTENT_TYPE,
+ msg.getContentType(msgContext.getSOAPConstants())));
}
+
+ method.setHeader(new BasicHeader(HTTPConstants.HEADER_SOAP_ACTION,
+ "\"" + action + "\""));
+ method.setHeader(new BasicHeader(HTTPConstants.HEADER_USER_AGENT, Messages.getMessage("axisUserAgent")));
+
// process user defined headers for information.
Hashtable userHeaderTable =
@@ -769,327 +328,580 @@ public class CommonsHTTPSender extends B
if (key.equalsIgnoreCase(HTTPConstants.HEADER_EXPECT) &&
value.equalsIgnoreCase(HTTPConstants.HEADER_EXPECT_100_Continue)) {
- method.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE,
- true);
+ HttpProtocolParams.setUseExpectContinue(method.getParams(),true);
} else if (key.equalsIgnoreCase(HTTPConstants.HEADER_TRANSFER_ENCODING_CHUNKED)) {
String val = me.getValue().toString();
if (null != val) {
httpChunkStream = JavaUtils.isTrue(val);
}
} else {
- method.addRequestHeader(key, value);
+ method.addHeader(key, value);
}
}
}
+
+ return httpChunkStream;
}
- /**
- * 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
- *
- * @return true/false
- */
- protected boolean isHostInNonProxyList(String host, String nonProxyHosts) {
-
- if ((nonProxyHosts == null) || (host == null)) {
- return false;
- }
-
- /*
- * The http.nonProxyHosts system property is a list enclosed in
- * double quotes with items separated by a vertical bar.
- */
- StringTokenizer tokenizer = new StringTokenizer(nonProxyHosts, "|\"");
-
- while (tokenizer.hasMoreTokens()) {
- String pattern = tokenizer.nextToken();
+ private static String getHeader(BackgroundHTTPThread methodThread, String headerName)
+ throws IOException, InterruptedException, HttpException {
+ String header = methodThread.getFirstHeader(headerName);
+ return (header == null) ? null : header.trim();
+ }
- if (log.isDebugEnabled()) {
- log.debug(Messages.getMessage("match00",
- new String[]{"HTTPSender",
- host,
- pattern}));
+ private static String getResponseBodyAsString(BackgroundHTTPThread methodThread)
+ throws IOException, InterruptedException, HttpException {
+ InputStream is = methodThread.getSafeInputStream();
+ if (is != null)
+ {
+ try
+ {
+ String charSet = methodThread.getCharSet();
+ if (charSet == null)
+ charSet = "utf-8";
+ char[] buffer = new char[65536];
+ Reader r = new InputStreamReader(is,charSet);
+ Writer w = new StringWriter();
+ try
+ {
+ while (true)
+ {
+ int amt = r.read(buffer);
+ if (amt == -1)
+ break;
+ w.write(buffer,0,amt);
+ }
+ }
+ finally
+ {
+ w.flush();
+ }
+ return w.toString();
}
- if (match(pattern, host, false)) {
- return true;
+ finally
+ {
+ is.close();
}
}
- return false;
+ return "";
}
+
+ private static class MessageRequestEntity implements HttpEntity {
- /**
- * 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
- * @param isCaseSensitive
- *
- * @return <code>true</code> when the string matches against the pattern,
- * <code>false</code> otherwise.
- */
- protected static boolean match(String pattern, String str,
- boolean isCaseSensitive) {
-
- char[] patArr = pattern.toCharArray();
- char[] strArr = str.toCharArray();
- int patIdxStart = 0;
- int patIdxEnd = patArr.length - 1;
- int strIdxStart = 0;
- int strIdxEnd = strArr.length - 1;
- char ch;
- boolean containsStar = false;
+ private final Message message;
+ private final boolean httpChunkStream; //Use HTTP chunking or not.
+ private final boolean contentLengthNeeded;
- for (int i = 0; i < patArr.length; i++) {
- if (patArr[i] == '*') {
- containsStar = true;
- break;
- }
+ public MessageRequestEntity(Message message, boolean httpChunkStream, boolean contentLengthNeeded) {
+ this.message = message;
+ this.httpChunkStream = httpChunkStream;
+ this.contentLengthNeeded = contentLengthNeeded;
}
- if (!containsStar) {
- // No '*'s, so we make a shortcut
- if (patIdxEnd != strIdxEnd) {
- 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
- }
- if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[i]))) {
- return false; // Character mismatch
- }
- }
- return true; // String matches against pattern
+ @Override
+ public boolean isChunked() {
+ return httpChunkStream;
+ }
+
+ @Override
+ public void consumeContent()
+ throws IOException {
+ EntityUtils.consume(this);
}
- if (patIdxEnd == 0) {
- return true; // Pattern contains only '*', which matches anything
+
+ @Override
+ public boolean isRepeatable() {
+ return true;
}
- // Process characters before first star
- while ((ch = patArr[patIdxStart]) != '*'
- && (strIdxStart <= strIdxEnd)) {
- if (isCaseSensitive && (ch != strArr[strIdxStart])) {
- return false; // Character mismatch
- }
- if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxStart]))) {
- return false; // Character mismatch
+ @Override
+ public boolean isStreaming() {
+ return false;
+ }
+
+ @Override
+ public InputStream getContent()
+ throws IOException, IllegalStateException {
+ // MHL
+ return null;
+ }
+
+ @Override
+ public void writeTo(OutputStream out)
+ throws IOException {
+ try {
+ this.message.writeTo(out);
+ } catch (SOAPException e) {
+ throw new IOException(e.getMessage());
}
- patIdxStart++;
- strIdxStart++;
}
- if (strIdxStart > strIdxEnd) {
- // All characters in the string are used. Check if only '*'s are
- // left in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
- return false;
+ @Override
+ public long getContentLength() {
+ if (contentLengthNeeded) {
+ try {
+ return message.getContentLength();
+ } catch (Exception e) {
}
}
- return true;
+ // Unknown (chunked) length
+ return -1L;
}
- // Process characters after last star
- while ((ch = patArr[patIdxEnd]) != '*' && (strIdxStart <= strIdxEnd)) {
- if (isCaseSensitive && (ch != strArr[strIdxEnd])) {
- return false; // Character mismatch
- }
- if (!isCaseSensitive
- && (Character.toUpperCase(ch)
- != Character.toUpperCase(strArr[strIdxEnd]))) {
- return false; // Character mismatch
- }
- patIdxEnd--;
- strIdxEnd--;
- }
- if (strIdxStart > strIdxEnd) {
-
- // All characters in the string are used. Check if only '*'s are
- // left in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
- return false;
- }
- }
- return true;
+ @Override
+ public Header getContentType() {
+ return null; // a separate header is added
}
- // process pattern between stars. padIdxStart and patIdxEnd point
- // always to a '*'.
- while ((patIdxStart != patIdxEnd) && (strIdxStart <= strIdxEnd)) {
- int patIdxTmp = -1;
-
- for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {
- if (patArr[i] == '*') {
- patIdxTmp = i;
- break;
- }
- }
- if (patIdxTmp == patIdxStart + 1) {
-
- // Two stars next to each other, skip the first one.
- patIdxStart++;
- continue;
- }
-
- // Find the pattern between padIdxStart & padIdxTmp in str between
- // strIdxStart & strIdxEnd
- int patLength = (patIdxTmp - patIdxStart - 1);
- int strLength = (strIdxEnd - strIdxStart + 1);
- int foundIdx = -1;
-
- 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])) {
- continue strLoop;
+ @Override
+ public Header getContentEncoding() {
+ return null;
+ }
+ }
+
+ /** This input stream wraps a background http transaction thread, so that
+ * the thread is ended when the stream is closed.
+ */
+ private static class BackgroundInputStream extends InputStream {
+
+ private BackgroundHTTPThread methodThread = null;
+ private InputStream xThreadInputStream = null;
+
+ /** Construct an http transaction stream. The stream is driven by a background
+ * thread, whose existence is tied to this class. The sequence of activity that
+ * this class expects is as follows:
+ * (1) Construct the httpclient and request object and initialize them
+ * (2) Construct a background method thread, and start it
+ * (3) If the response calls for it, call this constructor, and put the resulting stream
+ * into the message response
+ * (4) Otherwise, terminate the background method thread in the standard manner,
+ * being sure NOT
+ */
+ public BackgroundInputStream(BackgroundHTTPThread methodThread, InputStream xThreadInputStream)
+ {
+ this.methodThread = methodThread;
+ this.xThreadInputStream = xThreadInputStream;
+ }
+
+ @Override
+ public int available()
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.available();
+ return super.available();
+ }
+
+ @Override
+ public void close()
+ throws IOException
+ {
+ try
+ {
+ if (xThreadInputStream != null)
+ {
+ xThreadInputStream.close();
+ xThreadInputStream = null;
+ }
+ }
+ finally
+ {
+ if (methodThread != null)
+ {
+ methodThread.abort();
+ try
+ {
+ methodThread.finishUp();
}
- if (!isCaseSensitive && (Character
- .toUpperCase(ch) != Character
- .toUpperCase(strArr[strIdxStart + i + j]))) {
- continue strLoop;
+ catch (InterruptedException e)
+ {
+ throw new InterruptedIOException(e.getMessage());
}
+ methodThread = null;
}
- foundIdx = strIdxStart + i;
- break;
- }
- if (foundIdx == -1) {
- return false;
}
- patIdxStart = patIdxTmp;
- strIdxStart = foundIdx + patLength;
+ }
+
+ @Override
+ public void mark(int readlimit)
+ {
+ if (xThreadInputStream != null)
+ xThreadInputStream.mark(readlimit);
+ else
+ super.mark(readlimit);
+ }
+
+ @Override
+ public void reset()
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ xThreadInputStream.reset();
+ else
+ super.reset();
+ }
+
+ @Override
+ public boolean markSupported()
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.markSupported();
+ return super.markSupported();
+ }
+
+ @Override
+ public long skip(long n)
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.skip(n);
+ return super.skip(n);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len)
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.read(b,off,len);
+ return super.read(b,off,len);
}
- // All characters in the string are used. Check if only '*'s are left
- // in the pattern. If so, we succeeded. Otherwise failure.
- for (int i = patIdxStart; i <= patIdxEnd; i++) {
- if (patArr[i] != '*') {
- return false;
- }
+ @Override
+ public int read(byte[] b)
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.read(b);
+ return super.read(b);
+ }
+
+ @Override
+ public int read()
+ throws IOException
+ {
+ if (xThreadInputStream != null)
+ return xThreadInputStream.read();
+ return -1;
}
- return true;
+
}
- private static String getHeader(HttpMethodBase method, String headerName) {
- Header header = method.getResponseHeader(headerName);
- return (header == null) ? null : header.getValue().trim();
- }
+ /** This thread does the actual socket communication with the server.
+ * It's set up so that it can be abandoned at shutdown time.
+ *
+ * The way it works is as follows:
+ * - it starts the transaction
+ * - it receives the response, and saves that for the calling class to inspect
+ * - it transfers the data part to an input stream provided to the calling class
+ * - it shuts the connection down
+ *
+ * If there is an error, the sequence is aborted, and an exception is recorded
+ * for the calling class to examine.
+ *
+ * The calling class basically accepts the sequence above. It starts the
+ * thread, and tries to get a response code. If instead an exception is seen,
+ * the exception is thrown up the stack.
+ */
+ protected static class BackgroundHTTPThread extends Thread
+ {
+ /** Client and method, all preconfigured */
+ protected final HttpClient httpClient;
+ protected final HttpRequestBase executeMethod;
+
+ protected HttpResponse response = null;
+ protected Throwable responseException = null;
+ protected XThreadInputStream threadStream = null;
+ protected String charSet = null;
+ protected boolean streamCreated = false;
+ protected Throwable streamException = null;
+ protected boolean abortThread = false;
+
+ protected Throwable shutdownException = null;
+
+ protected Throwable generalException = null;
+
+ public BackgroundHTTPThread(HttpClient httpClient, HttpRequestBase executeMethod)
+ {
+ super();
+ setDaemon(true);
+ this.httpClient = httpClient;
+ this.executeMethod = executeMethod;
+ }
- private InputStream createConnectionReleasingInputStream(final HttpMethodBase method) throws IOException {
- return new FilterInputStream(method.getResponseBodyAsStream()) {
- public void close() throws IOException {
- try {
- super.close();
- } finally {
- method.releaseConnection();
+ public void run()
+ {
+ try
+ {
+ try
+ {
+ // Call the execute method appropriately
+ synchronized (this)
+ {
+ if (!abortThread)
+ {
+ try
+ {
+ response = httpClient.execute(executeMethod);
+ }
+ catch (java.net.SocketTimeoutException e)
+ {
+ responseException = e;
+ }
+ catch (ConnectTimeoutException e)
+ {
+ responseException = e;
+ }
+ catch (InterruptedIOException e)
+ {
+ throw e;
+ }
+ catch (Throwable e)
+ {
+ responseException = e;
+ }
+ this.notifyAll();
+ }
+ }
+
+ // Start the transfer of the content
+ if (responseException == null)
+ {
+ synchronized (this)
+ {
+ if (!abortThread)
+ {
+ try
+ {
+ HttpEntity entity = response.getEntity();
+ InputStream bodyStream = entity.getContent();
+ if (bodyStream != null)
+ {
+ threadStream = new XThreadInputStream(bodyStream);
+ charSet = EntityUtils.getContentCharSet(entity);
+ }
+ streamCreated = true;
+ }
+ catch (java.net.SocketTimeoutException e)
+ {
+ streamException = e;
+ }
+ catch (ConnectTimeoutException e)
+ {
+ streamException = e;
+ }
+ catch (InterruptedIOException e)
+ {
+ throw e;
+ }
+ catch (Throwable e)
+ {
+ streamException = e;
+ }
+ this.notifyAll();
+ }
+ }
+ }
+
+ if (responseException == null && streamException == null)
+ {
+ if (threadStream != null)
+ {
+ // Stuff the content until we are done
+ threadStream.stuffQueue();
+ }
+ }
+
+ }
+ finally
+ {
+ synchronized (this)
+ {
+ try
+ {
+ executeMethod.abort();
+ }
+ catch (Throwable e)
+ {
+ shutdownException = e;
+ }
+ this.notifyAll();
+ }
}
}
- };
- }
-
- private static class MessageRequestEntity implements RequestEntity {
-
- private HttpMethodBase method;
- private Message message;
- boolean httpChunkStream = true; //Use HTTP chunking or not.
-
- public MessageRequestEntity(HttpMethodBase method, Message message) {
- this.message = message;
- this.method = method;
- }
-
- public MessageRequestEntity(HttpMethodBase method, Message message, boolean httpChunkStream) {
- this.message = message;
- this.method = method;
- this.httpChunkStream = httpChunkStream;
- }
-
- public boolean isRepeatable() {
- return true;
+ catch (Throwable e)
+ {
+ // We catch exceptions here that should ONLY be InterruptedExceptions, as a result of the thread being aborted.
+ this.generalException = e;
+ }
}
- public void writeRequest(OutputStream out) throws IOException {
- try {
- this.message.writeTo(out);
- } catch (SOAPException e) {
- throw new IOException(e.getMessage());
+ public int getResponseCode()
+ throws InterruptedException, IOException, HttpException
+ {
+ // Must wait until the response object is there
+ while (true)
+ {
+ synchronized (this)
+ {
+ checkException(responseException);
+ if (response != null)
+ return response.getStatusLine().getStatusCode();
+ wait();
+ }
}
}
- protected boolean isContentLengthNeeded() {
- return this.method.getParams().getVersion() == HttpVersion.HTTP_1_0 || !httpChunkStream;
+ public String getResponseStatus()
+ throws InterruptedException, IOException, HttpException
+ {
+ // Must wait until the response object is there
+ while (true)
+ {
+ synchronized (this)
+ {
+ checkException(responseException);
+ if (response != null)
+ return response.getStatusLine().toString();
+ wait();
+ }
+ }
}
- public long getContentLength() {
- if (isContentLengthNeeded()) {
- try {
- return message.getContentLength();
- } catch (Exception e) {
+ public Map<String,List<String>> getResponseHeaders()
+ throws InterruptedException, IOException, HttpException
+ {
+ // Must wait for the response object to appear
+ while (true)
+ {
+ synchronized (this)
+ {
+ checkException(responseException);
+ if (response != null)
+ {
+ Header[] headers = response.getAllHeaders();
+ Map<String,List<String>> rval = new HashMap<String,List<String>>();
+ int i = 0;
+ while (i < headers.length)
+ {
+ Header h = headers[i++];
+ String name = h.getName();
+ String value = h.getValue();
+ List<String> values = rval.get(name);
+ if (values == null)
+ {
+ values = new ArrayList<String>();
+ rval.put(name,values);
+ }
+ values.add(value);
+ }
+ return rval;
+ }
+ wait();
}
}
- return -1; /* -1 for chunked */
- }
- public String getContentType() {
- return null; // a separate header is added
}
-
- }
-
- private static class GzipMessageRequestEntity extends MessageRequestEntity {
-
- public GzipMessageRequestEntity(HttpMethodBase method, Message message) {
- super(method, message);
+
+ public String getFirstHeader(String headerName)
+ throws InterruptedException, IOException, HttpException
+ {
+ // Must wait for the response object to appear
+ while (true)
+ {
+ synchronized (this)
+ {
+ checkException(responseException);
+ if (response != null)
+ {
+ Header h = response.getFirstHeader(headerName);
+ if (h == null)
+ return null;
+ return h.getValue();
+ }
+ wait();
+ }
+ }
}
- public GzipMessageRequestEntity(HttpMethodBase method, Message message, boolean httpChunkStream) {
- super(method, message, httpChunkStream);
+ public InputStream getSafeInputStream()
+ throws InterruptedException, IOException, HttpException
+ {
+ // Must wait until stream is created, or until we note an exception was thrown.
+ while (true)
+ {
+ synchronized (this)
+ {
+ if (responseException != null)
+ throw new IllegalStateException("Check for response before getting stream");
+ checkException(streamException);
+ if (streamCreated)
+ return threadStream;
+ wait();
+ }
+ }
}
-
- public void writeRequest(OutputStream out) throws IOException {
- if (cachedStream != null) {
- cachedStream.writeTo(out);
- } else {
- GZIPOutputStream gzStream = new GZIPOutputStream(out);
- super.writeRequest(gzStream);
- gzStream.finish();
+
+ public String getCharSet()
+ throws InterruptedException, IOException, HttpException
+ {
+ while (true)
+ {
+ synchronized (this)
+ {
+ if (responseException != null)
+ throw new IllegalStateException("Check for response before getting charset");
+ checkException(streamException);
+ if (streamCreated)
+ return charSet;
+ wait();
+ }
}
}
-
- public long getContentLength() {
- if(isContentLengthNeeded()) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- writeRequest(baos);
- cachedStream = baos;
- return baos.size();
- } catch (java.net.SocketTimeoutException e) {
- // fall through to doing chunked.
- } catch (org.apache.commons.httpclient.ConnectTimeoutException e) {
- // fall through to doing chunked
- } catch (java.io.InterruptedIOException e) {
- Thread.currentThread().interrupt();
- // fall through to doing chunked.
- } catch (IOException e) {
- // fall through to doing chunked.
+
+ public void abort()
+ {
+ // This will be called during the finally
+ // block in the case where all is well (and
+ // the stream completed) and in the case where
+ // there were exceptions.
+ synchronized (this)
+ {
+ if (streamCreated)
+ {
+ if (threadStream != null)
+ threadStream.abort();
}
+ abortThread = true;
+ }
+ }
+
+ public void finishUp()
+ throws InterruptedException
+ {
+ join();
+ }
+
+ protected synchronized void checkException(Throwable exception)
+ throws IOException, HttpException
+ {
+ if (exception != null)
+ {
+ Throwable e = exception;
+ if (e instanceof IOException)
+ throw (IOException)e;
+ else if (e instanceof HttpException)
+ throw (HttpException)e;
+ else if (e instanceof RuntimeException)
+ throw (RuntimeException)e;
+ else if (e instanceof Error)
+ throw (Error)e;
+ else
+ throw new RuntimeException("Unhandled exception of type: "+e.getClass().getName(),e);
}
- return -1; // do chunked
}
- private ByteArrayOutputStream cachedStream;
}
+
}
Modified: manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioAuthority.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioAuthority.java?rev=1413394&r1=1413393&r2=1413394&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioAuthority.java (original)
+++ manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioAuthority.java Sun Nov 25 19:36:15 2012
@@ -28,10 +28,6 @@ import org.apache.manifoldcf.authorities
import org.apache.manifoldcf.authorities.system.ManifoldCF;
import org.apache.manifoldcf.authorities.interfaces.AuthorizationResponse;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolFactory;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-
import java.rmi.RemoteException;
import java.util.*;
import java.io.*;
@@ -56,7 +52,7 @@ public class MeridioAuthority extends or
private URL RmwsURL = null;
private URL MetaCartawsURL = null;
- private ProtocolFactory myFactory = null;
+ private javax.net.ssl.SSLSocketFactory mySSLFactory = null;
private String DMWSProxyHost = null;
private String DMWSProxyPort = null;
@@ -207,15 +203,11 @@ public class MeridioAuthority extends or
// Set up ssl if indicated
String keystoreData = params.getParameter( "MeridioKeystore" );
- myFactory = new ProtocolFactory();
if (keystoreData != null)
- {
- IKeystoreManager keystoreManager = KeystoreManagerFactory.make("",keystoreData);
- MeridioSecureSocketFactory secureSocketFactory = new MeridioSecureSocketFactory(keystoreManager.getSecureSocketFactory());
- Protocol myHttpsProtocol = new Protocol("https", (ProtocolSocketFactory)secureSocketFactory, 443);
- myFactory.registerProtocol("https",myHttpsProtocol);
- }
+ mySSLFactory = KeystoreManagerFactory.make("",keystoreData).getSecureSocketFactory();
+ else
+ mySSLFactory = null;
try
{
@@ -247,10 +239,14 @@ public class MeridioAuthority extends or
DMWSProxyHost, DMWSProxyPort, RMWSProxyHost, RMWSProxyPort, MetaCartaWSProxyHost, MetaCartaWSProxyPort,
UserName, Password,
InetAddress.getLocalHost().getHostName(),
- myFactory,
+ mySSLFactory,
getClass(),
"meridio-client-config.wsdd");
}
+ catch (NumberFormatException e)
+ {
+ throw new ManifoldCFException("Meridio: bad number: "+e.getMessage(),e);
+ }
catch (UnknownHostException unknownHostException)
{
throw new ManifoldCFException("Meridio: A Unknown Host Exception occurred while " +
@@ -450,7 +446,7 @@ public class MeridioAuthority extends or
DmwsURL = null;
RmwsURL = null;
MetaCartawsURL = null;
- myFactory = null;
+ mySSLFactory = null;
DMWSProxyHost = null;
DMWSProxyPort = null;
RMWSProxyHost = null;
Modified: manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java?rev=1413394&r1=1413393&r2=1413394&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java (original)
+++ manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/MeridioConnector.java Sun Nov 25 19:36:15 2012
@@ -31,9 +31,6 @@ import org.apache.manifoldcf.crawler.int
import org.apache.manifoldcf.crawler.system.Logging;
import org.apache.manifoldcf.crawler.system.ManifoldCF;
-import org.apache.commons.httpclient.protocol.Protocol;
-import org.apache.commons.httpclient.protocol.ProtocolFactory;
-import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import java.io.File;
import java.io.InterruptedIOException;
@@ -83,7 +80,7 @@ public class MeridioConnector extends or
// These are the variables needed to establish a connection
protected URL DmwsURL = null;
protected URL RmwsURL = null;
- protected ProtocolFactory myFactory = null;
+ protected javax.net.ssl.SSLSocketFactory mySSLFactory = null;
protected MeridioWrapper meridio_ = null; // A handle to the Meridio Java API Wrapper
/** Constructor.
@@ -148,15 +145,11 @@ public class MeridioConnector extends or
// Set up ssl if indicated
String keystoreData = params.getParameter( "MeridioKeystore" );
- myFactory = new ProtocolFactory();
if (keystoreData != null)
- {
- IKeystoreManager keystoreManager = KeystoreManagerFactory.make("",keystoreData);
- MeridioSecureSocketFactory secureSocketFactory = new MeridioSecureSocketFactory(keystoreManager.getSecureSocketFactory());
- Protocol myHttpsProtocol = new Protocol("https", (ProtocolSocketFactory)secureSocketFactory, 443);
- myFactory.registerProtocol("https",myHttpsProtocol);
- }
+ mySSLFactory = KeystoreManagerFactory.make("",keystoreData).getSecureSocketFactory();
+ else
+ mySSLFactory = null;
// Put together the url base
String clientProtocol = params.getParameter("MeridioWebClientProtocol");
@@ -194,10 +187,14 @@ public class MeridioConnector extends or
params.getParameter("UserName"),
params.getObfuscatedParameter("Password"),
InetAddress.getLocalHost().getHostName(),
- myFactory,
+ mySSLFactory,
getClass(),
"meridio-client-config.wsdd");
}
+ catch (NumberFormatException e)
+ {
+ throw new ManifoldCFException("Meridio: bad number: "+e.getMessage(),e);
+ }
catch (UnknownHostException unknownHostException)
{
throw new ManifoldCFException("Meridio: A Unknown Host Exception occurred while " +
@@ -440,7 +437,7 @@ public class MeridioConnector extends or
urlVersionBase = null;
DmwsURL = null;
RmwsURL = null;
- myFactory = null;
+ mySSLFactory = null;
Logging.connectors.debug("Meridio: Exiting 'disconnect' method");
}
}
Modified: manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/MeridioWrapper.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/MeridioWrapper.java?rev=1413394&r1=1413393&r2=1413394&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/MeridioWrapper.java (original)
+++ manifoldcf/branches/CONNECTORS-120/connectors/meridio/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/meridio/meridiowrapper/MeridioWrapper.java Sun Nov 25 19:36:15 2012
@@ -40,8 +40,6 @@ import org.apache.log4j.Logger;
import javax.xml.namespace.QName;
-import org.apache.commons.httpclient.protocol.ProtocolFactory;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.AxisEngine;
import org.apache.axis.ConfigurationException;
@@ -73,12 +71,45 @@ import com.meridio.www.MeridioRMWS.Apply
import org.tempuri.*;
import org.tempuri.holders.*;
-import org.apache.manifoldcf.crawler.connectors.meridio.ConnectionConfig;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.client.HttpClient;
+import org.apache.http.impl.conn.PoolingClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.conn.ssl.BrowserCompatHostnameVerifier;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
+import org.apache.http.conn.params.ConnRoutePNames;
+import org.apache.http.client.params.ClientPNames;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.NTCredentials;
+import org.apache.http.HttpHost;
+
public class MeridioWrapper
{
- public static final String CONFIGURATION_PROPERTY = "ManifoldCF_Configuration";
+ public static final String HTTPCLIENT_PROPERTY = "ManifoldCF_HttpClient";
+
+ // Current host name
+ private static String currentHost = null;
+ static
+ {
+ // Find the current host name
+ try
+ {
+ java.net.InetAddress addr = java.net.InetAddress.getLocalHost();
+
+ // Get hostname
+ currentHost = addr.getHostName();
+ }
+ catch (UnknownHostException e)
+ {
+ }
+ }
// This is the local cache
protected long meridioCategoriesTime = -1L;
@@ -91,12 +122,15 @@ public class MeridioWrapper
// These are the properties that are set in the constructor. They are kept around so
// that we can relogin when necessary.
- protected ProtocolFactory protocolFactory = null;
protected EngineConfiguration engineConfiguration = null;
- protected MultiThreadedHttpConnectionManager connectionManager = null;
protected Logger oLog = null;
protected String clientWorkstation = null;
+ protected ClientConnectionManager connectionManager = null;
+ protected HttpClient dmwsHttpClient = null;
+ protected HttpClient rmwsHttpClient = null;
+ protected HttpClient mcwsHttpClient = null;
+
// These are set up during construction of this class.
protected MeridioDMSoapStub meridioDMWebService_ = null;
protected MeridioRMSoapStub meridioRMWebService_ = null;
@@ -106,10 +140,6 @@ public class MeridioWrapper
// multiple different connections may be using this same class!!!
protected String loginToken_ = null;
- // Configuration objects
- protected ConnectionConfig dmwsConfig = null;
- protected ConnectionConfig rmwsConfig = null;
-
public MeridioDMSoapStub getDMWebService ()
{
return meridioDMWebService_;
@@ -165,27 +195,38 @@ public class MeridioWrapper
String dmwsProxyPort,
String rmwsProxyHost,
String rmwsProxyPort,
- String metacartawsProxyHost,
- String metacartawsProxyPort,
+ String mcwsProxyHost,
+ String mcwsProxyPort,
String userName,
String password,
String clientWorkstation,
- ProtocolFactory protocolFactory,
+ javax.net.ssl.SSLSocketFactory mySSLFactory,
Class resourceClass,
String engineConfigurationFile
)
- throws RemoteException
+ throws RemoteException, NumberFormatException
{
// Initialize local instance variables
oLog = log;
- this.protocolFactory = protocolFactory;
this.engineConfiguration = new ResourceProvider(resourceClass,engineConfigurationFile);
- this.connectionManager = new MultiThreadedHttpConnectionManager();
- this.connectionManager.getParams().setMaxTotalConnections(1);
this.clientWorkstation = clientWorkstation;
- // Set up the configuration info object
- ConnectionConfig cc;
+ // Set up the pool.
+ // We have a choice: We can either have one httpclient instance, which gets reinitialized for every service
+ // it connects with (because each one has a potentially different proxy setup), OR we can have a different
+ // httpclient for each service. The latter approach is obviously the more efficient, so I've chosen to do it
+ // that way.
+ PoolingClientConnectionManager localConnectionManager = new PoolingClientConnectionManager();
+ localConnectionManager.setMaxTotal(1);
+ if (mySSLFactory != null)
+ {
+ SSLSocketFactory myFactory = new SSLSocketFactory(mySSLFactory, new BrowserCompatHostnameVerifier());
+ Scheme myHttpsProtocol = new Scheme("https", 443, myFactory);
+ localConnectionManager.getSchemeRegistry().register(myHttpsProtocol);
+ }
+ connectionManager = localConnectionManager;
+
+ // Parse the user and password values
int index = userName.indexOf("\\");
String domainUser;
String domain;
@@ -212,6 +253,106 @@ public class MeridioWrapper
oLog.debug("Meridio: Password is null");
}
+ // Initialize the three httpclient objects
+
+ // dmws first
+ BasicHttpParams dmwsParams = new BasicHttpParams();
+ dmwsParams.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true);
+ dmwsParams.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,false);
+ dmwsParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
+ dmwsParams.setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
+ DefaultHttpClient localDmwsHttpClient = new DefaultHttpClient(connectionManager,dmwsParams);
+ localDmwsHttpClient.setRedirectStrategy(new DefaultRedirectStrategy());
+ if (domainUser != null)
+ {
+ localDmwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(meridioDmwsUrl.getHost(),meridioDmwsUrl.getPort()),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+ // Initialize proxy
+ if (dmwsProxyHost != null && dmwsProxyHost.length() > 0)
+ {
+ int port = (dmwsProxyPort == null || dmwsProxyPort.length() == 0)?8080:Integer.parseInt(dmwsProxyPort);
+ // Configure proxy authentication
+ if (domainUser != null && domainUser.length() > 0)
+ {
+ localDmwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(dmwsProxyHost, port),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+
+ HttpHost proxy = new HttpHost(dmwsProxyHost, port);
+ localDmwsHttpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
+ }
+ dmwsHttpClient = localDmwsHttpClient;
+
+ // rmws
+ BasicHttpParams rmwsParams = new BasicHttpParams();
+ rmwsParams.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true);
+ rmwsParams.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,false);
+ rmwsParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
+ rmwsParams.setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
+ DefaultHttpClient localRmwsHttpClient = new DefaultHttpClient(connectionManager,rmwsParams);
+ localRmwsHttpClient.setRedirectStrategy(new DefaultRedirectStrategy());
+ if (domainUser != null)
+ {
+ localRmwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(meridioRmwsUrl.getHost(),meridioRmwsUrl.getPort()),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+ // Initialize proxy
+ if (rmwsProxyHost != null && rmwsProxyHost.length() > 0)
+ {
+ int port = (rmwsProxyPort == null || rmwsProxyPort.length() == 0)?8080:Integer.parseInt(rmwsProxyPort);
+ // Configure proxy authentication
+ if (domainUser != null && domainUser.length() > 0)
+ {
+ localRmwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(rmwsProxyHost, port),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+
+ HttpHost proxy = new HttpHost(rmwsProxyHost, port);
+ localRmwsHttpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
+ }
+ rmwsHttpClient = localRmwsHttpClient;
+
+ // mcws
+ if (meridioManifoldCFWSUrl != null)
+ {
+ BasicHttpParams mcwsParams = new BasicHttpParams();
+ mcwsParams.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true);
+ mcwsParams.setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,false);
+ mcwsParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,60000);
+ mcwsParams.setBooleanParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS,true);
+ DefaultHttpClient localMcwsHttpClient = new DefaultHttpClient(connectionManager,mcwsParams);
+ localMcwsHttpClient.setRedirectStrategy(new DefaultRedirectStrategy());
+ if (domainUser != null)
+ {
+ localMcwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(meridioManifoldCFWSUrl.getHost(),meridioManifoldCFWSUrl.getPort()),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+ // Initialize proxy
+ if (mcwsProxyHost != null && mcwsProxyHost.length() > 0)
+ {
+ int port = (mcwsProxyPort == null || mcwsProxyPort.length() == 0)?8080:Integer.parseInt(mcwsProxyPort);
+ // Configure proxy authentication
+ if (domainUser != null && domainUser.length() > 0)
+ {
+ localMcwsHttpClient.getCredentialsProvider().setCredentials(
+ new AuthScope(mcwsProxyHost, port),
+ new NTCredentials(domainUser, password, currentHost, domain));
+ }
+
+ HttpHost proxy = new HttpHost(mcwsProxyHost, port);
+ localMcwsHttpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
+ }
+ mcwsHttpClient = localMcwsHttpClient;
+ }
+ else
+ mcwsHttpClient = null;
+
// Set up the stub handles
/*=================================================================
* Get a handle to the DMWS
@@ -220,14 +361,9 @@ public class MeridioWrapper
MeridioDMSoapStub meridioDMWebService = new MeridioDMSoapStub(meridioDmwsUrl, meridioDMLocator);
meridioDMWebService.setPortName(meridioDMLocator.getMeridioDMSoapWSDDServiceName());
- // I believe that setting the username and password this way is no longer needed...
meridioDMWebService.setUsername(userName);
meridioDMWebService.setPassword(password);
- // Here's the real way to send in user/password
- cc = new ConnectionConfig(protocolFactory,connectionManager,dmwsProxyHost,(dmwsProxyPort!=null&&dmwsProxyPort.length()>0)?new Integer(dmwsProxyPort):null,
- domain,domainUser,password);
- dmwsConfig = cc;
- meridioDMWebService._setProperty( CONFIGURATION_PROPERTY, cc);
+ meridioDMWebService._setProperty( HTTPCLIENT_PROPERTY, dmwsHttpClient);
meridioDMWebService_ = meridioDMWebService;
@@ -240,10 +376,7 @@ public class MeridioWrapper
meridioRMWebService.setPortName(meridioRMLocator.getMeridioRMSoapWSDDServiceName());
meridioRMWebService.setUsername(userName);
meridioRMWebService.setPassword(password);
- cc = new ConnectionConfig(protocolFactory,connectionManager,rmwsProxyHost,(rmwsProxyPort!=null&&rmwsProxyPort.length()>0)?new Integer(rmwsProxyPort):null,
- domain,domainUser,password);
- rmwsConfig = cc;
- meridioRMWebService._setProperty( CONFIGURATION_PROPERTY, cc);
+ meridioRMWebService._setProperty( HTTPCLIENT_PROPERTY, rmwsHttpClient);
meridioRMWebService_ = meridioRMWebService;
@@ -259,7 +392,8 @@ public class MeridioWrapper
meridioMetaCartaWebService.setPortName(meridioMCWS.getMetaCartaSoapWSDDServiceName());
meridioMetaCartaWebService.setUsername(userName);
meridioMetaCartaWebService.setPassword(password);
- meridioMetaCartaWebService._setProperty( CONFIGURATION_PROPERTY, cc );
+ meridioMetaCartaWebService._setProperty( HTTPCLIENT_PROPERTY, mcwsHttpClient );
+
meridioMCWS_ = meridioMetaCartaWebService;
}
Modified: manifoldcf/branches/CONNECTORS-120/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/CommonsHTTPSender.java
URL: http://svn.apache.org/viewvc/manifoldcf/branches/CONNECTORS-120/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/CommonsHTTPSender.java?rev=1413394&r1=1413393&r2=1413394&view=diff
==============================================================================
--- manifoldcf/branches/CONNECTORS-120/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/CommonsHTTPSender.java (original)
+++ manifoldcf/branches/CONNECTORS-120/connectors/sharepoint/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharepoint/CommonsHTTPSender.java Sun Nov 25 19:36:15 2012
@@ -251,42 +251,6 @@ public class CommonsHTTPSender extends B
}
}
-/*
- ExecuteMethodThread t = new ExecuteMethodThread(httpClient,targetURL.toString(),msgContext);
- try
- {
- t.start();
- t.join();
- Throwable thr = t.getException();
- if (thr != null)
- {
- if (thr instanceof RuntimeException)
- throw (RuntimeException)thr;
- else if (thr instanceof Exception)
- throw (Exception)thr;
- else
- throw (Error)thr;
- }
- }
- catch (InterruptedException e)
- {
- t.interrupt();
- throw e;
- }
-*/
- /*
- if (log.isDebugEnabled()) {
- if (null == contentLength) {
- log.debug("\n"
- + Messages.getMessage("no00", "Content-Length"));
- }
- log.debug("\n" + Messages.getMessage("xmlRecd00"));
- log.debug("-----------------------------------------------");
- log.debug(msgContext.getResponseMessage().getSOAPPartAsString());
- }
- }
- */
-
} catch (AxisFault af) {
log.debug(af);
throw af;
@@ -923,7 +887,6 @@ public class CommonsHTTPSender extends B
{
if (exception != null)
{
- // Throw the current exception, but clear it, so no further throwing is possible on the same problem.
Throwable e = exception;
if (e instanceof IOException)
throw (IOException)e;