com.eviware.soapui.impl.wsdl.submit.transports.http.BaseHttpResponse.java Source code

Java tutorial

Introduction

Here is the source code for com.eviware.soapui.impl.wsdl.submit.transports.http.BaseHttpResponse.java

Source

/*
 *  soapUI, copyright (C) 2004-2011 eviware.com 
 *
 *  soapUI is free software; you can redistribute it and/or modify it under the 
 *  terms of version 2.1 of the GNU Lesser General Public License as published by 
 *  the Free Software Foundation.
 *
 *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
 *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 *  See the GNU Lesser General Public License for more details at gnu.org.
 */

package com.eviware.soapui.impl.wsdl.submit.transports.http;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.Date;
import java.util.List;

import org.apache.commons.httpclient.Header;

import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.rest.RestRequestInterface;
import com.eviware.soapui.impl.rest.support.MediaTypeHandler;
import com.eviware.soapui.impl.rest.support.MediaTypeHandlerRegistry;
import com.eviware.soapui.impl.support.AbstractHttpRequestInterface;
import com.eviware.soapui.impl.support.http.HttpRequest;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
import com.eviware.soapui.impl.wsdl.teststeps.TestRequest;
import com.eviware.soapui.model.iface.Attachment;
import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext;
import com.eviware.soapui.model.settings.Settings;
import com.eviware.soapui.model.testsuite.TestCase;
import com.eviware.soapui.settings.HttpSettings;
import com.eviware.soapui.settings.UISettings;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.soapui.support.types.StringToStringsMap;

public abstract class BaseHttpResponse implements HttpResponse {

    private StringToStringsMap requestHeaders;
    private StringToStringsMap responseHeaders;

    private long timeTaken;
    private long timestamp;
    private String contentType;
    private int statusCode;
    private SSLInfo sslInfo;
    private URL url;
    private WeakReference<AbstractHttpRequestInterface<?>> httpRequest;
    private RestRequestInterface.RequestMethod method;
    private String version;
    private StringToStringMap properties;
    private byte[] rawRequestData;
    private byte[] rawResponseData;
    private int requestContentPos = -1;
    private String xmlContent;
    private boolean downloadIncludedResources;
    private Attachment[] attachments = new Attachment[0];
    protected HTMLPageSourceDownloader downloader;

