View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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 }