in modules/transport/http/src/org/apache/axis2/transport/http/HTTPSender.java [107:268]
protected abstract Request createRequest(MessageContext msgContext, String methodName, URL url,
AxisRequestEntity requestEntity) throws AxisFault;
public void send(MessageContext msgContext, URL url, String soapActionString)
throws IOException {
// execute the HtttpMethodBase - a connection manager can be given for
// handle multiple
String httpMethod =
(String) msgContext.getProperty(Constants.Configuration.HTTP_METHOD);
if (httpMethod == null) {
httpMethod = Constants.Configuration.HTTP_METHOD_POST;
}
MessageFormatter messageFormatter = MessageProcessorSelector
.getMessageFormatter(msgContext);
url = messageFormatter.getTargetAddress(msgContext, format, url);
String contentType = messageFormatter.getContentType(msgContext, format, soapActionString);
HTTPAuthenticator authenticator;
Object obj = msgContext.getProperty(HTTPConstants.AUTHENTICATE);
if (obj == null) {
authenticator = null;
} else {
if (obj instanceof HTTPAuthenticator) {
authenticator = (HTTPAuthenticator) obj;
} else {
throw new AxisFault("HttpTransportProperties.Authenticator class cast exception");
}
}
AxisRequestEntity requestEntity;
boolean gzip;
if (Constants.Configuration.HTTP_METHOD_GET.equalsIgnoreCase(httpMethod)
|| Constants.Configuration.HTTP_METHOD_DELETE.equalsIgnoreCase(httpMethod)) {
requestEntity = null;
gzip = false;
} else if (Constants.Configuration.HTTP_METHOD_POST.equalsIgnoreCase(httpMethod)
|| Constants.Configuration.HTTP_METHOD_PUT.equalsIgnoreCase(httpMethod)) {
gzip = msgContext.isPropertyTrue(HTTPConstants.MC_GZIP_REQUEST);
requestEntity = new AxisRequestEntity(messageFormatter, msgContext, format,
contentType, chunked, gzip, authenticator != null && authenticator.isAllowedRetry());
} else {
throw new AxisFault("Unsupported HTTP method " + httpMethod);
}
Request request = createRequest(msgContext, httpMethod, url, requestEntity);
if (msgContext.getOptions() != null && msgContext.getOptions().isManageSession()) {
// setting the cookie in the out path
Object cookieString = msgContext.getProperty(HTTPConstants.COOKIE_STRING);
if (cookieString != null) {
StringBuffer buffer = new StringBuffer();
buffer.append(cookieString);
request.setHeader(HTTPConstants.HEADER_COOKIE, buffer.toString());
}
}
if (httpVersion.equals(HTTPConstants.HEADER_PROTOCOL_10)) {
request.enableHTTP10();
}
request.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, contentType);
String soapAction = messageFormatter.formatSOAPAction(msgContext, format, soapActionString);
if (soapAction != null && !msgContext.isDoingREST()) {
request.setHeader(HTTPConstants.HEADER_SOAP_ACTION, soapAction);
}
if (gzip) {
request.setHeader(HTTPConstants.HEADER_CONTENT_ENCODING,
HTTPConstants.COMPRESSION_GZIP);
}
// set the custom headers, if available
addCustomHeaders(msgContext, request);
if (authenticator != null) {
request.enableAuthentication(authenticator);
}
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 || statusCode == HttpStatus.SC_NOT_FOUND) {
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);
}
}