summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qpid/cpp/src/qpid/broker/HeadersExchange.cpp8
-rw-r--r--qpid/cpp/src/qpid/broker/HeadersExchange.h4
-rw-r--r--qpid/cpp/src/tests/ExchangeTest.cpp2
3 files changed, 8 insertions, 6 deletions
diff --git a/qpid/cpp/src/qpid/broker/HeadersExchange.cpp b/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
index 204f5cf676..82284feaeb 100644
--- a/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
+++ b/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
@@ -200,8 +200,10 @@ bool HeadersExchange::bind(Queue::shared_ptr queue, const string& bindingKey, co
Bindings::ConstPtr p = bindings.snapshot();
if (p.get()) {
+ MatchArgs matchArgs(queue, &extra_args);
+ MatchKey matchKey(queue, bindingKey);
for (std::vector<BoundKey>::const_iterator i = p->begin(); i != p->end(); ++i) {
- if (queue == i->binding->queue && bindingKey == i->binding->key) {
+ if (matchKey(*i) && !matchArgs(*i)) {
throw InternalErrorException(QPID_MSG("Exchange: " << getName()
<< ", binding key: " << bindingKey
<< " Duplicate binding key not allowed." ));
@@ -372,7 +374,7 @@ bool HeadersExchange::equal(const FieldTable& a, const FieldTable& b) {
//---------
HeadersExchange::MatchArgs::MatchArgs(Queue::shared_ptr q, const qpid::framing::FieldTable* a) : queue(q), args(a) {}
-bool HeadersExchange::MatchArgs::operator()(BoundKey & bk)
+bool HeadersExchange::MatchArgs::operator()(const BoundKey & bk)
{
return bk.binding->queue == queue && bk.binding->args == *args;
}
@@ -380,7 +382,7 @@ bool HeadersExchange::MatchArgs::operator()(BoundKey & bk)
//---------
HeadersExchange::MatchKey::MatchKey(Queue::shared_ptr q, const std::string& k) : queue(q), key(k) {}
-bool HeadersExchange::MatchKey::operator()(BoundKey & bk)
+bool HeadersExchange::MatchKey::operator()(const BoundKey & bk)
{
return bk.binding->queue == queue && bk.binding->key == key;
}
diff --git a/qpid/cpp/src/qpid/broker/HeadersExchange.h b/qpid/cpp/src/qpid/broker/HeadersExchange.h
index c96c5bc790..b5b10350d2 100644
--- a/qpid/cpp/src/qpid/broker/HeadersExchange.h
+++ b/qpid/cpp/src/qpid/broker/HeadersExchange.h
@@ -48,7 +48,7 @@ class HeadersExchange : public virtual Exchange {
const Queue::shared_ptr queue;
const qpid::framing::FieldTable* args;
MatchArgs(Queue::shared_ptr q, const qpid::framing::FieldTable* a);
- bool operator()(BoundKey & bk);
+ bool operator()(const BoundKey & bk);
};
struct MatchKey
@@ -56,7 +56,7 @@ class HeadersExchange : public virtual Exchange {
const Queue::shared_ptr queue;
const std::string& key;
MatchKey(Queue::shared_ptr q, const std::string& k);
- bool operator()(BoundKey & bk);
+ bool operator()(const BoundKey & bk);
};
struct FedUnbindModifier
diff --git a/qpid/cpp/src/tests/ExchangeTest.cpp b/qpid/cpp/src/tests/ExchangeTest.cpp
index 4f18b91b5a..8c2dbb21c8 100644
--- a/qpid/cpp/src/tests/ExchangeTest.cpp
+++ b/qpid/cpp/src/tests/ExchangeTest.cpp
@@ -138,7 +138,7 @@ QPID_AUTO_TEST_CASE(testIsBound)
args3.setInt("b", 6);
headers.bind(a, "", &args1);
- headers.bind(a, "", &args3);
+ headers.bind(a, "other", &args3);//need to use different binding key to correctly identify second binding
headers.bind(b, "", &args2);
headers.bind(c, "", &args1);