blob: 2fa598441913a5e466652a07b4f62c4defdd7608 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.synapse.transport.passthru.util;
import org.apache.axiom.om.OMOutputFormat;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.SOAPMessageFormatter;
import org.apache.axis2.util.MessageProcessorSelector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpVersion;
import org.apache.http.protocol.HTTP;
import org.apache.synapse.transport.nhttp.NhttpConstants;
import org.apache.synapse.transport.passthru.PassThroughConstants;
import org.apache.synapse.transport.passthru.TargetRequest;
import org.apache.synapse.transport.passthru.config.TargetConfiguration;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
public class TargetRequestFactory {
private static final Log log = LogFactory.getLog(TargetRequestFactory.class);
public static TargetRequest create(MessageContext msgContext,
TargetConfiguration configuration) throws AxisFault {
try {
String httpMethod = (String) msgContext.getProperty(
Constants.Configuration.HTTP_METHOD);
if (httpMethod == null) {
httpMethod = "POST";
}
// basic request
Boolean noEntityBody = (Boolean) msgContext.getProperty(
PassThroughConstants.NO_ENTITY_BODY);
if (msgContext.getEnvelope().getBody().getFirstElement() != null){
noEntityBody = false;
}
EndpointReference epr = PassThroughTransportUtils.getDestinationEPR(msgContext);
URL url = new URL(epr.getAddress());
TargetRequest request = new TargetRequest(configuration, url, httpMethod,
noEntityBody == null || !noEntityBody);
// headers
PassThroughTransportUtils.removeUnwantedHeaders(msgContext,
configuration.isPreserveServerHeader(),
configuration.isPreserveUserAgentHeader());
Object o = msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
if (o != null && o instanceof Map) {
Map headers = (Map) o;
for (Object entryObj : headers.entrySet()) {
Map.Entry entry = (Map.Entry) entryObj;
if (entry.getValue() != null && entry.getKey() instanceof String &&
entry.getValue() instanceof String) {
if (!HTTPConstants.HEADER_HOST.equalsIgnoreCase((String) entry.getKey())) {
request.addHeader((String) entry.getKey(), (String) entry.getValue());
} else {
if (msgContext.getProperty(NhttpConstants.REQUEST_HOST_HEADER) != null) {
request.addHeader((String) entry.getKey(),
(String) msgContext.getProperty(
NhttpConstants.REQUEST_HOST_HEADER));
}
}
}
}
}
String cType = getContentType(msgContext);
if (cType != null) {
request.addHeader(HTTP.CONTENT_TYPE, cType);
}
// version
String forceHttp10 = (String) msgContext.getProperty(
PassThroughConstants.FORCE_HTTP_1_0);
if ("true".equals(forceHttp10)) {
request.setVersion(HttpVersion.HTTP_1_0);
}
// keep alive
String noKeepAlie = (String) msgContext.getProperty(PassThroughConstants.NO_KEEPALIVE);
if ("true".equals(noKeepAlie)) {
request.setKeepAlive(false);
}
// port
int port = url.getPort();
request.setPort(port != -1 ? port : 80);
// chunk
String disableChunking = (String) msgContext.getProperty(
PassThroughConstants.DISABLE_CHUNKING);
if ("true".equals(disableChunking)) {
request.setChunk(false);
}
// full url
String fullUrl = (String) msgContext.getProperty(PassThroughConstants.FULL_URI);
if ("true".equals(fullUrl)) {
request.setFullUrl(true);
}
// Add excess respsonse header.
String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
Map excessHeaders = (Map) msgContext.getProperty(excessProp);
if (excessHeaders != null) {
for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
request.addHeader(key, (String) excessVal);
}
}
}
return request;
} catch (MalformedURLException e) {
handleException("Invalid to address" + msgContext.getTo().getAddress(), e);
}
return null;
}
private static String getContentType(MessageContext msgCtx) throws AxisFault {
MessageFormatter formatter = MessageProcessorSelector.getMessageFormatter(msgCtx);
OMOutputFormat format = PassThroughTransportUtils.getOMOutputFormat(msgCtx);
if (formatter != null) {
String contentType= formatter.getContentType(msgCtx, format, msgCtx.getSoapAction());
//keep the formatter information to prevent multipart boundary override
// (this will be the content writing to header)
msgCtx.setProperty(PassThroughConstants.MESSAGE_OUTPUT_FORMAT, format);
return contentType;
} else {
String contentType = (String) msgCtx.getProperty(Constants.Configuration.CONTENT_TYPE);
if (contentType != null) {
return contentType;
} else {
return new SOAPMessageFormatter().getContentType(
msgCtx, format, msgCtx.getSoapAction());
}
}
}
/**
* Throws an AxisFault if an error occurs at this level
* @param s a message describing the error
* @param e original exception leads to the error condition
* @throws org.apache.axis2.AxisFault wrapping the original exception
*/
private static void handleException(String s, Exception e) throws AxisFault {
log.error(s, e);
throw new AxisFault(s, e);
}
}