/* * 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.support.http; import com.eviware.soapui.config.AttachmentConfig; import com.eviware.soapui.config.HttpRequestConfig; import com.eviware.soapui.impl.rest.RestRequest.ParameterMessagePart; import com.eviware.soapui.impl.rest.RestRequestInterface; import com.eviware.soapui.impl.rest.support.RestParamProperty; import com.eviware.soapui.impl.rest.support.RestParamsPropertyHolder; import com.eviware.soapui.impl.rest.support.XmlBeansRestParamsTestPropertyHolder; import com.eviware.soapui.impl.support.AbstractHttpOperation; import com.eviware.soapui.impl.support.AbstractHttpRequest; import com.eviware.soapui.impl.wsdl.HttpAttachmentPart; import com.eviware.soapui.impl.wsdl.WsdlSubmit; import com.eviware.soapui.impl.wsdl.submit.RequestTransportRegistry; import com.eviware.soapui.impl.wsdl.submit.transports.http.HttpResponse; import com.eviware.soapui.impl.wsdl.support.jms.header.JMSHeaderConfig; import com.eviware.soapui.impl.wsdl.support.jms.property.JMSPropertiesConfig; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.iface.MessagePart; import com.eviware.soapui.model.iface.MessagePart.ContentPart; import com.eviware.soapui.model.iface.SubmitContext; import com.eviware.soapui.model.propertyexpansion.PropertyExpander; import com.eviware.soapui.model.propertyexpansion.PropertyExpansion; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult; import com.eviware.soapui.model.testsuite.TestProperty; import com.eviware.soapui.model.testsuite.TestPropertyListener; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.UISupport; import org.apache.xmlbeans.SchemaGlobalElement; import org.apache.xmlbeans.SchemaType; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.List; import java.util.Map; public class HttpRequest extends AbstractHttpRequest<HttpRequestConfig> implements HttpRequestInterface<HttpRequestConfig> { private XmlBeansRestParamsTestPropertyHolder params; protected HttpRequest(HttpRequestConfig config, boolean forLoadTest) { super(config, null, "/http_request_step.png", forLoadTest); if (config.getParameters() == null) { config.addNewParameters(); } params = new XmlBeansRestParamsTestPropertyHolder(this, config.getParameters()); } public TestProperty addProperty(String name) { return params.addProperty(name); } public void moveProperty(String propertyName, int targetIndex) { params.moveProperty(propertyName, targetIndex); } public TestProperty removeProperty(String propertyName) { return params.removeProperty(propertyName); } public boolean renameProperty(String name, String newName) { return params.renameProperty(name, newName); } @Override public void addTestPropertyListener(TestPropertyListener listener) { params.addTestPropertyListener(listener); } public ModelItem getModelItem() { return this; } public String getMediaType() { return getConfig().getMediaType() != null ? getConfig().getMediaType() : "application/xml"; } public String getPath() { return getEndpoint(); } public boolean hasRequestBody() { RestRequestInterface.HttpMethod method = getMethod(); return method == RestRequestInterface.HttpMethod.POST || method == RestRequestInterface.HttpMethod.PUT || method == RestRequestInterface.HttpMethod.PATCH; } @Override public RestParamsPropertyHolder getParams() { return params; } public Map<String, TestProperty> getProperties() { return params.getProperties(); } public RestParamProperty getProperty(String name) { return params.getProperty(name); } public RestParamProperty getPropertyAt(int index) { return params.getPropertyAt(index); } public int getPropertyCount() { return params.getPropertyCount(); } public String[] getPropertyNames() { return params.getPropertyNames(); } public String getPropertyValue(String name) { return params.getPropertyValue(name); } public boolean isPostQueryString() { return hasRequestBody() && getConfig().getPostQueryString(); } public boolean hasProperty(String name) { return params.hasProperty(name); } public void setPropertyValue(String name, String value) { params.setPropertyValue(name, value); } public void setMediaType(String mediaType) { String old = getMediaType(); getConfig().setMediaType(mediaType); notifyPropertyChanged(MEDIA_TYPE, old, mediaType); } public void setPostQueryString(boolean b) { boolean old = isPostQueryString(); getConfig().setPostQueryString(b); notifyPropertyChanged("postQueryString", old, b); if (!("multipart/form-data".equals(getMediaType()) || "multipart/mixed".equals(getMediaType()))) { setMediaType(b ? "application/x-www-form-urlencoded" : getMediaType()); } } public void setMethod(RestRequestInterface.HttpMethod method) { RestRequestInterface.HttpMethod old = getMethod(); getConfig().setMethod(method.toString()); setIcon(UISupport.createImageIcon("/" + method.toString().toLowerCase() + "_method.gif")); notifyPropertyChanged("method", old, method); } public void setDownloadIncludedResources(boolean downloadIncludedResources) { boolean old = getDownloadIncludedResources(); getConfig().setDownloadIncludedResources(downloadIncludedResources); notifyPropertyChanged("downloadIncludedResources", old, downloadIncludedResources); } public boolean getDownloadIncludedResources() { return getConfig().getDownloadIncludedResources(); } public String getPropertiesLabel() { return "HTTP Params"; } public void removeTestPropertyListener(TestPropertyListener listener) { params.removeTestPropertyListener(listener); } public HttpAttachmentPart getAttachmentPart(String partName) { return null; } public HttpAttachmentPart[] getDefinedAttachmentParts() { return new HttpAttachmentPart[0]; } @Override public RestRequestInterface.HttpMethod getMethod() { String method = getConfig().getMethod(); return method == null ? null : RestRequestInterface.HttpMethod.valueOf(method); } public MessagePart[] getRequestParts() { List<MessagePart> result = new ArrayList<MessagePart>(); for (int c = 0; c < getPropertyCount(); c++) { result.add(new ParameterMessagePart(getPropertyAt(c))); } if (getMethod() == RestRequestInterface.HttpMethod.POST || getMethod() == RestRequestInterface.HttpMethod.PUT || getMethod() == RestRequestInterface.HttpMethod.PATCH) { result.add(new HttpContentPart()); } return result.toArray(new MessagePart[result.size()]); } public MessagePart[] getResponseParts() { return new MessagePart[0]; } public String getResponseContentAsXml() { HttpResponse response = getResponse(); if (response == null) { return null; } return response.getContentAsXml(); } public WsdlSubmit<HttpRequest> submit(SubmitContext submitContext, boolean async) throws SubmitException { String endpoint = PropertyExpander.expandProperties(submitContext, getEndpoint()); if (StringUtils.isNullOrEmpty(endpoint)) { UISupport.showErrorMessage("Missing endpoint for request [" + getName() + "]"); return null; } try { WsdlSubmit<HttpRequest> submitter = new WsdlSubmit<HttpRequest>(this, getSubmitListeners(), RequestTransportRegistry.getTransport(endpoint, submitContext)); submitter.submitRequest(submitContext, async); return submitter; } catch (Exception e) { throw new SubmitException(e.toString()); } } public void updateConfig(HttpRequestConfig request) { setConfig(request); if (params == null) { params = new XmlBeansRestParamsTestPropertyHolder(this, request.getParameters()); } else { params.resetPropertiesConfig(request.getParameters()); } List<AttachmentConfig> attachmentConfigs = getConfig().getAttachmentList(); for (int i = 0; i < attachmentConfigs.size(); i++) { AttachmentConfig config = attachmentConfigs.get(i); getAttachmentsList().get(i).updateConfig(config); } if (jmsHeaderConfig != null) { jmsHeaderConfig.setJMSHeaderConfConfig(request.getJmsConfig()); } if (jmsPropertyConfig != null) { jmsPropertyConfig.setJmsPropertyConfConfig(request.getJmsPropertyConfig()); } } public AbstractHttpOperation getOperation() { return null; } public class HttpContentPart extends ContentPart implements MessagePart { @Override public SchemaGlobalElement getPartElement() { return null; } @Override public QName getPartElementName() { return null; } @Override public SchemaType getSchemaType() { return null; } public String getDescription() { return null; } public String getName() { return null; } public String getMediaType() { return getConfig().getMediaType(); } } public List<TestProperty> getPropertyList() { return params.getPropertyList(); } private JMSHeaderConfig jmsHeaderConfig; private JMSPropertiesConfig jmsPropertyConfig; public JMSHeaderConfig getJMSHeaderConfig() { if (jmsHeaderConfig == null) { if (!getConfig().isSetJmsConfig()) { getConfig().addNewJmsConfig(); } jmsHeaderConfig = new JMSHeaderConfig(getConfig().getJmsConfig(), this); } return jmsHeaderConfig; } public JMSPropertiesConfig getJMSPropertiesConfig() { if (jmsPropertyConfig == null) { if (!getConfig().isSetJmsPropertyConfig()) { getConfig().addNewJmsPropertyConfig(); } jmsPropertyConfig = new JMSPropertiesConfig(getConfig().getJmsPropertyConfig(), this); } return jmsPropertyConfig; } public void notifyPropertyChanged(String responseContentProperty, String oldContent, String responseContent) { notifyPropertyChanged(responseContentProperty, (Object) oldContent, (Object) responseContent); } @Override public String getMultiValueDelimiter() { return getConfig().getMultiValueDelimiter(); } public void setMultiValueDelimiter(String delimiter) { String old = getMultiValueDelimiter(); getConfig().setMultiValueDelimiter(delimiter); notifyPropertyChanged("multiValueDelimiter", old, delimiter); } public PropertyExpansion[] getPropertyExpansions() { PropertyExpansionsResult result = new PropertyExpansionsResult(this, this); result.addAll(super.getPropertyExpansions()); result.addAll(params.getPropertyExpansions()); return result.toArray(); } public boolean isSendEmptyParameters() { return getSettings().getBoolean("sendEmptyParameters"); } public void setSendEmptyParameters(boolean sendEmptyParameters) { getSettings().setBoolean("sendEmptyParameters", sendEmptyParameters); } }