Just to confirm that the patch has been applied - URL: http://svn.apache.org/viewvc?rev=701225&view=rev Log: Bug 45479 - Support for multiple HTTP Header Manager nodes
On 24/07/2008, sebb <[EMAIL PROTECTED]> wrote: > On 24/07/2008, Andrew Alsup <[EMAIL PROTECTED]> wrote: > > Hi folks, > > > > This is my first post to the dev forum. I'm not sure of the preferred > > mechanism for posting mods/diffs to the source, but here goes. I've added > a > > small bit of code to support multiple "HTTP Header Manager" nodes at > > different scopes. > > > > > Thanks very much, looks useful. > > BTW, except for very small changes, the normal method is to create a > Bugzilla issue, and attach the patch(es) there. > > This makes it easier to keep track of progress - and avoids mangling > of code which sometimes happens with mailers. > > > > PREVIOUS: > > When HTTPSamplerBase.setHeaderManager(..) is called, it > > was already checking if a more locally scoped HeaderManager had already > been > > assigned. If so, log a warning and overwrite with the new HeaderManager. > > > > NEW: > > The HeaderManager object now supports a merge(..) operation, allowing it > to > > merge its values with another HeaderManager's. The result is a new > > HeaderManager object with values from both -> with more local-scoped values > > take precedence over more distant-scoped values. So, when > > HTTPSamplerBase.setHeaderManager(..) detects a more locally > > scoped HeaderManager already assigned, it stores the merged result. > > > > I created one new interface "TestMergeable", anticipating that this could > > also be useful for other config elements, such as HTTP Cookie Manager. > > > > I'm attaching the .diff, based on current SVN trunk (as of 2008-07-23 @ > > 20:00:00 EDT). > > > > Thanks for a great project! > > > > -- Andy Alsup > > > > > Index: > > src/core/org/apache/jmeter/testelement/TestMergeable.java > > =================================================================== > > --- > > src/core/org/apache/jmeter/testelement/TestMergeable.java > > (revision 0) > > +++ > > src/core/org/apache/jmeter/testelement/TestMergeable.java > > (revision 0) > > @@ -0,0 +1,12 @@ > > +package org.apache.jmeter.testelement; > > + > > +public interface TestMergeable { > > + > > + /** > > + * Merge an object's attributes with a TestElement's attributes. > > + * @param element The object to be merged with > > + * @param preferLocalValue When both objects have a value for the > > + * same attribute, this flag determines which value is > > preferred. > > + */ > > + public TestElement merge(TestElement element, boolean > > preferLocalValues); > > +} > > > > Property changes on: > > src\core\org\apache\jmeter\testelement\TestMergeable.java > > ___________________________________________________________________ > > Added: svn:keywords > > + "Date Revision Author HeadURL Id" > > Added: svn:eol-style > > + native > > > > Index: > > > src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java > > =================================================================== > > --- > > > src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java > > (revision 679216) > > +++ > > > src/protocol/http/org/apache/jmeter/protocol/http/control/HeaderManager.java > > (working copy) > > @@ -30,6 +30,8 @@ > > import java.util.Vector; > > > > import org.apache.jmeter.config.ConfigTestElement; > > +import org.apache.jmeter.testelement.TestElement; > > +import org.apache.jmeter.testelement.TestMergeable; > > import > > org.apache.jmeter.testelement.property.CollectionProperty; > > import org.apache.jmeter.util.JMeterUtils; > > import org.apache.jorphan.util.JOrphanUtils; > > @@ -40,7 +42,7 @@ > > * > > * @version $Revision$ > > */ > > -public class HeaderManager extends ConfigTestElement implements > > Serializable { > > +public class HeaderManager extends ConfigTestElement implements > > TestMergeable, Serializable { > > > > public static final String HEADERS = "HeaderManager.headers";// > > $NON-NLS-1$ > > > > @@ -252,4 +254,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 preferLocalValue When both objects have a value for the > > + * same attribute, this flag determines which value is > > preferred. > > + */ > > + 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 its clear they've been > > merged > > + merged.setName(merged.getName() + ":" + > > other.getName()); > > + > > + return merged; > > + } > > } > > Index: > > > src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java > > =================================================================== > > --- > > > src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java > > (revision 679216) > > +++ > > > src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java > > (working copy) > > @@ -727,7 +727,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)); > > } > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: > > [EMAIL PROTECTED] > > For additional commands, e-mail: > > [EMAIL PROTECTED] > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]