/* * 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.submit.filters; import com.eviware.soapui.impl.support.AbstractHttpRequest; import com.eviware.soapui.impl.support.AbstractHttpRequestInterface; import com.eviware.soapui.model.iface.SubmitContext; import com.eviware.soapui.model.propertyexpansion.PropertyExpander; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.types.StringToStringsMap; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** * Picks up custom HTTP headers to add to all requests from system properties, which should be named as * <p/> * soapui.http.custom.header.<headerName>=<headerValue> * <p/> * The list and values of headers will be cached unless the system property soapui.http.custom.headers.cache=false * <p/> * By default header values are added to existing header values - if you want to replace existing headers * add soapui.http.custom.headers.replace=true instead * <p/> * The values are PropertyExpanded each time before getting added to the request. * <p/> * Since header names are passed via system properties, you can only define each header once. Use the static * addGlobalHeader method from code if needed. */ public class GlobalHttpHeadersRequestFilter extends AbstractRequestFilter { public static final String REPLACE_HEADERS_SYSTEM_PROPERTY = "soapui.http.global.headers.cache"; public static final String CACHE_HEADERS_SYSTEM_PROPERTY = "soapui.http.global.headers.replace"; public static final String HEADER_SYSTEM_PROPERTY_PREFIX = "soapui.http.global.header."; private static StringToStringsMap globalHeadersToAdd = new StringToStringsMap(); private StringToStringsMap headersToAdd; private Map<AbstractHttpRequest, StringToStringsMap> savedHeaders = new HashMap<AbstractHttpRequest, StringToStringsMap>(); @Override public void filterAbstractHttpRequest(SubmitContext context, AbstractHttpRequest<?> request) { if (headersToAdd == null || !isCacheHeaders() ) { synchronized (this) { if (headersToAdd == null || !isCacheHeaders()) initHeadersToAdd(); } } if (!headersToAdd.isEmpty()) { addHeadersToRequest(context, request); } } private boolean isCacheHeaders() { return Boolean.valueOf(System.getProperty(CACHE_HEADERS_SYSTEM_PROPERTY, "true")); } private void addHeadersToRequest(SubmitContext context, AbstractHttpRequest<?> request) { // get existing and save StringToStringsMap headers = request.getRequestHeaders(); savedHeaders.put(request, createCopyOfHeaders(headers)); boolean replaceHeaders = isReplaceHeaders(); for (String name : headersToAdd.keySet()) { // remove existing if replace is enabled if (replaceHeaders && headers.containsKey(name)) headers.get(name).clear(); // add header values for (String value : headersToAdd.get(name)) { headers.add(name, PropertyExpander.expandProperties(context, value)); } } request.setRequestHeaders(headers); } private boolean isReplaceHeaders() { return Boolean.valueOf(System.getProperty(REPLACE_HEADERS_SYSTEM_PROPERTY, "false")); } private StringToStringsMap createCopyOfHeaders(StringToStringsMap headers) { StringToStringsMap result = new StringToStringsMap(); for (String name : headers.keySet()) { result.put(name, new ArrayList<String>(headers.get(name))); } return result; } private void initHeadersToAdd() { headersToAdd = new StringToStringsMap(globalHeadersToAdd); for (Object key : System.getProperties().keySet()) { if (String.valueOf(key).startsWith(HEADER_SYSTEM_PROPERTY_PREFIX)) { String headerName = String.valueOf(key).substring(HEADER_SYSTEM_PROPERTY_PREFIX.length()); if (headerName.length() > 0) { String headerValue = System.getProperty(String.valueOf(key)); if (StringUtils.hasContent(headerValue)) headersToAdd.add(headerName, headerValue); } } } } /** * Restore headers to pre-request state */ @Override public void afterAbstractHttpResponse(SubmitContext context, AbstractHttpRequestInterface<?> request) { if (savedHeaders.containsKey(request)) { request.setRequestHeaders(savedHeaders.get(request)); savedHeaders.remove(request); } } public static void addGlobalHeader(String name, String value) { globalHeadersToAdd.add(name, value); } public static void removeGlobalHeader(String name, String value) { if( value == null ) globalHeadersToAdd.remove( name ); else if( globalHeadersToAdd.containsKey( name )) globalHeadersToAdd.get( name ).remove( value ); } }