1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.http.transformers;
12
13 import org.mule.RequestContext;
14 import org.mule.api.transformer.TransformerException;
15 import org.mule.api.transport.OutputHandler;
16 import org.mule.transformer.AbstractTransformer;
17 import org.mule.transformer.types.DataTypeFactory;
18 import org.mule.transport.http.HttpConstants;
19 import org.mule.transport.http.HttpResponse;
20 import org.mule.transport.http.ResponseWriter;
21
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.io.UnsupportedEncodingException;
25 import java.util.Iterator;
26
27 import org.apache.commons.httpclient.ChunkedOutputStream;
28 import org.apache.commons.httpclient.Header;
29 import org.apache.commons.io.output.ByteArrayOutputStream;
30
31
32
33
34
35 public class HttpResponseToString extends AbstractTransformer
36 {
37
38 public HttpResponseToString()
39 {
40 registerSourceType(DataTypeFactory.create(HttpResponse.class));
41 setReturnDataType(DataTypeFactory.STRING);
42 }
43
44
45
46
47 @Override
48 protected Object doTransform(Object src, String encoding) throws TransformerException
49 {
50 try
51 {
52 HttpResponse response = (HttpResponse)src;
53 ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
54 OutputStream outstream = bos;
55 ResponseWriter writer = new ResponseWriter(outstream, encoding);
56 writer.println(response.getStatusLine());
57 Iterator item = response.getHeaderIterator();
58 while (item.hasNext())
59 {
60 Header header = (Header)item.next();
61 writer.print(header.toExternalForm());
62 }
63 writer.println();
64 writer.flush();
65
66 if (response.hasBody())
67 {
68 OutputHandler handler = response.getBody();
69 Header transferenc = response.getFirstHeader(HttpConstants.HEADER_TRANSFER_ENCODING);
70 if (transferenc != null)
71 {
72 response.removeHeaders(HttpConstants.HEADER_CONTENT_LENGTH);
73 if (transferenc.getValue().indexOf(HttpConstants.TRANSFER_ENCODING_CHUNKED) != -1)
74 {
75 outstream = new ChunkedOutputStream(outstream);
76 }
77 }
78
79 handler.write(RequestContext.getEvent(), outstream);
80
81 if (outstream instanceof ChunkedOutputStream)
82 {
83 ((ChunkedOutputStream)outstream).finish();
84 }
85 }
86
87 outstream.flush();
88 bos.flush();
89 byte[] result = bos.toByteArray();
90 outstream.close();
91 writer.close();
92 bos.close();
93
94 String output = null;
95 try
96 {
97 output = new String(result, encoding);
98 }
99 catch (UnsupportedEncodingException uee)
100 {
101
102
103
104 output = new String(result);
105 }
106
107 return output;
108 }
109 catch (IOException e)
110 {
111 throw new TransformerException(this, e);
112 }
113 }
114 }