1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.monitor;
14
15 import com.eviware.soapui.SoapUI;
16 import com.eviware.soapui.impl.wsdl.WsdlOperation;
17 import com.eviware.soapui.impl.wsdl.WsdlProject;
18 import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.MultipartMessageSupport;
19 import com.eviware.soapui.impl.wsdl.submit.transports.http.support.methods.ExtendedPostMethod;
20 import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils;
21 import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion;
22 import com.eviware.soapui.impl.wsdl.support.wss.IncomingWss;
23 import com.eviware.soapui.model.iface.Attachment;
24 import com.eviware.soapui.model.iface.Interface;
25 import com.eviware.soapui.model.iface.Operation;
26 import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext;
27 import com.eviware.soapui.settings.WsdlSettings;
28 import com.eviware.soapui.support.Tools;
29 import com.eviware.soapui.support.types.StringToStringMap;
30 import com.eviware.soapui.support.xml.XmlUtils;
31
32 import org.apache.commons.httpclient.Header;
33 import org.apache.xmlbeans.XmlObject;
34 import org.w3c.dom.Document;
35
36 import javax.servlet.http.HttpServletRequest;
37 import java.io.ByteArrayInputStream;
38 import java.io.IOException;
39 import java.io.StringWriter;
40 import java.net.MalformedURLException;
41 import java.net.URL;
42 import java.util.ArrayList;
43 import java.util.Enumeration;
44 import java.util.List;
45 import java.util.Vector;
46
47 public class JProxyServletWsdlMonitorMessageExchange extends WsdlMonitorMessageExchange
48 {
49
50 private WsdlOperation operation;
51 private WsdlProject project;
52 private String requestContent;
53 private StringToStringMap requestHeaders;
54 private String responseContent;
55 private StringToStringMap responseHeaders;
56 private MultipartMessageSupport requestMmSupport;
57 private boolean discarded;
58 private long timestampStart;
59 private byte[] request;
60 private byte[] response;
61 private String requestHost;
62 private URL targetURL;
63 private String requestContentType;
64 private Vector<Object> requestWssResult;
65 private SoapVersion soapVersion;
66 private String responseContentType;
67 private MultipartMessageSupport responseMmSupport;
68 private Vector<Object> responseWssResult;
69 private long timestampEnd;
70 private boolean capture;
71 private byte[] requestRaw = null;
72 private byte[] responseRaw = null;
73
74 public JProxyServletWsdlMonitorMessageExchange(WsdlProject project)
75 {
76 super(null);
77 responseHeaders = new StringToStringMap();
78 requestHeaders = new StringToStringMap();
79 timestampStart = System.currentTimeMillis();
80 this.project = project;
81 capture = true;
82 }
83
84 @Override
85 public void discard()
86 {
87 operation = null;
88 project = null;
89
90 requestContent = null;
91 requestHeaders = null;
92
93 responseContent = null;
94 responseHeaders = null;
95
96 requestMmSupport = null;
97
98 response = null;
99 request = null;
100 capture = false;
101
102 discarded = true;
103 }
104
105 @Override
106 public long getRequestContentLength()
107 {
108 return request == null ? -1 : request.length;
109 }
110
111 @Override
112 public String getRequestHost()
113 {
114 return requestHost;
115 }
116
117 @Override
118 public long getResponseContentLength()
119 {
120 return response == null ? -1 : response.length;
121 }
122
123 @Override
124 public URL getTargetUrl()
125 {
126 return this.targetURL;
127 }
128
129 @Override
130 public void prepare(IncomingWss incomingRequestWss, IncomingWss incomingResponseWss)
131 {
132
133 parseRequestData(incomingRequestWss);
134 parseReponseData(incomingResponseWss);
135
136 }
137
138 private void parseReponseData(IncomingWss incomingResponseWss)
139 {
140
141 ByteArrayInputStream in = new ByteArrayInputStream(response == null ? new byte[0] : response);
142 try
143 {
144
145 responseContentType = responseHeaders.get("Content-Type");
146 if (responseContentType != null && responseContentType.toUpperCase().startsWith("MULTIPART"))
147 {
148 StringToStringMap values = StringToStringMap.fromHttpHeader(responseContentType);
149 responseMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource("monitor response",
150 in, responseContentType), values.get("start"), null, true, SoapUI.getSettings().getBoolean(
151 WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
152 responseContentType = responseMmSupport.getRootPart().getContentType();
153 }
154 else
155 {
156 this.responseContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
157 }
158
159 processResponseWss(incomingResponseWss);
160 }
161 catch (Exception e)
162 {
163 try
164 {
165 in.close();
166 }
167 catch (IOException e1)
168 {
169 e1.printStackTrace();
170 }
171 }
172
173 }
174
175 private void processResponseWss(IncomingWss incomingResponseWss) throws IOException
176 {
177
178 if (incomingResponseWss != null)
179 {
180 Document dom = XmlUtils.parseXml(responseContent);
181 try
182 {
183 responseWssResult = incomingResponseWss.processIncoming(dom, new DefaultPropertyExpansionContext(project));
184 if (responseWssResult != null && responseWssResult.size() > 0)
185 {
186 StringWriter writer = new StringWriter();
187 XmlUtils.serialize(dom, writer);
188 responseContent = writer.toString();
189 }
190 }
191 catch (Exception e)
192 {
193 if (responseWssResult == null)
194 responseWssResult = new Vector<Object>();
195 responseWssResult.add(e);
196 }
197 }
198
199 }
200
201 private void parseRequestData(IncomingWss incomingRequestWss)
202 {
203
204 ByteArrayInputStream in = request == null ? new ByteArrayInputStream(new byte[0]) : new ByteArrayInputStream(
205 request);
206 try
207 {
208
209 requestContentType = requestHeaders.get("Content-Type");
210 if (requestContentType != null && requestContentType.toUpperCase().startsWith("MULTIPART"))
211 {
212 StringToStringMap values = StringToStringMap.fromHttpHeader(requestContentType);
213 requestMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource("monitor request", in,
214 requestContentType), values.get("start"), null, true, SoapUI.getSettings().getBoolean(
215 WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
216 requestContentType = requestMmSupport.getRootPart().getContentType();
217 }
218 else
219 {
220 this.requestContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
221 }
222
223 processRequestWss(incomingRequestWss);
224
225 operation = findOperation();
226 }
227 catch (Exception e)
228 {
229 try
230 {
231 in.close();
232 }
233 catch (IOException e1)
234 {
235 e1.printStackTrace();
236 }
237 }
238
239 }
240
241 private WsdlOperation findOperation() throws Exception
242 {
243 soapVersion = SoapUtils.deduceSoapVersion(requestContentType, XmlObject.Factory.parse(getRequestContent()));
244 if (soapVersion == null)
245 throw new Exception("Unrecognized SOAP Version");
246
247 String soapAction = SoapUtils.getSoapAction(soapVersion, requestHeaders);
248
249 List<WsdlOperation> operations = new ArrayList<WsdlOperation>();
250 for (Interface iface : project.getInterfaceList())
251 {
252 for (Operation operation : iface.getOperationList())
253 operations.add((WsdlOperation) operation);
254 }
255
256 return SoapUtils.findOperationForRequest(soapVersion, soapAction, XmlObject.Factory.parse(getRequestContent()),
257 operations, true, false);
258 }
259
260 private void processRequestWss(IncomingWss incomingRequestWss) throws IOException
261 {
262
263 if (incomingRequestWss != null)
264 {
265 Document dom = XmlUtils.parseXml(requestContent);
266 try
267 {
268 requestWssResult = incomingRequestWss.processIncoming(dom, new DefaultPropertyExpansionContext(project));
269 if (requestWssResult != null && requestWssResult.size() > 0)
270 {
271 StringWriter writer = new StringWriter();
272 XmlUtils.serialize(dom, writer);
273 requestContent = writer.toString();
274 }
275 }
276 catch (Exception e)
277 {
278 if (requestWssResult == null)
279 requestWssResult = new Vector<Object>();
280 requestWssResult.add(e);
281 }
282 }
283
284 }
285
286 public WsdlOperation getOperation()
287 {
288 return operation;
289 }
290
291 public Vector<?> getRequestWssResult()
292 {
293 return requestWssResult;
294 }
295
296 public Vector<?> getResponseWssResult()
297 {
298 return responseWssResult;
299 }
300
301 public Attachment[] getRequestAttachments()
302 {
303 return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments();
304 }
305
306 public String getRequestContent()
307 {
308 return requestMmSupport == null ? requestContent : requestMmSupport.getContentAsString();
309 }
310
311 public byte[] getRawRequestData()
312 {
313 if (requestRaw != null)
314 return requestRaw;
315 else
316 return request;
317 }
318
319 public void setRawRequestData(byte[] data)
320 {
321 requestRaw = data;
322 }
323
324 public byte[] getRawResponseData()
325 {
326 if (responseRaw == null)
327 return responseRaw;
328 else
329 return response;
330 }
331
332 public void setRawResponseData(byte[] data)
333 {
334 responseRaw = data;
335 }
336
337 public StringToStringMap getRequestHeaders()
338 {
339 return requestHeaders;
340 }
341
342 public Attachment[] getResponseAttachments()
343 {
344 return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments();
345 }
346
347 public String getResponseContent()
348 {
349 return responseContent;
350 }
351
352 public StringToStringMap getResponseHeaders()
353 {
354 return responseHeaders;
355 }
356
357 public long getTimeTaken()
358 {
359 return timestampEnd - timestampStart;
360 }
361
362 public long getTimestamp()
363 {
364 return timestampStart;
365 }
366
367 public boolean isDiscarded()
368 {
369 return discarded;
370 }
371
372 public void stopCapture()
373 {
374
375 timestampEnd = System.currentTimeMillis();
376 capture = false;
377
378 }
379
380 public boolean isStopCapture()
381 {
382 return capture;
383 }
384
385 public void setRequest(byte[] request)
386 {
387 this.request = request;
388 }
389
390 public void setResponse(byte[] response)
391 {
392 if (this.response == null)
393 {
394 this.response = response;
395 }
396 else
397 {
398 byte[] newResponse = new byte[this.response.length + response.length];
399 for (int i = 0; i < this.response.length; i++)
400 {
401 newResponse[i] = this.response[i];
402 }
403 for (int i = this.response.length; i < newResponse.length; i++)
404 {
405 newResponse[i] = response[i - this.response.length];
406 }
407 this.response = newResponse;
408 }
409 }
410
411 public void setResponseHeader(String name, String value)
412 {
413 responseHeaders.put(name, value);
414 }
415
416 public void setRequestHost(String serverName)
417 {
418 requestHost = serverName;
419 }
420
421 public void setTargetHost(String remoteHost)
422 {
423 }
424
425 @SuppressWarnings("unchecked")
426 public void setRequestHeader(HttpServletRequest httpRequest)
427 {
428 Enumeration<String> headerNames = httpRequest.getHeaderNames();
429 while (headerNames.hasMoreElements())
430 {
431 String name = headerNames.nextElement();
432 Enumeration<String> header = httpRequest.getHeaders(name);
433 while (header.hasMoreElements())
434 {
435 String value = header.nextElement();
436 if (value != null)
437 {
438 requestHeaders.put(name, value);
439 }
440 }
441 }
442 }
443
444 public void setTargetURL(String url)
445 {
446 try
447 {
448 this.targetURL = new URL(url);
449 }
450 catch (MalformedURLException e)
451 {
452 e.printStackTrace();
453 }
454 }
455
456 public int getResponseStatusCode()
457 {
458 return 0;
459 }
460
461 public String getResponseContentType()
462 {
463 return null;
464 }
465
466 public void setResponseHeader(ExtendedPostMethod method)
467 {
468 Header[] headers = method.getResponseHeaders();
469 for (Header header : headers)
470 {
471 String name = header.getName();
472 String value = header.getValue();
473 if (value != null)
474 {
475 responseHeaders.put(name, value);
476 }
477 }
478 }
479
480 }