View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 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 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 }