    public BaseHttpResponse(ExtendedHttpMethod httpMethod, AbstractHttpRequestInterface<?> httpRequest,
            PropertyExpansionContext context) {
        this.httpRequest = new WeakReference<AbstractHttpRequestInterface<?>>(httpRequest);
        this.timeTaken = httpMethod.getTimeTaken();

        method = httpMethod.getMethod();
        version = httpMethod.getParams().getVersion().toString();
        try {
            this.url = new URL(httpMethod.getURI().toString());
        } catch (Exception e1) {
            SoapUI.logError(e1);
        }

        if (!httpMethod.isFailed()) {
            Settings settings = httpRequest.getSettings();
            if (settings.getBoolean(HttpSettings.INCLUDE_RESPONSE_IN_TIME_TAKEN)) {
                try {
                    httpMethod.getResponseBody();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                timeTaken += httpMethod.getResponseReadTime();
            }

            try {
                this.timestamp = System.currentTimeMillis();
                this.contentType = httpMethod.getResponseContentType();

                if (httpMethod.hasResponse()) {
                    this.statusCode = httpMethod.getStatusCode();
                    this.sslInfo = httpMethod.getSSLInfo();
                }

                this.url = new URL(httpMethod.getURI().toString());
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }

        if (httpRequest instanceof TestRequest) {
            TestCase tc = ((TestRequest) httpRequest).getTestStep().getTestCase();
            if (tc instanceof WsdlTestCase && ((WsdlTestCase) tc).isForLoadTest()) {
                initHeadersForLoadTest(httpMethod);
                return;
            }
        }

        initHeaders(httpMethod);
        if (this.httpRequest.get() instanceof HttpRequest) {
            downloadIncludedResources = ((HttpRequest) this.httpRequest.get()).getDownloadIncludedResources();
            if (downloadIncludedResources) {
                long before = (new Date()).getTime();
                addIncludedContentsAsAttachments();
                long after = (new Date()).getTime();
                timeTaken += (after - before);
                context.setProperty(HTMLPageSourceDownloader.MISSING_RESOURCES_LIST,
                        downloader.getMissingResourcesList());
            }
        }
    }

    private void addIncludedContentsAsAttachments() {
        downloader = new HTMLPageSourceDownloader();
        try {
            List<Attachment> attachmentList = downloader.downloadCssAndImages(url.toString(),
                    (HttpRequest) httpRequest.get());
            attachments = attachmentList.toArray(new Attachment[attachmentList.size()]);
        } catch (ClassCastException cce) {
            attachments = new Attachment[1];
            try {
                attachments[0] = downloader.createAttachment(rawResponseData, url, (HttpRequest) httpRequest.get());
            } catch (IOException e) {
                SoapUI.log.error(e);
            }
        } catch (Exception e) {
            SoapUI.log.error(e);
        }
    }

    protected void initHeaders(ExtendedHttpMethod httpMethod) {
        try {
            ByteArrayOutputStream rawResponse = new ByteArrayOutputStream();
            ByteArrayOutputStream rawRequest = new ByteArrayOutputStream();

            if (!httpMethod.isFailed()) {
                try {
                    rawResponse.write(String.valueOf(httpMethod.getStatusLine()).getBytes());
                    rawResponse.write("\r\n".getBytes());
                } catch (Throwable e) {
                }
            }

            rawRequest.write((method + " " + String.valueOf(url) + " " + version + "\r\n").getBytes());

            requestHeaders = new StringToStringsMap();
            Header[] headers = httpMethod.getRequestHeaders();
            for (Header header : headers) {
                requestHeaders.put(header.getName(), header.getValue());
                rawRequest.write(header.toExternalForm().getBytes());
            }

            responseHeaders = new StringToStringsMap();

            if (!httpMethod.isFailed()) {
                headers = httpMethod.getResponseHeaders();
                for (Header header : headers) {
                    responseHeaders.put(header.getName(), header.getValue());
                    rawResponse.write(header.toExternalForm().getBytes());
                }

                responseHeaders.put("#status#", String.valueOf(httpMethod.getStatusLine()));
            }

            if (httpMethod.getRequestEntity() != null) {
                rawRequest.write("\r\n".getBytes());
                if (httpMethod.getRequestEntity().isRepeatable()) {
                    requestContentPos = rawRequest.size();
                    MaxSizeByteArrayOutputStream tempOut = new MaxSizeByteArrayOutputStream(
                            SoapUI.getSettings().getLong(UISettings.RAW_REQUEST_MESSAGE_SIZE, 0));
                    httpMethod.getRequestEntity().writeRequest(tempOut);
                    tempOut.writeTo(rawRequest);
                } else
                    rawRequest.write("<request data not available>".getBytes());
            }

            if (!httpMethod.isFailed()) {
                rawResponse.write("\r\n".getBytes());
                rawResponse.write(httpMethod.getResponseBody());
            }

            rawResponseData = rawResponse.toByteArray();
            rawRequestData = rawRequest.toByteArray();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static class MaxSizeByteArrayOutputStream extends ByteArrayOutputStream {
        private final long maxSize;

        public MaxSizeByteArrayOutputStream(long maxSize) {
            this.maxSize = maxSize;
        }

        @Override
        public synchronized void write(int b) {
            if (maxSize > 0 && size() < maxSize)
                super.write(b);
        }

        @Override
        public synchronized void write(byte[] b, int off, int len) {
            if (maxSize > 0 && size() < maxSize) {
                if (size() + len < maxSize)
                    super.write(b, off, len);
                else
                    super.write(b, off, (int) (maxSize - size()));
            }
        }

        @Override
        public void write(byte[] b) throws IOException {
            if (maxSize > 0 && size() < maxSize) {
                if (size() + b.length < maxSize)
                    super.write(b);
                else
                    super.write(b, 0, (int) (maxSize - size()));
            }
        }

    }

    protected void initHeadersForLoadTest(ExtendedHttpMethod httpMethod) {
        try {
            requestHeaders = new StringToStringsMap();
            Header[] headers = httpMethod.getRequestHeaders();
            for (Header header : headers) {
                requestHeaders.put(header.getName(), header.getValue());
            }

            if (!httpMethod.isFailed()) {
                responseHeaders = new StringToStringsMap();
                headers = httpMethod.getResponseHeaders();
                for (Header header : headers) {
                    responseHeaders.put(header.getName(), header.getValue());
                }

                responseHeaders.put("#status#", String.valueOf(httpMethod.getStatusLine()));
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public StringToStringsMap getRequestHeaders() {
        return requestHeaders;
    }

    public StringToStringsMap getResponseHeaders() {
        return responseHeaders;
    }

    public long getTimeTaken() {
        return timeTaken;
    }

    public SSLInfo getSSLInfo() {
        return sslInfo;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public String getContentType() {
        return contentType;
    }

    public URL getURL() {
        return url;
    }

    public AbstractHttpRequestInterface<?> getRequest() {
        return httpRequest.get();
    }

    public int getStatusCode() {
        return statusCode;
    }

    public Attachment[] getAttachments() {
        return attachments;
    }

    public Attachment[] getAttachmentsForPart(String partName) {
        return new Attachment[0];
    }

    public byte[] getRawRequestData() {
        return rawRequestData;
    }

    public byte[] getRawResponseData() {
        return rawResponseData;
    }

    public RestRequestInterface.RequestMethod getMethod() {
        return method;
    }

    public String getHttpVersion() {
        return version;
    }

    public void setProperty(String name, String value) {
        if (properties == null)
            properties = new StringToStringMap();

        properties.put(name, value);
    }

    public String getProperty(String name) {
        return properties == null ? null : properties.get(name);
    }

    public String[] getPropertyNames() {
        return properties == null ? new String[0] : properties.getKeys();
    }

    public String getRequestContent() {
        return requestContentPos == -1 || rawRequestData == null ? null
                : new String(rawRequestData, requestContentPos, rawRequestData.length - requestContentPos);
    }

    public String getContentAsXml() {
        if (xmlContent == null) {
            MediaTypeHandler typeHandler = MediaTypeHandlerRegistry.getTypeHandler(getContentType());
            xmlContent = (typeHandler == null) ? "<xml/>" : typeHandler.createXmlRepresentation(this);
        }
        return xmlContent;
    }
}