/*
* 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.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.settings.WsdlSettings;
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.uri.HttpParser;
import com.eviware.soapui.support.xml.XmlUtils;
import org.apache.http.Header;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
public class TcpMonWsdlMonitorMessageExchange extends WsdlMonitorMessageExchange {
private URL targetUrl;
private StringToStringsMap responseHeaders;
private long timeTaken;
private long timestamp;
private StringToStringsMap requestHeaders;
private String requestContent;
private String responseContent;
private int responseContentLength;
private int requestContentLength;
private String requestHost;
private WsdlProject project;
private WsdlOperation operation;
private byte[] capturedRequestData;
private byte[] capturedResponseData;
private String responseContentType;
private MultipartMessageSupport responseMmSupport;
private static final String HTTP_ELEMENT_CHARSET = "US-ASCII";
private SoapVersion soapVersion;
private MultipartMessageSupport requestMmSupport;
private String requestContentType;
private boolean discarded;
private Vector requestWssResult;
private Vector responseWssResult;
public TcpMonWsdlMonitorMessageExchange(WsdlProject project) {
super(null);
this.project = project;
responseHeaders = new StringToStringsMap();
requestHeaders = new StringToStringsMap();
timestamp = System.currentTimeMillis();
}
public String getEndpoint() {
return targetUrl == null ? null : targetUrl.toString();
}
@Override
public WsdlOperation getOperation() {
return operation;
}
@Override
public Response getResponse() {
// TODO Auto-generated method stub
return null;
}
@Override
public Operation getModelItem() {
return operation;
}
public Attachment[] getRequestAttachments() {
return requestMmSupport == null ? new Attachment[0] : requestMmSupport.getAttachments();
}
public String getRequestContent() {
return requestMmSupport == null ? requestContent : requestMmSupport.getContentAsString();
}
public StringToStringsMap getRequestHeaders() {
return requestHeaders;
}
public Attachment[] getResponseAttachments() {
return responseMmSupport == null ? new Attachment[0] : responseMmSupport.getAttachments();
}
public String getResponseContent() {
return responseMmSupport == null ? responseContent : responseMmSupport.getContentAsString();
}
public StringToStringsMap getResponseHeaders() {
return responseHeaders;
}
public long getTimeTaken() {
return timeTaken;
}
public long getTimestamp() {
return timestamp;
}
public void setTargetUrl(URL targetHost) {
this.targetUrl = targetHost;
}
public boolean isActive() {
return false;
}
public long getRequestContentLength() {
return requestContentLength;
}
public long getResponseContentLength() {
return responseContentLength;
}
public String getRequestHost() {
return requestHost;
}
public URL getTargetUrl() {
return targetUrl;
}
public byte[] getRawRequestData() {
return capturedRequestData;
}
public byte[] getRawResponseData() {
return capturedResponseData;
}
@Override
public boolean hasRawData() {
return true;
}
public void finish(byte[] capturedRequestData, byte[] capturedResponseData) {
this.capturedRequestData = capturedRequestData;
this.capturedResponseData = capturedResponseData;
if (timeTaken == 0) {
timeTaken = System.currentTimeMillis() - timestamp;
}
}
public void prepare(IncomingWss requestWss, IncomingWss responseWss) {
parseRequestData(capturedRequestData, requestWss);
parseReponseData(capturedResponseData, responseWss);
}
private void parseReponseData(byte[] capturedResponseData, IncomingWss responseWss) {
responseContentLength = capturedResponseData.length;
ByteArrayInputStream in = new ByteArrayInputStream(capturedResponseData);
try {
String line = null;
do {
line = HttpParser.readLine(in, HTTP_ELEMENT_CHARSET);
}
while (line != null && line.length() == 0);
if (line == null) {
throw new Exception("Missing request status line");
}
Header[] headers = HttpParser.parseHeaders(in, HTTP_ELEMENT_CHARSET);
if (headers != null) {
for (Header header : headers) {
responseHeaders.put(header.getName(), header.getValue());
}
}
responseContentType = responseHeaders.get("Content-Type", "");
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, SoapUI.getSettings().getBoolean(
WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
responseContentType = responseMmSupport.getRootPart().getContentType();
} else {
this.responseContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
}
processResponseWss(responseWss);
} catch (Exception e) {
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private void processResponseWss(IncomingWss responseWss) throws IOException {
if (responseWss != null) {
Document dom = XmlUtils.parseXml(responseContent);
try {
responseWssResult = responseWss.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();
}
responseWssResult.add(e);
}
}
}
private void parseRequestData(byte[] capturedRequestData, IncomingWss requestWss) {
requestContentLength = capturedRequestData.length;
ByteArrayInputStream in = new ByteArrayInputStream(capturedRequestData);
try {
String line = null;
do {
line = HttpParser.readLine(in, HTTP_ELEMENT_CHARSET);
}
while (line != null && line.length() == 0);
if (line == null) {
throw new Exception("Missing request status line");
}
Header[] headers = HttpParser.parseHeaders(in, HTTP_ELEMENT_CHARSET);
if (headers != null) {
for (Header header : headers) {
requestHeaders.put(header.getName(), header.getValue());
}
}
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, SoapUI.getSettings().getBoolean(
WsdlSettings.PRETTY_PRINT_RESPONSE_MESSAGES));
requestContentType = requestMmSupport.getRootPart().getContentType();
} else {
this.requestContent = XmlUtils.prettyPrintXml(Tools.readAll(in, 0).toString());
}
processRequestWss(requestWss);
operation = findOperation();
} catch (Exception e) {
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private void processRequestWss(IncomingWss requestWss) throws IOException {
if (requestWss != null) {
Document dom = XmlUtils.parseXml(requestContent);
try {
requestWssResult = requestWss.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();
}
requestWssResult.add(e);
}
}
}
private WsdlOperation findOperation() throws Exception {
soapVersion = SoapUtils.deduceSoapVersion(requestContentType, 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());
}
public void setRequestHost(String requestHost) {
this.requestHost = requestHost;
}
public SoapVersion getSoapVersion() {
if (soapVersion == null) {
soapVersion = SoapUtils.deduceSoapVersion(requestHeaders.get("Content-Type", ""), getRequestContent());
}
return soapVersion;
}
public void setTimeTaken(long timeTaken) {
this.timeTaken = timeTaken;
}
public void discard() {
operation = null;
project = null;
requestContent = null;
requestHeaders = null;
responseContent = null;
responseHeaders = null;
requestMmSupport = null;
discarded = true;
}
public boolean isDiscarded() {
return discarded;
}
public Vector getRequestWssResult() {
return requestWssResult;
}
public Vector getResponseWssResult() {
return responseWssResult;
}
public int getResponseStatusCode() {
return 0; // To change body of implemented methods use File | Settings |
// File Templates.
}
public String getResponseContentType() {
return null; // To change body of implemented methods use File | Settings
// | File Templates.
}
@Override
public String getRequestMethod() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, String> getHttpRequestParameters() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getQueryParameters() {
return "";
}
}