/*
* 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.panels.teststeps.amf;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.submit.transports.http.support.methods.ExtendedPostMethod;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.model.support.AbstractResponse;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.soapui.support.types.StringToStringsMap;
import flex.messaging.io.amf.ActionMessage;
import flex.messaging.io.amf.MessageHeader;
import org.apache.http.Header;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.ByteArrayOutputStream;
import java.sql.SQLException;
import java.util.ArrayList;
public class AMFResponse extends AbstractResponse<AMFRequest> {
public static final String AMF_POST_METHOD = "AMF_POST_METHOD";
public static final String AMF_RESPONSE_HEADERS = "responseHeaders";
public static final String AMF_RESPONSE_ACTION_MESSAGE = "AMF_RESPONSE_ACTION_MESSAGE";
public static final String AMF_RAW_RESPONSE_BODY = "AMF_RAW_RESPONSE_BODY";
private String responseContentXML = "";
private long timeTaken;
private long timestamp;
private AMFRequest request;
private StringToStringsMap requestHeaders;
private StringToStringsMap responseHeaders;
private StringToStringMap responseAMFHeaders = new StringToStringMap();
private byte[] rawRequestData;
private byte[] rawResponseData;
private ActionMessage actionMessage;
private byte[] rawResponseBody;
public AMFResponse(AMFRequest request, SubmitContext submitContext, Object responseContent) throws SQLException,
ParserConfigurationException, TransformerConfigurationException, TransformerException {
super(request);
this.request = request;
if (responseContent != null) {
setResponseContentXML(new com.thoughtworks.xstream.XStream().toXML(responseContent));
}
this.actionMessage = (ActionMessage) submitContext.getProperty(AMF_RESPONSE_ACTION_MESSAGE);
this.rawResponseBody = (byte[]) submitContext.getProperty(AMF_RAW_RESPONSE_BODY);
initHeaders((ExtendedPostMethod) submitContext.getProperty(AMF_POST_METHOD));
}
public String getContentAsString() {
return getResponseContentXML();
}
public String getContentType() {
return "text/xml";
}
public long getContentLength() {
return rawResponseData != null ? rawResponseData.length : 0;
}
public String getRequestContent() {
return request.toString();
}
public long getTimeTaken() {
return timeTaken;
}
public long getTimestamp() {
return timestamp;
}
public void setTimeTaken(long timeTaken) {
this.timeTaken = timeTaken;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public void setResponseContentXML(String responseContentXML) {
this.responseContentXML = responseContentXML;
}
public String getResponseContentXML() {
return responseContentXML;
}
protected void initHeaders(ExtendedPostMethod postMethod) {
requestHeaders = new StringToStringsMap();
responseHeaders = new StringToStringsMap();
if (postMethod == null) {
return;
}
try {
ByteArrayOutputStream rawResponse = new ByteArrayOutputStream();
ByteArrayOutputStream rawRequest = new ByteArrayOutputStream();
if (!postMethod.isFailed() && postMethod.hasHttpResponse()) {
rawResponse.write(String.valueOf(postMethod.getHttpResponse().getStatusLine()).getBytes());
rawResponse.write("\r\n".getBytes());
}
rawRequest.write((postMethod.getMethod() + " " + postMethod.getURI().toString() + " "
+ postMethod.getProtocolVersion().toString() + "\r\n").getBytes());
Header[] headers = postMethod.getAllHeaders();
for (Header header : headers) {
requestHeaders.add(header.getName(), header.getValue());
rawRequest.write(toExternalForm(header).getBytes());
}
if (!postMethod.isFailed() && postMethod.hasHttpResponse()) {
headers = postMethod.getHttpResponse().getAllHeaders();
for (Header header : headers) {
responseHeaders.add(header.getName(), header.getValue());
rawResponse.write(toExternalForm(header).getBytes());
}
responseHeaders.add("#status#", String.valueOf(postMethod.getHttpResponse().getStatusLine()));
}
if (postMethod.getRequestEntity() != null) {
rawRequest.write("\r\n".getBytes());
if (postMethod.getRequestEntity().isRepeatable() && postMethod.getEntity() != null) {
postMethod.getEntity().writeTo(rawRequest);
} else {
rawRequest.write("<request data not available>".getBytes());
}
}
if (!postMethod.isFailed()) {
rawResponse.write("\r\n".getBytes());
rawResponse.write(rawResponseBody);
}
rawResponseData = rawResponse.toByteArray();
rawRequestData = rawRequest.toByteArray();
initAMFHeaders(postMethod);
} catch (Throwable e) {
SoapUI.logError(e);
}
}
@SuppressWarnings("unchecked")
private void initAMFHeaders(ExtendedPostMethod postMethod) {
if (!postMethod.isFailed() && actionMessage != null) {
ArrayList<MessageHeader> amfHeaders = actionMessage.getHeaders();
for (MessageHeader header : amfHeaders) {
responseAMFHeaders.put(header.getName(), header.getData().toString());
}
}
}
public byte[] getRawRequestData() {
return rawRequestData;
}
public byte[] getRawResponseData() {
return rawResponseData;
}
public StringToStringsMap getRequestHeaders() {
return requestHeaders;
}
public StringToStringsMap getResponseHeaders() {
return responseHeaders;
}
public StringToStringMap getResponseAMFHeaders() {
return responseAMFHeaders;
}
/**
* Returns a {@link String} representation of the header.
*
* @return stringHEAD
*/
public String toExternalForm(Header header) {
return ((null == header.getName() ? "" : header.getName()) + ": "
+ (null == header.getValue() ? "" : header.getValue()) + "\r\n");
}
}