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