/*
* 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.jettyproxy;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Enumeration;
public class CapturedExchange {
private boolean startCapture;
private boolean stopCapture;
private long operationStarted;
private long timeTaken;
private String requestHost;
private String targetHost;
private String wsInterface;
private String wsOperation;
private int requestSize;
private int responseSize;
private byte[] request;
private byte[] response;
private String requestHeader;
private String responseHeader;
public boolean isStartCapture() {
return startCapture;
}
public void startCapture() {
this.startCapture = true;
this.stopCapture = false;
setOperationStarted(System.currentTimeMillis());
}
public boolean isStopCapture() {
return stopCapture;
}
public void stopCapture() {
this.startCapture = false;
this.stopCapture = true;
setTimeTaken(System.currentTimeMillis());
}
public long getOperationStarted() {
return operationStarted;
}
private void setOperationStarted(long operationStarted) {
this.operationStarted = operationStarted;
}
public String getRequestHost() {
return requestHost;
}
public void setRequestHost(String requestHost) {
this.requestHost = requestHost;
}
public String getTargetHost() {
return targetHost;
}
public void setTargetHost(String targetHost) {
this.targetHost = targetHost;
}
public String getWsInterface() {
return wsInterface;
}
public void setWsInterface(String wsInterface) {
this.wsInterface = wsInterface;
}
public String getWsOperation() {
return wsOperation;
}
public void setWsOperation(String wsOperation) {
this.wsOperation = wsOperation;
}
public long getTimeTaken() {
return timeTaken;
}
private void setTimeTaken(long endTime) {
this.timeTaken = -this.operationStarted + endTime;
}
public int getRequestSize() {
return requestSize;
}
private void setRequestSize(int requestSizeInCharacters) {
this.requestSize = requestSizeInCharacters;
}
public int getResponseSize() {
return responseSize;
}
private void setResponseSize() {
int length = this.response.length;
this.responseSize = length;
}
public byte[] getRequest() {
return request;
}
public void setRequest(byte[] request) {
// this.request = request;
if (this.request == null) {
this.request = request;
} else {
byte[] newRequest = new byte[this.request.length + request.length];
for (int i = 0; i < this.request.length; i++) {
newRequest[i] = this.request[i];
}
for (int i = this.request.length; i < newRequest.length; i++) {
newRequest[i] = request[i - this.response.length];
}
this.request = newRequest;
}
this.setRequestSize(this.request.length);
}
public byte[] getResponse() {
return response;
}
public void setResponse(byte[] response) {
if (this.response == null) {
this.response = response;
} else {
byte[] newResponse = new byte[this.response.length + response.length];
for (int i = 0; i < this.response.length; i++) {
newResponse[i] = this.response[i];
}
for (int i = this.response.length; i < newResponse.length; i++) {
newResponse[i] = response[i - this.response.length];
}
this.response = newResponse;
}
this.setResponseSize();
}
@Override
public String toString() {
String toString = "Request host: " + this.requestHost + "\n";
toString += "Request header : \n" + this.requestHeader + "\n";
toString += "Request: " + new String(this.request) + "\n";
toString += "Request size: " + this.requestSize + "\n";
toString += "Response host:" + this.targetHost + "\n";
toString += "Response header: \n" + this.responseHeader + "\n";
toString += "Response: " + new String(this.response) + "\n";
toString += "Response size:" + this.responseSize + "\n";
toString += "Started: " + new Date(this.operationStarted) + "\n";
toString += "Time Taken: " + this.timeTaken + "ms\n";
return toString;
}
@SuppressWarnings("unchecked")
public void setRequestHeader(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
String headerValue = null;
Enumeration<String> headerNames = httpRequest.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
if (ProxyServlet.dontProxyHeaders.contains(name.toLowerCase())) {
continue;
}
headerValue = name + "::";
Enumeration<String> header = httpRequest.getHeaders(name);
while (header.hasMoreElements()) {
String value = header.nextElement();
if (value != null) {
headerValue += value;
}
}
requestHeader = requestHeader == null ? headerValue : requestHeader + "\n" + headerValue;
}
}
public void addResponseHeader(String responseHeader) {
this.responseHeader = this.responseHeader == null ? responseHeader : this.responseHeader + "\n" + responseHeader;
}
}