1 10 11 package org.mule.providers.http.transformers; 12 13 import org.apache.commons.httpclient.Header; 14 import org.apache.commons.httpclient.HttpVersion; 15 import org.apache.commons.lang.StringUtils; 16 import org.mule.MuleManager; 17 import org.mule.config.MuleProperties; 18 import org.mule.providers.NullPayload; 19 import org.mule.providers.http.HttpConnector; 20 import org.mule.providers.http.HttpConstants; 21 import org.mule.providers.http.HttpResponse; 22 import org.mule.transformers.AbstractEventAwareTransformer; 23 import org.mule.transformers.simple.SerializableToByteArray; 24 import org.mule.umo.UMOEventContext; 25 import org.mule.umo.UMOMessage; 26 import org.mule.umo.transformer.TransformerException; 27 28 import java.io.ByteArrayInputStream ; 29 import java.io.IOException ; 30 import java.io.InputStream ; 31 import java.text.SimpleDateFormat ; 32 import java.util.Collection ; 33 import java.util.Date ; 34 import java.util.Iterator ; 35 import java.util.Locale ; 36 import java.util.Map ; 37 38 45 46 public class UMOMessageToHttpResponse extends AbstractEventAwareTransformer 47 { 48 51 private static final long serialVersionUID = 9137870668198309755L; 52 53 public static final String CUSTOM_HEADER_PREFIX = ""; 54 55 private SimpleDateFormat format = null; 56 private String server = null; 57 private SerializableToByteArray serializableToByteArray; 58 59 public UMOMessageToHttpResponse() 60 { 61 registerSourceType(Object .class); 62 setReturnClass(Object .class); 63 64 format = new SimpleDateFormat (HttpConstants.DATE_FORMAT, Locale.US); 65 66 if (MuleManager.getConfiguration().getProductName() == null) 69 { 70 server = "Mule/SNAPSHOT"; 71 } 72 else 73 { 74 server = MuleManager.getConfiguration().getProductName() + "/" 75 + MuleManager.getConfiguration().getProductVersion(); 76 } 77 serializableToByteArray = new SerializableToByteArray(); 78 } 79 80 public Object transform(Object src, String encoding, UMOEventContext context) throws TransformerException 81 { 82 if (context.getMessage().getExceptionPayload() != null) 84 { 85 } 87 88 if (src instanceof NullPayload) 92 { 93 src = StringUtils.EMPTY; 94 } 95 96 try 97 { 98 HttpResponse response = null; 99 if (src instanceof HttpResponse) 100 { 101 response = (HttpResponse)src; 102 } 103 else 104 { 105 response = createResponse(src, encoding, context); 106 } 107 108 if (!response.containsHeader(HttpConstants.HEADER_CONTENT_TYPE)) 110 { 111 response.addHeader(new Header(HttpConstants.HEADER_CONTENT_TYPE, 112 HttpConstants.DEFAULT_CONTENT_TYPE)); 113 } 114 115 if (!response.containsHeader(HttpConstants.HEADER_CONTENT_LENGTH) 117 && !response.containsHeader(HttpConstants.HEADER_TRANSFER_ENCODING)) 118 { 119 InputStream content = response.getBody(); 120 if (content != null) 121 { 122 long len = response.getContentLength(); 123 if (len < 0) 124 { 125 if (response.getHttpVersion().lessEquals(HttpVersion.HTTP_1_0)) 126 { 127 throw new IOException ("Chunked encoding not supported for HTTP version " 128 + response.getHttpVersion()); 129 } 130 Header header = new Header(HttpConstants.HEADER_TRANSFER_ENCODING, "chunked"); 131 response.addHeader(header); 132 } 133 else 134 { 135 Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, Long.toString(len)); 136 response.setHeader(header); 137 } 138 } 139 else 140 { 141 Header header = new Header(HttpConstants.HEADER_CONTENT_LENGTH, "0"); 142 response.addHeader(header); 143 } 144 } 145 146 UMOMessage msg = context.getMessage(); 147 148 if (!response.containsHeader(HttpConstants.HEADER_CONNECTION)) 149 { 150 String connHeader = msg.getStringProperty(HttpConstants.HEADER_CONNECTION, null); 152 if (connHeader != null) 153 { 154 if (connHeader.equalsIgnoreCase("keep-alive")) 155 { 156 Header header = new Header(HttpConstants.HEADER_CONNECTION, "keep-alive"); 157 response.addHeader(header); 158 response.setKeepAlive(true); 159 } 160 if (connHeader.equalsIgnoreCase("close")) 161 { 162 Header header = new Header(HttpConstants.HEADER_CONNECTION, "close"); 163 response.addHeader(header); 164 response.setKeepAlive(false); 165 } 166 } 167 else 168 { 169 if (response.getHttpVersion().greaterEquals(HttpVersion.HTTP_1_1)) 171 { 172 response.setKeepAlive(true); 173 } 174 else 175 { 176 response.setKeepAlive(false); 177 } 178 } 179 } 180 if ("HEAD".equalsIgnoreCase(msg.getStringProperty(HttpConnector.HTTP_METHOD_PROPERTY, null))) 181 { 182 response.setBody(null); 184 } 185 return response; 186 } 187 catch (IOException e) 188 { 189 throw new TransformerException(this, e); 190 } 191 192 } 193 194 protected HttpResponse createResponse(Object src, String encoding, UMOEventContext context) 195 throws IOException , TransformerException 196 { 197 HttpResponse response = new HttpResponse(); 198 UMOMessage msg = context.getMessage(); 199 200 int status = msg.getIntProperty(HttpConnector.HTTP_STATUS_PROPERTY, HttpConstants.SC_OK); 201 String version = msg.getStringProperty(HttpConnector.HTTP_VERSION_PROPERTY, HttpConstants.HTTP11); 202 String date = format.format(new Date ()); 203 String contentType = msg.getStringProperty(HttpConstants.HEADER_CONTENT_TYPE, 204 HttpConstants.DEFAULT_CONTENT_TYPE); 205 206 response.setStatusLine(HttpVersion.parse(version), status); 207 response.setHeader(new Header(HttpConstants.HEADER_CONTENT_TYPE, contentType)); 208 response.setHeader(new Header(HttpConstants.HEADER_DATE, date)); 209 response.setHeader(new Header(HttpConstants.HEADER_SERVER, server)); 210 if (msg.getProperty(HttpConstants.HEADER_EXPIRES) == null) 211 { 212 response.setHeader(new Header(HttpConstants.HEADER_EXPIRES, date)); 213 } 214 response.setFallbackCharset(encoding); 215 216 Collection headerNames = HttpConstants.RESPONSE_HEADER_NAMES.values(); 217 String headerName, value; 218 for (Iterator iterator = headerNames.iterator(); iterator.hasNext();) 219 { 220 headerName = (String )iterator.next(); 221 value = msg.getStringProperty(headerName, null); 222 if (value != null) 223 { 224 response.setHeader(new Header(headerName, value)); 225 } 226 } 227 228 Map customHeaders = (Map )msg.getProperty(HttpConnector.HTTP_CUSTOM_HEADERS_MAP_PROPERTY); 230 if (customHeaders != null) 231 { 232 Map.Entry entry; 233 for (Iterator iterator = customHeaders.entrySet().iterator(); iterator.hasNext();) 234 { 235 entry = (Map.Entry )iterator.next(); 236 if (entry.getValue() != null) 237 { 238 response.setHeader(new Header(entry.getKey().toString(), entry.getValue().toString())); 239 } 240 } 241 } 242 243 String user = msg.getStringProperty(MuleProperties.MULE_USER_PROPERTY, null); 245 if (user != null) 246 { 247 response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_USER_PROPERTY, user)); 248 } 249 if (msg.getCorrelationId() != null) 250 { 251 response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_CORRELATION_ID_PROPERTY, 252 msg.getCorrelationId())); 253 response.setHeader(new Header(CUSTOM_HEADER_PREFIX 254 + MuleProperties.MULE_CORRELATION_GROUP_SIZE_PROPERTY, 255 String.valueOf(msg.getCorrelationGroupSize()))); 256 response.setHeader(new Header(CUSTOM_HEADER_PREFIX 257 + MuleProperties.MULE_CORRELATION_SEQUENCE_PROPERTY, 258 String.valueOf(msg.getCorrelationSequence()))); 259 } 260 if (msg.getReplyTo() != null) 261 { 262 response.setHeader(new Header(CUSTOM_HEADER_PREFIX + MuleProperties.MULE_REPLY_TO_PROPERTY, 263 msg.getReplyTo().toString())); 264 } 265 if (src instanceof InputStream ) 266 { 267 response.setBody((InputStream )src); 268 } 269 else if (src instanceof String ) 270 { 271 response.setBodyString(src.toString()); 272 } 273 else 274 { 275 response.setBody(new ByteArrayInputStream ((byte[])serializableToByteArray.doTransform(src, 276 encoding))); 277 } 278 return response; 279 } 280 281 public boolean isAcceptNull() 282 { 283 return true; 284 } 285 } 286 | Popular Tags |