/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.monitor; import com.eviware.soapui.SoapUI; import com.eviware.soapui.impl.wsdl.WsdlInterface; import com.eviware.soapui.impl.wsdl.WsdlOperation; import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments.MultipartMessageSupport; import com.eviware.soapui.impl.wsdl.support.CompressionSupport; import com.eviware.soapui.impl.wsdl.support.soap.SoapUtils; import com.eviware.soapui.impl.wsdl.support.soap.SoapVersion; import com.eviware.soapui.impl.wsdl.support.wss.IncomingWss; import com.eviware.soapui.model.iface.Attachment; import com.eviware.soapui.model.iface.Operation; import com.eviware.soapui.model.iface.Response; import com.eviware.soapui.model.propertyexpansion.DefaultPropertyExpansionContext; import com.eviware.soapui.model.support.ModelSupport; import com.eviware.soapui.support.Tools; import com.eviware.soapui.support.types.StringToStringMap; import com.eviware.soapui.support.types.StringToStringsMap; import com.eviware.soapui.support.xml.XmlUtils; import org.apache.http.Header; import org.apache.http.HttpResponse; import org.w3c.dom.Document; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Vector; public class JProxyServletWsdlMonitorMessageExchange extends WsdlMonitorMessageExchange { private WsdlOperation operation; private WsdlProject project; private String requestContent; private StringToStringsMap requestHeaders; private String responseContent; private StringToStringsMap responseHeaders; private MultipartMessageSupport requestMmSupport; private boolean discarded; private long timestampStart; private byte[] request; private byte[] response; private String requestHost; private URL targetURL; private String requestContentType; private Vector<Object> requestWssResult; private SoapVersion soapVersion; private String responseContentType; private MultipartMessageSupport responseMmSupport; private Vector<Object> responseWssResult; private long timestampEnd; private boolean capture; private byte[] requestRaw = null; private byte[] responseRaw = null; private String requestMethod = null; private Map<String, String> httpRequestParameters; private int statusCode; private String responseStatusLine; private String queryParameters; public JProxyServletWsdlMonitorMessageExchange(WsdlProject project) { super(null); responseHeaders = new StringToStringsMap(); requestHeaders = new StringToStringsMap(); timestampStart = System.currentTimeMillis(); this.project = project; capture = true; } public String getEndpoint() { return targetURL == null ? null : targetURL.toString(); } @Override public void discard() { operation = null; project = null; requestContent = null; requestHeaders = null; responseContent = null; responseHeaders = null; requestMmSupport = null; response = null; request = null; capture = false; queryParameters = null; discarded = true; } @Override public Response getResponse() { // TODO Auto-generated method stub return null; } @Override public long getRequestContentLength() { return request == null ? -1 : request.length; } @Override public String getRequestHost() { return requestHost; } @Override public long getResponseContentLength() { return response == null ? -1 : response.length; } @Override public URL getTargetUrl() { return this.targetURL; } @Override public void prepare(IncomingWss incomingRequestWss, IncomingWss incomingResponseWss) { parseRequestData(incomingRequestWss); parseResponseData(incomingResponseWss); } private void parseResponseData(IncomingWss incomingResponseWss) { ByteArrayInputStream in = new ByteArrayInputStream(response == null ? new byte[0] : response); try { responseContentType = responseHeaders.get("Content-Type", ""); if (responseContent == null) { if (responseContentType != null && responseContentType.toUpperCase().startsWith("MULTIPART")) { StringToStringMap values = StringToStringMap.fromHttpHeader(responseContentType); responseMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource( "monitor response", in, responseContentType), values.get("start"), null, true, false); responseContentType = responseMmSupport.getRootPart().getContentType(); } else { String charset = getCharset(responseHeaders); this.responseContent = charset == null ? Tools.readAll(in, 0).toString() : Tools.readAll(in, 0) .toString(charset); } } processResponseWss(incomingResponseWss); } catch (Exception e) { SoapUI.logError(e); } finally { try { in.close(); } catch (IOException e1) { SoapUI.logError(e1); } } } @Override public Operation getModelItem() { return operation; } public void setResponseContent(String content) throws IOException { this.responseContent = content; } private void processResponseWss(IncomingWss incomingResponseWss) throws IOException { if (incomingResponseWss != null) { Document dom = XmlUtils.parseXml(responseContent); try { responseWssResult = incomingResponseWss .processIncoming(dom, new DefaultPropertyExpansionContext(project)); if (responseWssResult != null && responseWssResult.size() > 0) { StringWriter writer = new StringWriter(); XmlUtils.serialize(dom, writer); responseContent = writer.toString(); } } catch (Exception e) { if (responseWssResult == null) { responseWssResult = new Vector<Object>(); } responseWssResult.add(e); } } } private void parseRequestData(IncomingWss incomingRequestWss) { ByteArrayInputStream in = request == null ? new ByteArrayInputStream(new byte[0]) : new ByteArrayInputStream( request); try { requestContentType = requestHeaders.get("Content-Type", ""); if (requestContentType != null && requestContentType.toUpperCase().startsWith("MULTIPART")) { StringToStringMap values = StringToStringMap.fromHttpHeader(requestContentType); requestMmSupport = new MultipartMessageSupport(new MonitorMessageExchangeDataSource("monitor request", in, requestContentType), values.get("start"), null, true, false); requestContentType = requestMmSupport.getRootPart() != null ? requestMmSupport.getRootPart() .getContentType() : null; } else { String charset = getCharset(requestHeaders); this.requestContent = charset == null ? Tools.readAll(in, 0).toString() : Tools.readAll(in, 0) .toString(charset); } processRequestWss(incomingRequestWss); if (checkParse()) { operation = findOperation(); } } catch (Exception e) { SoapUI.logError(e); } finally { try { in.close(); } catch (IOException e1) { SoapUI.logError(e1); } } } private boolean checkParse() { try { // XmlObject.Factory.parse( getRequestContent() ); XmlUtils.createXmlObject(getRequestContent()); } catch (Exception e) { return false; } return true; } private static String getCharset(StringToStringsMap headers) { String requestContentType = headers.get("Content-Type", ""); if (requestContentType != null) { StringToStringMap values = StringToStringMap.fromHttpHeader(requestContentType); if (values.containsKey("charset")) { return values.get("charset"); } } String contentEncodingHeader = headers.get("Content-Encoding", ""); if (contentEncodingHeader != null) { try { if (CompressionSupport.getAvailableAlgorithm(contentEncodingHeader) == null) { "".getBytes(contentEncodingHeader); return contentEncodingHeader; } } catch (Exception e) { } } return null; } private WsdlOperation findOperation() throws Exception { // soapVersion = SoapUtils.deduceSoapVersion( requestContentType, // XmlObject.Factory.parse( getRequestContent() ) ); soapVersion = SoapUtils.deduceSoapVersion(requestContentType, XmlUtils.createXmlObject(getRequestContent())); if (soapVersion == null) { throw new Exception("Unrecognized SOAP Version"); } String soapAction = SoapUtils.getSoapAction(soapVersion, requestHeaders); List<WsdlOperation> operations = new ArrayList<WsdlOperation>(); for (WsdlInterface iface : ModelSupport.getChildren(project, WsdlInterface.class)) { for (Operation operation : iface.getOperationList()) { operations.add((WsdlOperation) operation); } } // return SoapUtils.findOperationForRequest( soapVersion, soapAction, // XmlObject.Factory.parse( getRequestContent() ), operations, true, // false, getRequestAttachments() ); return SoapUtils.findOperationForRequest(soapVersion, soapAction, XmlUtils.createXmlObject(getRequestContent()), operations, true, false, getRequestAttachments()); } private void processRequestWss(IncomingWss incomingRequestWss) throws IOException { if (incomingRequestWss != null) { Document dom = XmlUtils.parseXml(requestContent); try { requestWssResult = incomingRequestWss.processIncoming(dom, new DefaultPropertyExpansionContext(project)); if (requestWssResult != null && requestWssResult.size() > 0) { StringWriter writer = new StringWriter(); XmlUtils.serialize(dom, writer); requestContent = writer.toString(); } } catch (Exception e) { if (requestWssResult == null) { requestWssResult = new Vector<Object>(); } requestWssResult.add(e); } } } public WsdlOperation getOperation() { return operation; } public Vector<?> getRequestWssResult() { return requestWssResult; } public Vector<?> getResponseWssResult() { return responseWssResult; } public Attachment[] getRequestAttachments() { return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments(); } public String getRequestContent() { return requestMmSupport == null ? requestContent : requestMmSupport.getContentAsString(); } public byte[] getRawRequestData() { if (requestRaw != null) { return requestRaw; } else { return request; } } public void setRawRequestData(byte[] data) { requestRaw = data; } public byte[] getRawResponseData() { if (responseRaw == null) { return response; } else { return responseRaw; } } public void setRawResponseData(byte[] data) { responseRaw = data; } public StringToStringsMap getRequestHeaders() { return requestHeaders; } public Attachment[] getResponseAttachments() { return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments(); } public String getResponseContent() { return responseContent; } public StringToStringsMap getResponseHeaders() { return responseHeaders; } public long getTimeTaken() { return timestampEnd - timestampStart; } public long getTimestamp() { return timestampStart; } public boolean isDiscarded() { return discarded; } public void stopCapture() { timestampEnd = System.currentTimeMillis(); capture = false; } public boolean isStopCapture() { return capture; } public byte[] getRawRequestBody() { return request; } public void setRequest(byte[] request) { this.request = request; } public byte[] getRawResponseBody() { return response; } public void setRawResponseBody(byte[] response) { this.response = response; } public void setResponseHeader(String name, String value) { responseHeaders.put(name, value); } public void setRequestHost(String serverName) { requestHost = serverName; } public void setTargetHost(String remoteHost) { } @SuppressWarnings("unchecked") public void setRequestHeader(HttpServletRequest httpRequest) { Enumeration<String> headerNames = httpRequest.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); Enumeration<String> header = httpRequest.getHeaders(name); while (header.hasMoreElements()) { String value = header.nextElement(); if (value != null) { requestHeaders.put(name, value); } } } } public void setTargetURL(String url) { try { this.targetURL = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); } } public int getResponseStatusCode() { return statusCode; } public String getResponseContentType() { return responseContentType; } public void setResponseHeader(HttpResponse response) { Header[] headers = response.getAllHeaders(); for (Header header : headers) { String name = header.getName(); String value = header.getValue(); if (value != null) { responseHeaders.put(name, value); } } } public String getRequestMethod() { return requestMethod; } public void setRequestMethod(String requestMethod) { this.requestMethod = requestMethod; } public void setHttpRequestParameters(HttpServletRequest httpRequest) { Enumeration<String> parameterNames = httpRequest.getParameterNames(); Map<String, String> parameterMap = new HashMap<String, String>(); while (parameterNames.hasMoreElements()) { String name = parameterNames.nextElement(); parameterMap.put(name, httpRequest.getParameter(name)); } this.httpRequestParameters = parameterMap; } public Map<String, String> getHttpRequestParameters() { return httpRequestParameters; } @Override public String getQueryParameters() { return queryParameters; } public void setQueryParameters(String queryParameters) { this.queryParameters = queryParameters; } public void setResponseStatusCode(int statusCode) { this.statusCode = statusCode; } public void setResponseStatusLine(String responseStatusLine) { this.responseStatusLine = responseStatusLine; } public WsdlProject getProject() { return project; } }