Author: sebb Date: Thu Oct 2 12:49:11 2008 New Revision: 701225 URL: http://svn.apache.org/viewvc?rev=701225&view=rev Log: Bug 45479 - Support for multiple HTTP Header Manager nodes
Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java jakarta/jmeter/trunk/xdocs/changes.xml Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java?rev=701225&r1=701224&r2=701225&view=diff ============================================================================== --- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java (original) +++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java Thu Oct 2 12:49:11 2008 @@ -31,6 +31,7 @@ import org.apache.commons.io.IOUtils; import org.apache.jmeter.config.ConfigTestElement; +import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.property.CollectionProperty; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.util.JOrphanUtils; @@ -255,4 +256,55 @@ public void setSOAPHeader(Object header) { this.SOAPHeader = header; } + + /** + * Merge the attributes with a another HeaderManager's attributes. + * @param element The object to be merged with + * @param preferLocalValues When both objects have a value for the + * same attribute, this flag determines which value is preferresd. + */ + public HeaderManager merge(TestElement element, boolean preferLocalValues) { + if (!(element instanceof HeaderManager)) { + throw new IllegalArgumentException("Cannot merge type:" + this.getClass().getName() + " with type:" + element.getClass().getName()); + } + + // start off with a merged object as a copy of the local object + HeaderManager merged = (HeaderManager)this.clone(); + + HeaderManager other = (HeaderManager)element; + // iterate thru each of the other headers + for (int i = 0; i < other.getHeaders().size(); i++) { + Header otherHeader = other.get(i); + boolean found = false; + // find the same property in the local headers + for (int j = 0; j < merged.getHeaders().size(); j++) { + Header mergedHeader = merged.get(j); + if (mergedHeader.getName().equalsIgnoreCase(otherHeader.getName())) { + // we have a match + found = true; + if (!preferLocalValues) { + // prefer values from the other object + if ( (otherHeader.getValue() == null) || (otherHeader.getValue().length() == 0) ) { + // the other object has an empty value, so remove this value from the merged object + merged.remove(j); + } else { + // use the other object's value + mergedHeader.setValue(otherHeader.getValue()); + } + } + // break out of the inner loop + break; + } + } + if (!found) { + // the other object has a new value to be added to the merged + merged.add(otherHeader); + } + } + + // finally, merge the names so it's clear they've been merged + merged.setName(merged.getName() + ":" + other.getName()); + + return merged; + } } Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=701225&r1=701224&r2=701225&view=diff ============================================================================== --- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java (original) +++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java Thu Oct 2 12:49:11 2008 @@ -715,7 +715,14 @@ public void setHeaderManager(HeaderManager value) { HeaderManager mgr = getHeaderManager(); if (mgr != null) { - log.warn("Existing HeaderManager " + mgr.getName() + " superseded by " + value.getName()); + log.warn("Existing HeaderManager '" + mgr.getName() + "' merged with '" + value.getName() + "'"); + value = mgr.merge(value, true); + if (log.isDebugEnabled()) { + log.debug("HeaderManager merged: " + value.getName()); + for (int i=0; i < value.getHeaders().size(); i++) { + log.debug(" " + value.getHeader(i).getName() + "=" + value.getHeader(i).getValue()); + } + } } setProperty(new TestElementProperty(HEADER_MANAGER, value)); } Modified: jakarta/jmeter/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=701225&r1=701224&r2=701225&view=diff ============================================================================== --- jakarta/jmeter/trunk/xdocs/changes.xml (original) +++ jakarta/jmeter/trunk/xdocs/changes.xml Thu Oct 2 12:49:11 2008 @@ -129,6 +129,7 @@ <li>Random Variable - new configuration element to create random numeric variables</li> <li>Bug 45929 - improved French translations</li> <li>Bug 45571 - JMS Sampler correlation enhancement</li> +<li>Bug 45479 - Support for multiple HTTP Header Manager nodes</li> </ul> <h3>Non-functional changes</h3> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]