Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/HTTPSenderImpl.java Mon May 1 11:36:09 2017 @@ -19,33 +19,18 @@ package org.apache.axis2.transport.http.impl.httpclient3; -import java.io.IOException; -import java.io.InputStream; import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.zip.GZIPInputStream; import org.apache.axis2.AxisFault; -import org.apache.axis2.Constants; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.context.OperationContext; -import org.apache.axis2.i18n.Messages; import org.apache.axis2.transport.http.AxisRequestEntity; -import org.apache.axis2.transport.http.CommonsTransportHeaders; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HTTPSender; import org.apache.axis2.transport.http.Request; -import org.apache.axis2.wsdl.WSDLConstants; -import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.HeaderElement; import org.apache.commons.httpclient.HttpConnectionManager; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; -import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -53,232 +38,13 @@ public class HTTPSenderImpl extends HTTP private static final Log log = LogFactory.getLog(HTTPSenderImpl.class); - boolean isChunked() { - return chunked; - } - - String getHttpVersion() { - return httpVersion; - } - @Override protected Request createRequest(MessageContext msgContext, String methodName, URL url, AxisRequestEntity requestEntity) throws AxisFault { - return new RequestImpl(this, msgContext, methodName, url, requestEntity); - } - - /** - * 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(Request request, HttpMethod 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(request.getResponseHeaders()); - msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders); - msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, - new Integer(request.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(Request request, HttpMethodBase httpMethod, MessageContext msgContext) - throws IOException { - obtainHTTPHeaderInformation(request, 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); - } + return new RequestImpl(getHttpClient(msgContext), msgContext, methodName, url, requestEntity); } - /** - * This is used to get the dynamically set time out values from the message - * context. If the values are not available or invalid then the default - * values or the values set by the configuration will be used - * - * @param msgContext - * the active MessageContext - * @param httpClient - */ - protected void initializeTimeouts(MessageContext msgContext, HttpClient httpClient) { - // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the - // override the static config - Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT); - Integer tempConnTimeoutProperty = (Integer) msgContext - .getProperty(HTTPConstants.CONNECTION_TIMEOUT); - long timeout = msgContext.getOptions().getTimeOutInMilliSeconds(); - - if (tempConnTimeoutProperty != null) { - int connectionTimeout = tempConnTimeoutProperty.intValue(); - // timeout for initial connection - httpClient.getHttpConnectionManager().getParams() - .setConnectionTimeout(connectionTimeout); - } else { - // set timeout in client - if (timeout > 0) { - httpClient.getHttpConnectionManager().getParams() - .setConnectionTimeout((int) timeout); - } - } - - if (tempSoTimeoutProperty != null) { - int soTimeout = tempSoTimeoutProperty.intValue(); - // SO_TIMEOUT -- timeout for blocking reads - httpClient.getHttpConnectionManager().getParams().setSoTimeout(soTimeout); - httpClient.getParams().setSoTimeout(soTimeout); - } else { - // set timeout in client - if (timeout > 0) { - httpClient.getHttpConnectionManager().getParams().setSoTimeout((int) timeout); - httpClient.getParams().setSoTimeout((int) timeout); - } - } - } - - /** - * This is used to get the dynamically set time out values from the message - * context. If the values are not available or invalid then the default - * values or the values set by the configuration will be used - * - * @param msgContext - * the active MessageContext - * @param httpMethod - * method - */ - protected void setTimeouts(MessageContext msgContext, HttpMethod httpMethod) { - // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the - // override the static config - Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT); - Integer tempConnTimeoutProperty = (Integer) msgContext - .getProperty(HTTPConstants.CONNECTION_TIMEOUT); - long timeout = msgContext.getOptions().getTimeOutInMilliSeconds(); - - if (tempConnTimeoutProperty != null) { - // timeout for initial connection - httpMethod.getParams().setParameter("http.connection.timeout", tempConnTimeoutProperty); - } - - if (tempSoTimeoutProperty != null) { - // SO_TIMEOUT -- timeout for blocking reads - httpMethod.getParams().setSoTimeout(tempSoTimeoutProperty); - } else { - // set timeout in client - if (timeout > 0) { - httpMethod.getParams().setSoTimeout((int) timeout); - } - } - } - - protected HttpClient getHttpClient(MessageContext msgContext) { + private HttpClient getHttpClient(MessageContext msgContext) { ConfigurationContext configContext = msgContext.getConfigurationContext(); HttpClient httpClient = (HttpClient) msgContext @@ -333,9 +99,6 @@ public class HTTPSenderImpl extends HTTP // starvation to 30sec httpClient.getParams().setConnectionManagerTimeout(30000); - // Get the timeout values set in the runtime - initializeTimeouts(msgContext, httpClient); - return httpClient; } }
Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/RequestImpl.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/RequestImpl.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/RequestImpl.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http-hc3/src/main/java/org/apache/axis2/transport/http/impl/httpclient3/RequestImpl.java Mon May 1 11:36:09 2017 @@ -19,27 +19,27 @@ package org.apache.axis2.transport.http.impl.httpclient3; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.axiom.mime.Header; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.context.OperationContext; -import org.apache.axis2.i18n.Messages; import org.apache.axis2.transport.http.AxisRequestEntity; import org.apache.axis2.transport.http.HTTPAuthenticator; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HTTPTransportConstants; import org.apache.axis2.transport.http.Request; -import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HeaderElement; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.HttpState; -import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpVersion; import org.apache.commons.httpclient.NTCredentials; import org.apache.commons.httpclient.UsernamePasswordCredentials; @@ -52,21 +52,21 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; final class RequestImpl implements Request { + private static final String[] COOKIE_HEADER_NAMES = { HTTPConstants.HEADER_SET_COOKIE, HTTPConstants.HEADER_SET_COOKIE2 }; + private static final Log log = LogFactory.getLog(RequestImpl.class); - protected final HTTPSenderImpl sender; - protected final MessageContext msgContext; - protected final URL url; - protected final HttpMethodBase method; - protected final HttpClient httpClient; + private final HttpClient httpClient; + private final MessageContext msgContext; + private final URL url; + private final HttpMethodBase method; private final HostConfiguration config; - RequestImpl(HTTPSenderImpl sender, MessageContext msgContext, final String methodName, URL url, + RequestImpl(HttpClient httpClient, MessageContext msgContext, final String methodName, URL url, AxisRequestEntity requestEntity) throws AxisFault { - this.sender = sender; + this.httpClient = httpClient; this.msgContext = msgContext; this.url = url; - httpClient = sender.getHttpClient(msgContext); if (requestEntity == null) { method = new HttpMethodBase() { @Override @@ -86,9 +86,7 @@ final class RequestImpl implements Reque } }; entityEnclosingMethod.setRequestEntity(new AxisRequestEntityImpl(requestEntity)); - if (!sender.getHttpVersion().equals(HTTPConstants.HEADER_PROTOCOL_10) && sender.isChunked()) { - entityEnclosingMethod.setContentChunked(true); - } + entityEnclosingMethod.setContentChunked(requestEntity.isChunked()); method = entityEnclosingMethod; } method.setPath(url.getPath()); @@ -130,6 +128,16 @@ final class RequestImpl implements Reque } @Override + public void setConnectionTimeout(int timeout) { + method.getParams().setParameter("http.connection.timeout", timeout); + } + + @Override + public void setSocketTimeout(int timeout) { + method.getParams().setSoTimeout(timeout); + } + + @Override public int getStatusCode() { return method.getStatusCode(); } @@ -140,24 +148,39 @@ final class RequestImpl implements Reque } @Override + public String getResponseHeader(String name) { + org.apache.commons.httpclient.Header header = method.getResponseHeader(name); + return header == null ? null : header.getValue(); + } + + @Override public Header[] getResponseHeaders() { return convertHeaders(method.getResponseHeaders()); } @Override - public void execute() throws AxisFault { - try { - executeMethod(); - handleResponse(); - } catch (IOException e) { - log.info("Unable to send to url[" + url + "]", e); - throw AxisFault.makeFault(e); - } finally { - cleanup(); + public Map<String,String> getCookies() { + Map<String,String> cookies = null; + for (String name : COOKIE_HEADER_NAMES) { + for (org.apache.commons.httpclient.Header header : method.getResponseHeaders(name)) { + for (HeaderElement element : header.getElements()) { + if (cookies == null) { + cookies = new HashMap<String,String>(); + } + cookies.put(element.getName(), element.getValue()); + } + } } + return cookies; + } + + @Override + public InputStream getResponseContent() throws IOException { + return method.getResponseBodyAsStream(); } - private void executeMethod() throws IOException { + @Override + public void execute() throws IOException { populateHostConfiguration(); // add compression headers if needed @@ -178,66 +201,12 @@ final class RequestImpl implements Reque } HttpState httpState = (HttpState) msgContext.getProperty(HTTPConstants.CACHED_HTTP_STATE); - sender.setTimeouts(msgContext, method); - httpClient.executeMethod(config, method, httpState); } - private void handleResponse() throws IOException { - int statusCode = getStatusCode(); - log.trace("Handling response - " + statusCode); - if (statusCode == HttpStatus.SC_ACCEPTED) { - /* When an HTTP 202 Accepted code has been received, this will be the case of an execution - * of an in-only operation. In such a scenario, the HTTP response headers should be returned, - * i.e. session cookies. */ - sender.obtainHTTPHeaderInformation(this, method, msgContext); - // Since we don't expect any content with a 202 response, we must release the connection - method.releaseConnection(); - } else if (statusCode >= 200 && statusCode < 300) { - // Save the HttpMethod so that we can release the connection when cleaning up - msgContext.setProperty(HTTPConstants.HTTP_METHOD, method); - sender.processResponse(this, method, msgContext); - } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR - || statusCode == HttpStatus.SC_BAD_REQUEST) { - // Save the HttpMethod so that we can release the connection when - // cleaning up - msgContext.setProperty(HTTPConstants.HTTP_METHOD, method); - org.apache.commons.httpclient.Header contenttypeHeader = method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE); - String value = null; - if (contenttypeHeader != null) { - value = contenttypeHeader.getValue(); - } - OperationContext opContext = msgContext.getOperationContext(); - if (opContext != null) { - MessageContext inMessageContext = opContext - .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); - if (inMessageContext != null) { - inMessageContext.setProcessingFault(true); - } - } - if (value != null) { - - sender.processResponse(this, method, msgContext); - } - - if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext)) { - throw new AxisFault(Messages.getMessage("transportError", - String.valueOf(statusCode), getStatusText())); - } - } else { - // Since we don't process the response, we must release the - // connection immediately - method.releaseConnection(); - throw new AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode), - getStatusText())); - } - } - - private void cleanup() { - if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) { - log.trace("AutoReleasing " + method); - method.releaseConnection(); - } + @Override + public void releaseConnection() { + method.releaseConnection(); } /** @@ -248,7 +217,7 @@ final class RequestImpl implements Reque * @throws AxisFault * if problems occur */ - protected void populateHostConfiguration() throws AxisFault { + private void populateHostConfiguration() throws AxisFault { int port = url.getPort(); Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPTransportSender.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPTransportSender.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPTransportSender.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/AbstractHTTPTransportSender.java Mon May 1 11:36:09 2017 @@ -356,7 +356,7 @@ public abstract class AbstractHTTPTransp URL url = new URL(toEPR.getAddress()); // select the Message Sender depending on the REST status - AbstractHTTPSender sender = createHTTPSender(); + HTTPSender sender = createHTTPSender(); String httpVersion; if (messageContext.getProperty(HTTPConstants.HTTP_PROTOCOL_VERSION) != null) { @@ -392,7 +392,7 @@ public abstract class AbstractHTTPTransp } } - protected abstract AbstractHTTPSender createHTTPSender(); + protected abstract HTTPSender createHTTPSender(); /** * @param actionString Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java Mon May 1 11:36:09 2017 @@ -20,33 +20,74 @@ package org.apache.axis2.transport.http; +import org.apache.axiom.mime.ContentType; import org.apache.axiom.mime.Header; 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.NamedValue; +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.util.MessageProcessorSelector; +import org.apache.axis2.util.Utils; +import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.HttpStatus; import org.apache.http.protocol.HTTP; import java.io.IOException; +import java.io.InputStream; import java.net.URL; +import java.text.ParseException; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.zip.GZIPInputStream; import javax.xml.namespace.QName; //TODO - It better if we can define these method in a interface move these into AbstractHTTPSender and get rid of this class. -public abstract class HTTPSender extends AbstractHTTPSender { +public abstract class HTTPSender { private static final Log log = LogFactory.getLog(HTTPSender.class); + private boolean chunked = false; + private String httpVersion = HTTPConstants.HEADER_PROTOCOL_11; + protected TransportOutDescription proxyOutSetting = null; + protected OMOutputFormat format = new OMOutputFormat(); + + 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"); + } + } + } + + public void setFormat(OMOutputFormat format) { + this.format = format; + } + /** * Start a new HTTP request. * @@ -146,7 +187,83 @@ public abstract class HTTPSender extends request.enableAuthentication(authenticator); } - request.execute(); + setTimeouts(msgContext, request); + + try { + request.execute(); + boolean cleanup = true; + try { + int statusCode = request.getStatusCode(); + log.trace("Handling response - " + statusCode); + boolean processResponse; + boolean fault; + if (statusCode == HttpStatus.SC_ACCEPTED) { + processResponse = false; + fault = false; + } else if (statusCode >= 200 && statusCode < 300) { + processResponse = true; + fault = false; + } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR + || statusCode == HttpStatus.SC_BAD_REQUEST) { + processResponse = true; + fault = true; + } else { + throw new AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode), + request.getStatusText())); + } + obtainHTTPHeaderInformation(request, msgContext); + if (processResponse) { + OperationContext opContext = msgContext.getOperationContext(); + MessageContext inMessageContext = opContext == null ? null + : opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); + if (opContext != null) { + InputStream in = request.getResponseContent(); + if (in != null) { + String contentEncoding = request.getResponseHeader(HTTPConstants.HEADER_CONTENT_ENCODING); + if (contentEncoding != null) { + if (contentEncoding.equalsIgnoreCase(HTTPConstants.COMPRESSION_GZIP)) { + in = new GZIPInputStream(in); + // If the content-encoding is identity we can basically ignore + // it. + } else if (!"identity".equalsIgnoreCase(contentEncoding)) { + throw new AxisFault("HTTP :" + "unsupported content-encoding of '" + + contentEncoding + "' found"); + } + } + opContext.setProperty(MessageContext.TRANSPORT_IN, in); + // This implements the behavior of the HTTPClient 3.x based transport in + // Axis2 1.7: if AUTO_RELEASE_CONNECTION is enabled, we set the input stream + // in the message context, but we nevertheless release the connection. + // It is unclear in which situation this would actually be the right thing + // to do. + if (msgContext.isPropertyTrue(HTTPConstants.AUTO_RELEASE_CONNECTION)) { + log.debug("AUTO_RELEASE_CONNECTION enabled; are you sure that you really want that?"); + } else { + cleanup = false; + } + } + } + if (fault) { + if (inMessageContext != null) { + inMessageContext.setProcessingFault(true); + } + if (Utils.isClientThreadNonBlockingPropertySet(msgContext)) { + throw new AxisFault(Messages. + getMessage("transportError", + String.valueOf(statusCode), + request.getStatusText())); + } + } + } + } finally { + if (cleanup) { + request.releaseConnection(); + } + } + } catch (IOException e) { + log.info("Unable to send to url[" + url + "]", e); + throw AxisFault.makeFault(e); + } } private void addCustomHeaders(MessageContext msgContext, Request request) { @@ -270,4 +387,100 @@ public abstract class HTTPSender extends return userAgentString; } + + /** + * 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 request + * request + */ + private void setTimeouts(MessageContext msgContext, Request request) { + // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the + // override the static config + Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT); + Integer tempConnTimeoutProperty = (Integer) msgContext + .getProperty(HTTPConstants.CONNECTION_TIMEOUT); + long timeout = msgContext.getOptions().getTimeOutInMilliSeconds(); + + if (tempConnTimeoutProperty != null) { + // timeout for initial connection + request.setConnectionTimeout(tempConnTimeoutProperty); + } + + if (tempSoTimeoutProperty != null) { + // SO_TIMEOUT -- timeout for blocking reads + request.setSocketTimeout(tempSoTimeoutProperty); + } else { + // set timeout in client + if (timeout > 0) { + request.setSocketTimeout((int) timeout); + } + } + } + + private void obtainHTTPHeaderInformation(Request request, 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. + msgContext.setProperty( + MessageContext.TRANSPORT_HEADERS, + new CommonsTransportHeaders(request.getResponseHeaders())); + msgContext.setProperty( + HTTPConstants.MC_HTTP_STATUS_CODE, + new Integer(request.getStatusCode())); + + String contentTypeString = request.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE); + if (contentTypeString != null) { + ContentType contentType; + try { + contentType = new ContentType(contentTypeString); + } catch (ParseException ex) { + throw AxisFault.makeFault(ex); + } + String charSetEnc = contentType.getParameter(HTTPConstants.CHAR_SET_ENCODING); + MessageContext inMessageContext = msgContext.getOperationContext().getMessageContext( + WSDLConstants.MESSAGE_LABEL_IN_VALUE); + if (inMessageContext != null) { + inMessageContext.setProperty(Constants.Configuration.CONTENT_TYPE, contentTypeString); + inMessageContext.setProperty(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc); + } else { + // Transport details will be stored in a HashMap so that anybody + // interested can + // retrieve them + Map<String,String> transportInfoMap = new HashMap<String,String>(); + transportInfoMap.put(Constants.Configuration.CONTENT_TYPE, contentTypeString); + transportInfoMap.put(Constants.Configuration.CHARACTER_SET_ENCODING, charSetEnc); + // the HashMap is stored in the outgoing message. + msgContext.setProperty(Constants.Configuration.TRANSPORT_INFO_MAP, transportInfoMap); + } + } + + Map<String,String> cookies = request.getCookies(); + if (cookies != null) { + String customCookieId = (String) msgContext.getProperty(Constants.CUSTOM_COOKIE_ID); + String cookieString = null; + if (customCookieId != null) { + cookieString = buildCookieString(cookies, customCookieId); + } + if (cookieString == null) { + cookieString = buildCookieString(cookies, Constants.SESSION_COOKIE); + } + if (cookieString == null) { + cookieString = buildCookieString(cookies, Constants.SESSION_COOKIE_JSESSIONID); + } + if (cookieString != null) { + msgContext.getServiceContext().setProperty(HTTPConstants.COOKIE_STRING, cookieString); + } + } + } + + private String buildCookieString(Map<String,String> cookies, String name) { + String value = cookies.get(name); + return value == null ? null : name + "=" + value; + } } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportUtils.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportUtils.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportUtils.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPTransportUtils.java Mon May 1 11:36:09 2017 @@ -54,6 +54,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Iterator; import java.util.Map; import java.util.zip.GZIPInputStream; @@ -382,4 +384,20 @@ public class HTTPTransportUtils { epr.append('/'); return new EndpointReference[]{new EndpointReference(epr.toString())}; } + + static InputStream getMetaInfResourceAsStream(AxisService service, String name) { + ClassLoader classLoader = service.getClassLoader(); + if (classLoader instanceof URLClassLoader) { + // Only search the service class loader and skip searching the ancestors to + // avoid local file inclusion vulnerabilities such as AXIS2-5846. + URL url = ((URLClassLoader)classLoader).findResource("META-INF/" + name); + try { + return url == null ? null : url.openStream(); + } catch (IOException ex) { + return null; + } + } else { + return null; + } + } } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPWorker.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPWorker.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPWorker.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/HTTPWorker.java Mon May 1 11:36:09 2017 @@ -22,7 +22,6 @@ package org.apache.axis2.transport.http; import org.apache.axis2.Constants; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.deployment.DeploymentConstants; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.Parameter; import org.apache.axis2.engine.Handler.InvocationResponse; @@ -100,8 +99,7 @@ public class HTTPWorker implements Worke Iterator i = services.values().iterator(); while (i.hasNext()) { AxisService service = (AxisService) i.next(); - InputStream stream = service.getClassLoader(). - getResourceAsStream("META-INF/" + file); + InputStream stream = HTTPTransportUtils.getMetaInfResourceAsStream(service, file); if (stream != null) { OutputStream out = response.getOutputStream(); response.setContentType("text/xml"); @@ -205,8 +203,7 @@ public class HTTPWorker implements Worke schema.write(response.getOutputStream()); return; } else { - InputStream instream = service.getClassLoader() - .getResourceAsStream(DeploymentConstants.META_INF + "/" + schemaName); + InputStream instream = HTTPTransportUtils.getMetaInfResourceAsStream(service, schemaName); if (instream != null) { response.setStatus(HttpStatus.SC_OK); Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/ListingAgent.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/ListingAgent.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/ListingAgent.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/ListingAgent.java Mon May 1 11:36:09 2017 @@ -125,7 +125,7 @@ public class ListingAgent extends Abstra Iterator<AxisService> i = services.values().iterator(); while (i.hasNext()) { AxisService service = (AxisService) i.next(); - InputStream stream = service.getClassLoader().getResourceAsStream("META-INF/" + schema); + InputStream stream = HTTPTransportUtils.getMetaInfResourceAsStream(service, schema); if (stream != null) { OutputStream out = res.getOutputStream(); res.setContentType("text/xml"); Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/Request.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/Request.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/Request.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/Request.java Mon May 1 11:36:09 2017 @@ -18,8 +18,11 @@ */ package org.apache.axis2.transport.http; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + import org.apache.axiom.mime.Header; -import org.apache.axis2.AxisFault; /** * Interface to prepare and execute an HTTP request. @@ -30,8 +33,14 @@ public interface Request { void addHeader(String name, String value); Header[] getRequestHeaders(); void enableAuthentication(HTTPAuthenticator authenticator); - void execute() throws AxisFault; + void setConnectionTimeout(int timeout); + void setSocketTimeout(int timeout); + void execute() throws IOException; int getStatusCode(); String getStatusText(); + String getResponseHeader(String name); Header[] getResponseHeaders(); + Map<String,String> getCookies(); + InputStream getResponseContent() throws IOException; + void releaseConnection(); } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPClient4TransportSender.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPClient4TransportSender.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPClient4TransportSender.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPClient4TransportSender.java Mon May 1 11:36:09 2017 @@ -26,9 +26,9 @@ import org.apache.axis2.AxisFault; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.OperationContext; -import org.apache.axis2.transport.http.AbstractHTTPSender; import org.apache.axis2.transport.http.AbstractHTTPTransportSender; import org.apache.axis2.transport.http.HTTPConstants; +import org.apache.axis2.transport.http.HTTPSender; import org.apache.axis2.transport.http.HTTPTransportConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -68,7 +68,7 @@ public class HTTPClient4TransportSender @Override - protected AbstractHTTPSender createHTTPSender() { + protected HTTPSender createHTTPSender() { return new HTTPSenderImpl(); } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPProxyConfigurator.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPProxyConfigurator.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPProxyConfigurator.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPProxyConfigurator.java Mon May 1 11:36:09 2017 @@ -33,9 +33,12 @@ import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; import org.apache.http.auth.NTCredentials; import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.params.ClientPNames; -import org.apache.http.conn.params.ConnRoutePNames; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.impl.client.AbstractHttpClient; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; import javax.xml.namespace.QName; import java.net.URL; @@ -58,12 +61,14 @@ public class HTTPProxyConfigurator { * * @param messageContext * in message context for - * @param httpClient - * instance + * @param requestConfig + * the request configuration to fill in + * @param clientContext + * the HTTP client context * @throws org.apache.axis2.AxisFault * if Proxy settings are invalid */ - public static void configure(MessageContext messageContext, AbstractHttpClient httpClient) + public static void configure(MessageContext messageContext, RequestConfig.Builder requestConfig, HttpClientContext clientContext) throws AxisFault { Credentials proxyCredentials = null; @@ -136,17 +141,21 @@ public class HTTPProxyConfigurator { } String port = System.getProperty(HTTPTransportConstants.HTTP_PROXY_PORT); - if (port != null) { + if (port != null && !port.isEmpty()) { proxyPort = Integer.parseInt(port); } if (proxyCredentials != null) { // TODO : Set preemptive authentication, but its not recommended in HC 4 - httpClient.getParams().setParameter(ClientPNames.HANDLE_AUTHENTICATION, true); - - httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, proxyCredentials); + requestConfig.setAuthenticationEnabled(true); + CredentialsProvider credsProvider = clientContext.getCredentialsProvider(); + if (credsProvider == null) { + credsProvider = new BasicCredentialsProvider(); + clientContext.setCredentialsProvider(credsProvider); + } + credsProvider.setCredentials(AuthScope.ANY, proxyCredentials); HttpHost proxy = new HttpHost(proxyHost, proxyPort); - httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); + requestConfig.setProxy(proxy); } } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPSenderImpl.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPSenderImpl.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPSenderImpl.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/HTTPSenderImpl.java Mon May 1 11:36:09 2017 @@ -20,252 +20,47 @@ package org.apache.axis2.transport.http.impl.httpclient4; import org.apache.axis2.AxisFault; -import org.apache.axis2.Constants; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.context.OperationContext; -import org.apache.axis2.i18n.Messages; import org.apache.axis2.transport.http.AxisRequestEntity; -import org.apache.axis2.transport.http.CommonsTransportHeaders; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HTTPSender; import org.apache.axis2.transport.http.Request; -import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.http.Header; -import org.apache.http.HeaderElement; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.client.methods.HttpRequestBase; -import org.apache.http.client.params.AuthPolicy; -import org.apache.http.client.params.ClientPNames; -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.scheme.PlainSocketFactory; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.ssl.SSLSocketFactory; -import org.apache.http.impl.client.AbstractHttpClient; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.PoolingClientConnectionManager; -import org.apache.http.message.BasicHeader; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.CoreConnectionPNames; -import org.apache.http.params.CoreProtocolPNames; -import org.apache.http.params.HttpParams; +import org.apache.http.client.HttpClient; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.HttpClientConnectionManager; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.ssl.SSLContexts; -import java.io.IOException; -import java.io.InputStream; import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.zip.GZIPInputStream; + +import javax.net.ssl.SSLContext; public class HTTPSenderImpl extends HTTPSender { private static final Log log = LogFactory.getLog(HTTPSenderImpl.class); - boolean isChunked() { - return chunked; - } - - String getHttpVersion() { - return httpVersion; - } - @Override protected Request createRequest(MessageContext msgContext, String methodName, URL url, AxisRequestEntity requestEntity) throws AxisFault { - return new RequestImpl(this, msgContext, methodName, url, requestEntity); + return new RequestImpl(getHttpClient(msgContext), msgContext, methodName, url, requestEntity); } - /** - * Collect the HTTP header information and set them in the message context - * - * @param httpResponse which holds the header information - * @param msgContext the MessageContext in which to place the information... OR - * NOT! - * @throws AxisFault if problems occur - */ - protected void obtainHTTPHeaderInformation(Request request, HttpResponse response, 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(request.getResponseHeaders()); - msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, transportHeaders); - msgContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE, - new Integer(request.getStatusCode())); - Header header = response.getFirstHeader(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 = response.getHeaders(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 = response.getHeaders(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; - } - - /** - * 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, AbstractHttpClient 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.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, - connectionTimeout); - } else { - // set timeout in client - if (timeout > 0) { - httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, - (int) timeout); - } - } - - if (tempSoTimeoutProperty != null) { - int soTimeout = tempSoTimeoutProperty.intValue(); - // SO_TIMEOUT -- timeout for blocking reads - httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, soTimeout); - } else { - // set timeout in client - if (timeout > 0) { - httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, (int) timeout); - } - } - } - - /** - * This is used to get the dynamically set time out values from the message - * context. If the values are not available or invalid then the default - * values or the values set by the configuration will be used - * - * @param msgContext the active MessageContext - * @param httpMethod method - */ - protected void setTimeouts(MessageContext msgContext, HttpRequestBase httpMethod) { - // If the SO_TIMEOUT of CONNECTION_TIMEOUT is set by dynamically the - // override the static config - Integer tempSoTimeoutProperty = (Integer) msgContext.getProperty(HTTPConstants.SO_TIMEOUT); - Integer tempConnTimeoutProperty = (Integer) msgContext - .getProperty(HTTPConstants.CONNECTION_TIMEOUT); - long timeout = msgContext.getOptions().getTimeOutInMilliSeconds(); - - if (tempConnTimeoutProperty != null) { - // timeout for initial connection - httpMethod.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, - tempConnTimeoutProperty); - } - - if (tempSoTimeoutProperty != null) { - // SO_TIMEOUT -- timeout for blocking reads - httpMethod.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, - tempSoTimeoutProperty); - } else { - // set timeout in client - if (timeout > 0) { - httpMethod.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, (int) timeout); - } - } - } - - protected AbstractHttpClient getHttpClient(MessageContext msgContext) { + private HttpClient getHttpClient(MessageContext msgContext) { ConfigurationContext configContext = msgContext.getConfigurationContext(); - AbstractHttpClient httpClient = (AbstractHttpClient) msgContext + HttpClient httpClient = (HttpClient) msgContext .getProperty(HTTPConstants.CACHED_HTTP_CLIENT); if (httpClient == null) { - httpClient = (AbstractHttpClient) configContext. + httpClient = (HttpClient) configContext. getProperty(HTTPConstants.CACHED_HTTP_CLIENT); } @@ -274,11 +69,11 @@ public class HTTPSenderImpl extends HTTP } synchronized (this) { - httpClient = (AbstractHttpClient) msgContext. + httpClient = (HttpClient) msgContext. getProperty(HTTPConstants.CACHED_HTTP_CLIENT); if (httpClient == null) { - httpClient = (AbstractHttpClient) configContext + httpClient = (HttpClient) configContext .getProperty(HTTPConstants.CACHED_HTTP_CLIENT); } @@ -286,28 +81,31 @@ public class HTTPSenderImpl extends HTTP return httpClient; } - ClientConnectionManager connManager = (ClientConnectionManager) msgContext + HttpClientConnectionManager connManager = (HttpClientConnectionManager) msgContext .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER); if (connManager == null) { - connManager = (ClientConnectionManager) msgContext + connManager = (HttpClientConnectionManager) msgContext .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER); } if (connManager == null) { // reuse HttpConnectionManager synchronized (configContext) { - connManager = (ClientConnectionManager) configContext + connManager = (HttpClientConnectionManager) configContext .getProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER); if (connManager == null) { log.trace("Making new ConnectionManager"); - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register( - new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); - schemeRegistry.register( - new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); - - connManager = new PoolingClientConnectionManager(schemeRegistry); - ((PoolingClientConnectionManager)connManager).setMaxTotal(200); - ((PoolingClientConnectionManager)connManager).setDefaultMaxPerRoute(200); + SSLContext sslContext = (SSLContext)configContext.getProperty(SSLContext.class.getName()); + if (sslContext == null) { + sslContext = SSLContexts.createDefault(); + } + Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", new SSLConnectionSocketFactory(sslContext)) + .build(); + + connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + ((PoolingHttpClientConnectionManager)connManager).setMaxTotal(200); + ((PoolingHttpClientConnectionManager)connManager).setDefaultMaxPerRoute(200); configContext.setProperty( HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER, connManager); } @@ -317,17 +115,10 @@ public class HTTPSenderImpl extends HTTP * Create a new instance of HttpClient since the way it is used here * it's not fully thread-safe. */ - HttpParams clientParams = new BasicHttpParams(); - clientParams.setParameter(CoreProtocolPNames.HTTP_ELEMENT_CHARSET, "UTF-8"); - httpClient = new DefaultHttpClient(connManager, clientParams); - - //We don't need to set timeout for connection manager, since we are doing it below - // and its enough - - // Get the timeout values set in the runtime - initializeTimeouts(msgContext, httpClient); - - return httpClient; + return HttpClientBuilder.create() + .setConnectionManager(connManager) + .setConnectionManagerShared(true) + .build(); } } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/RequestImpl.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/RequestImpl.java?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/RequestImpl.java (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/http/src/org/apache/axis2/transport/http/impl/httpclient4/RequestImpl.java Mon May 1 11:36:09 2017 @@ -23,62 +23,58 @@ import java.io.InputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.zip.GZIPInputStream; +import java.util.Map; import org.apache.axiom.mime.Header; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.context.OperationContext; -import org.apache.axis2.i18n.Messages; import org.apache.axis2.transport.http.AxisRequestEntity; import org.apache.axis2.transport.http.HTTPAuthenticator; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.axis2.transport.http.HTTPTransportConstants; import org.apache.axis2.transport.http.Request; -import org.apache.axis2.util.Utils; -import org.apache.axis2.wsdl.WSDLConstants; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; import org.apache.http.auth.NTCredentials; import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.auth.params.AuthPNames; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.params.AuthPolicy; -import org.apache.http.client.params.ClientPNames; -import org.apache.http.impl.auth.NTLMSchemeFactory; -import org.apache.http.impl.client.AbstractHttpClient; -import org.apache.http.params.CoreProtocolPNames; -import org.apache.http.params.HttpParams; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.HttpContext; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.util.EntityUtils; final class RequestImpl implements Request { + private static final String[] COOKIE_HEADER_NAMES = { HTTPConstants.HEADER_SET_COOKIE, HTTPConstants.HEADER_SET_COOKIE2 }; + private static final Log log = LogFactory.getLog(RequestImpl.class); - protected final HTTPSenderImpl sender; - protected final MessageContext msgContext; - protected final URL url; - protected final HttpRequestBase method; - protected final AbstractHttpClient httpClient; + private final HttpClient httpClient; + private final MessageContext msgContext; + private final URL url; + private final HttpRequestBase method; private final HttpHost httpHost; + private final RequestConfig.Builder requestConfig = RequestConfig.custom(); + private final HttpClientContext clientContext = HttpClientContext.create(); private HttpResponse response; - RequestImpl(HTTPSenderImpl sender, MessageContext msgContext, final String methodName, URL url, + RequestImpl(HttpClient httpClient, MessageContext msgContext, final String methodName, URL url, AxisRequestEntity requestEntity) throws AxisFault { - this.sender = sender; + this.httpClient = httpClient; this.msgContext = msgContext; this.url = url; - httpClient = sender.getHttpClient(msgContext); if (requestEntity == null) { method = new HttpRequestBase() { @Override @@ -115,8 +111,7 @@ final class RequestImpl implements Reque @Override public void enableHTTP10() { - httpClient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, - HttpVersion.HTTP_1_0); + method.setProtocolVersion(HttpVersion.HTTP_1_0); } @Override @@ -143,6 +138,16 @@ final class RequestImpl implements Reque } @Override + public void setConnectionTimeout(int timeout) { + requestConfig.setConnectTimeout(timeout); + } + + @Override + public void setSocketTimeout(int timeout) { + requestConfig.setSocketTimeout(timeout); + } + + @Override public int getStatusCode() { return response.getStatusLine().getStatusCode(); } @@ -153,22 +158,40 @@ final class RequestImpl implements Reque } @Override + public String getResponseHeader(String name) { + org.apache.http.Header header = response.getFirstHeader(name); + return header == null ? null : header.getValue(); + } + + @Override public Header[] getResponseHeaders() { return convertHeaders(response.getAllHeaders()); } @Override - public void execute() throws AxisFault { - try { - executeMethod(); - handleResponse(); - } catch (IOException e) { - log.info("Unable to send to url[" + url + "]", e); - throw AxisFault.makeFault(e); + public Map<String,String> getCookies() { + Map<String,String> cookies = null; + for (String name : COOKIE_HEADER_NAMES) { + for (org.apache.http.Header header : response.getHeaders(name)) { + for (HeaderElement element : header.getElements()) { + if (cookies == null) { + cookies = new HashMap<String,String>(); + } + cookies.put(element.getName(), element.getValue()); + } + } } + return cookies; + } + + @Override + public InputStream getResponseContent() throws IOException { + HttpEntity entity = response.getEntity(); + return entity == null ? null : entity.getContent(); } - private void executeMethod() throws IOException { + @Override + public void execute() throws IOException { populateHostConfiguration(); // add compression headers if needed @@ -177,89 +200,18 @@ final class RequestImpl implements Reque HTTPConstants.COMPRESSION_GZIP); } - if (msgContext.getProperty(HTTPConstants.HTTP_METHOD_PARAMS) != null) { - HttpParams params = (HttpParams) msgContext - .getProperty(HTTPConstants.HTTP_METHOD_PARAMS); - method.setParams(params); - } - String cookiePolicy = (String) msgContext.getProperty(HTTPConstants.COOKIE_POLICY); if (cookiePolicy != null) { - method.getParams().setParameter(ClientPNames.COOKIE_POLICY, cookiePolicy); + requestConfig.setCookieSpec(cookiePolicy); } - sender.setTimeouts(msgContext, method); - HttpContext localContext = new BasicHttpContext(); - // Why do we have add context here - response = httpClient.execute(httpHost, method, localContext); - } - - private void handleResponse() throws IOException { - boolean cleanup = true; - try { - int statusCode = getStatusCode(); - log.trace("Handling response - " + statusCode); - boolean processResponse; - boolean fault; - if (statusCode == HttpStatus.SC_ACCEPTED) { - processResponse = false; - fault = false; - } else if (statusCode >= 200 && statusCode < 300) { - processResponse = true; - fault = false; - } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR - || statusCode == HttpStatus.SC_BAD_REQUEST) { - processResponse = true; - fault = true; - } else { - throw new AxisFault(Messages.getMessage("transportError", String.valueOf(statusCode), - getStatusText())); - } - sender.obtainHTTPHeaderInformation(this, response, msgContext); - if (processResponse) { - OperationContext opContext = msgContext.getOperationContext(); - MessageContext inMessageContext = opContext == null ? null - : opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE); - if (opContext != null) { - HttpEntity httpEntity = response.getEntity(); - if (httpEntity != null) { - InputStream in = httpEntity.getContent(); - org.apache.http.Header contentEncoding = httpEntity.getContentEncoding(); - 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"); - } - } - opContext.setProperty(MessageContext.TRANSPORT_IN, in); - cleanup = false; - } - } - if (fault) { - if (inMessageContext != null) { - inMessageContext.setProcessingFault(true); - } - if (Utils.isClientThreadNonBlockingPropertySet(msgContext)) { - throw new AxisFault(Messages. - getMessage("transportError", - String.valueOf(statusCode), - getStatusText())); - } - } - } - } finally { - if (cleanup) { - cleanup(response); - } - } + method.setConfig(requestConfig.build()); + response = httpClient.execute(httpHost, method, clientContext); } - private void cleanup(HttpResponse response) { + @Override + public void releaseConnection() { log.trace("Cleaning response : " + response); HttpEntity entity = response.getEntity(); if (entity != null) { @@ -285,7 +237,7 @@ final class RequestImpl implements Reque if (log.isDebugEnabled()) { log.debug("Configuring HTTP proxy."); } - HTTPProxyConfigurator.configure(msgContext, httpClient); + HTTPProxyConfigurator.configure(msgContext, requestConfig, clientContext); } } @@ -296,7 +248,7 @@ final class RequestImpl implements Reque */ @Override public void enableAuthentication(HTTPAuthenticator authenticator) { - method.getParams().setBooleanParameter(ClientPNames.HANDLE_AUTHENTICATION, true); + requestConfig.setAuthenticationEnabled(true); String username = authenticator.getUsername(); String password = authenticator.getPassword(); @@ -310,35 +262,35 @@ final class RequestImpl implements Reque // TODO : Set preemptive authentication, but its not recommended in HC 4 + CredentialsProvider credsProvider = clientContext.getCredentialsProvider(); + if (credsProvider == null) { + credsProvider = new BasicCredentialsProvider(); + clientContext.setCredentialsProvider(credsProvider); + } if (host != null) { if (domain != null) { /* Credentials for NTLM Authentication */ - httpClient.getAuthSchemes().register("ntlm",new NTLMSchemeFactory()); creds = new NTCredentials(username, password, host, domain); } else { /* Credentials for Digest and Basic Authentication */ creds = new UsernamePasswordCredentials(username, password); } - httpClient.getCredentialsProvider(). - setCredentials(new AuthScope(host, port, realm), creds); + credsProvider.setCredentials(new AuthScope(host, port, realm), creds); } else { if (domain != null) { /* * Credentials for NTLM Authentication when host is * ANY_HOST */ - httpClient.getAuthSchemes().register("ntlm",new NTLMSchemeFactory()); creds = new NTCredentials(username, password, AuthScope.ANY_HOST, domain); - httpClient.getCredentialsProvider(). - setCredentials(new AuthScope(AuthScope.ANY_HOST, port, realm), - creds); + credsProvider.setCredentials(new AuthScope(AuthScope.ANY_HOST, port, realm), creds); } else { /* Credentials only for Digest and Basic Authentication */ creds = new UsernamePasswordCredentials(username, password); - httpClient.getCredentialsProvider(). - setCredentials(new AuthScope(AuthScope.ANY), creds); + credsProvider.setCredentials(new AuthScope(AuthScope.ANY), creds); } } + /* Customizing the priority Order */ List schemes = authenticator.getAuthSchemes(); if (schemes != null && schemes.size() > 0) { @@ -352,7 +304,7 @@ final class RequestImpl implements Reque authPrefs.add(authenticator.getAuthPolicyPref(scheme)); } - httpClient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, authPrefs); + requestConfig.setTargetPreferredAuthSchemes(authPrefs); } } } Modified: axis/axis2/java/core/branches/hermetic-tests/modules/transport/jms/src/main/java/org/apache/axis2/transport/jms/package.html URL: http://svn.apache.org/viewvc/axis/axis2/java/core/branches/hermetic-tests/modules/transport/jms/src/main/java/org/apache/axis2/transport/jms/package.html?rev=1793311&r1=1793310&r2=1793311&view=diff ============================================================================== --- axis/axis2/java/core/branches/hermetic-tests/modules/transport/jms/src/main/java/org/apache/axis2/transport/jms/package.html (original) +++ axis/axis2/java/core/branches/hermetic-tests/modules/transport/jms/src/main/java/org/apache/axis2/transport/jms/package.html Mon May 1 11:36:09 2017 @@ -2,6 +2,8 @@ <title>JMS Transport Configuration</title> <body> +Transport implementation for JMS. + <h2>JMS Listener Configuration (axis2.xml)</h2> e.g:
