1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.mock;
14
15 import com.eviware.soapui.impl.wsdl.WsdlOperation;
16 import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.MockRequestDataSource;
17 import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.MultipartMessageSupport;
18 import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils;
19 import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
20 import com.eviware.soapui.impl.wsdl.support.wss.IncomingWss;
21 import com.eviware.soapui.model.iface.Attachment;
22 import com.eviware.soapui.model.mock.MockRequest;
23 import com.eviware.soapui.settings.WsdlSettings;
24 import com.eviware.soapui.support.StringUtils;
25 import com.eviware.soapui.support.Tools;
26 import com.eviware.soapui.support.types.StringToStringMap;
27 import com.eviware.soapui.support.xml.XmlUtils;
28 import org.apache.xmlbeans.XmlException;
29 import org.apache.xmlbeans.XmlObject;
30 import org.w3c.dom.Document;
31
32 import javax.mail.MessagingException;
33 import javax.servlet.http.HttpServletRequest;
34 import javax.servlet.http.HttpServletResponse;
35 import java.io.ByteArrayOutputStream;
36 import java.io.StringWriter;
37 import java.util.Enumeration;
38 import java.util.Vector;
39
40 /***
41 * Request-class created when receiving an external request to a WsdlMockService
42 *
43 * @author ole.matzura
44 */
45
46 public class WsdlMockRequest implements MockRequest
47 {
48 private StringToStringMap requestHeaders;
49 private String requestContent;
50 private MultipartMessageSupport mmSupport;
51 private XmlObject requestXmlObject;
52 private SoapVersion soapVersion;
53 private final HttpServletResponse response;
54 private String protocol;
55 private String path;
56 private String soapAction;
57 private final WsdlMockRunContext context;
58 private final WsdlMockRunContext requestContext;
59 private final HttpServletRequest request;
60 private Vector<Object> wssResult;
61 private MockRequestDataSource mockRequestDataSource;
62 private String actualRequestContent;
63 private boolean responseMessage;
64
65 public WsdlMockRequest( HttpServletRequest request, HttpServletResponse response, WsdlMockRunContext context ) throws Exception
66 {
67 this.request = request;
68 this.response = response;
69 this.context = context;
70
71 requestContext = new WsdlMockRunContext( context.getMockService(), null );
72
73 requestHeaders = new StringToStringMap();
74 for( Enumeration<?> e = request.getHeaderNames(); e.hasMoreElements(); )
75 {
76 String header = ( String ) e.nextElement();
77 requestHeaders.put( header, request.getHeader( header ) );
78 }
79
80 protocol = request.getProtocol();
81 path = request.getPathInfo();
82
83 if( request.getMethod().equals( "POST" ))
84 {
85 initPostRequest( request, context );
86 }
87 }
88
89 protected void initPostRequest( HttpServletRequest request, WsdlMockRunContext context )
90 throws Exception
91 {
92 String contentType = request.getContentType();
93
94 if( contentType != null && contentType.toUpperCase().startsWith( "MULTIPART" ))
95 {
96 readMultipartRequest( request );
97 contentType = mmSupport.getRootPart().getContentType();
98 }
99 else
100 {
101 this.requestContent = readRequestContent( request );
102
103 if( StringUtils.hasContent( context.getMockService().getIncomingWss() ))
104 {
105 IncomingWss incoming = context.getMockService().getProject().getWssContainer().getIncomingWssByName( context.getMockService().getIncomingWss() );
106 if( incoming != null )
107 {
108 Document dom = XmlUtils.parseXml( requestContent );
109 try
110 {
111 wssResult = incoming.processIncoming( dom, context );
112 if( wssResult != null && wssResult.size() > 0 )
113 {
114 StringWriter writer = new StringWriter();
115 XmlUtils.serialize( dom, writer );
116 actualRequestContent = requestContent;
117 requestContent = writer.toString();
118 }
119 }
120 catch( Exception e )
121 {
122 if( wssResult == null )
123 wssResult = new Vector<Object>();
124 wssResult.add( e );
125 }
126 }
127 }
128 }
129
130 soapVersion = SoapUtils.deduceSoapVersion( contentType, getRequestXmlObject() );
131 if( soapVersion == null )
132 soapVersion = SoapVersion.Soap11;
133
134 soapAction = SoapUtils.getSoapAction( soapVersion, requestHeaders );
135 }
136
137 public SoapVersion getSoapVersion()
138 {
139 return soapVersion;
140 }
141
142 public String getProtocol()
143 {
144 return protocol;
145 }
146
147 public Vector<?> getWssResult()
148 {
149 return wssResult;
150 }
151
152 private void readMultipartRequest( HttpServletRequest request ) throws MessagingException
153 {
154 StringToStringMap values = StringToStringMap.fromHttpHeader( request.getContentType() );
155 mockRequestDataSource = new MockRequestDataSource( request );
156 mmSupport = new MultipartMessageSupport( mockRequestDataSource, values.get( "start" ), null, true,
157 requestContext.getMockService().getSettings().getBoolean( WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES ));
158 }
159
160 private String readRequestContent( HttpServletRequest request ) throws Exception
161 {
162 String responseContent = null;
163 String encoding = request.getCharacterEncoding();
164 if( encoding != null)
165 encoding = StringUtils.unquote( encoding );
166
167
168 ByteArrayOutputStream out = Tools.readAll( request.getInputStream(), Tools.READ_ALL );
169 byte [] data = out.toByteArray();
170 int contentOffset = 0;
171
172 String contentType = request.getContentType();
173 if( contentType != null && data.length > 0 )
174 {
175 if( contentType.toLowerCase().endsWith("xml"))
176 {
177 if( data.length > 3 && data[0] == (byte)239 && data[1] == (byte)187 && data[2] == (byte)191 )
178 {
179 encoding = "UTF-8";
180 contentOffset = 3;
181 }
182 }
183
184 encoding = StringUtils.unquote( encoding );
185
186 responseContent = encoding == null ? new String(data) :
187 new String( data, contentOffset, (int)(data.length-contentOffset), encoding );
188 }
189
190 if( encoding == null )
191 encoding = "UTF-8";
192
193 if( responseContent == null )
194 {
195 responseContent = new String( data, encoding );
196 }
197
198 return responseContent;
199 }
200
201 public Attachment[] getRequestAttachments()
202 {
203 return mmSupport == null ? new Attachment[0] : mmSupport.getAttachments();
204 }
205
206 public String getRequestContent()
207 {
208 return mmSupport == null ? requestContent : mmSupport.getContentAsString();
209 }
210
211 public StringToStringMap getRequestHeaders()
212 {
213 return requestHeaders;
214 }
215
216 public void setRequestContent( String requestContent )
217 {
218 this.requestContent = requestContent;
219 }
220
221 public XmlObject getRequestXmlObject() throws XmlException
222 {
223 if( requestXmlObject == null )
224 requestXmlObject = XmlObject.Factory.parse( getRequestContent() );
225
226 return requestXmlObject;
227 }
228
229 public HttpServletResponse getHttpResponse()
230 {
231 return response;
232 }
233
234 public HttpServletRequest getHttpRequest()
235 {
236 return request;
237 }
238
239 public XmlObject getContentElement() throws XmlException
240 {
241 return SoapUtils.getContentElement( getRequestXmlObject(), soapVersion );
242 }
243
244 public String getPath()
245 {
246 return path;
247 }
248
249 public WsdlMockRunContext getContext()
250 {
251 return context;
252 }
253
254 public void setOperation( WsdlOperation operation )
255 {
256 if( mmSupport != null )
257 mmSupport.setOperation( operation );
258 }
259
260 public WsdlMockRunContext getRequestContext()
261 {
262 return requestContext;
263 }
264
265 public String getSoapAction()
266 {
267 return soapAction;
268 }
269
270 public byte [] getRawRequestData()
271 {
272 return mockRequestDataSource == null ?
273 actualRequestContent == null ? requestContent.getBytes() : actualRequestContent.getBytes()
274 : mockRequestDataSource.getData();
275 }
276
277 public void setResponseMessage( boolean responseMessage )
278 {
279 this.responseMessage = responseMessage;
280 }
281
282 public boolean isResponseMessage()
283 {
284 return responseMessage;
285 }
286 }