diff options
| author | Gordon Sim <gsim@apache.org> | 2008-03-11 12:24:46 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2008-03-11 12:24:46 +0000 |
| commit | d38d509af075300441ad858b1bb7680ac6b8e5ca (patch) | |
| tree | 900123f1d4cff0aa7caf63f12cca25817d6acac9 /cpp/src/qpid/broker/HeadersExchange.cpp | |
| parent | 2390281e2a22a5935e6cbe553f87222d02c64198 (diff) | |
| download | qpid-python-d38d509af075300441ad858b1bb7680ac6b8e5ca.tar.gz | |
Fixed broker to take application headers from final format message-properties struct
Fixed headers exchange to recognise x-match even if sent as a string other than 32 bit sized
Converted remaining python exchange tests
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@635898 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/HeadersExchange.cpp')
| -rw-r--r-- | cpp/src/qpid/broker/HeadersExchange.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/cpp/src/qpid/broker/HeadersExchange.cpp b/cpp/src/qpid/broker/HeadersExchange.cpp index c0f6cf19d2..634fcd7b88 100644 --- a/cpp/src/qpid/broker/HeadersExchange.cpp +++ b/cpp/src/qpid/broker/HeadersExchange.cpp @@ -21,6 +21,7 @@ #include "HeadersExchange.h" #include "qpid/framing/FieldValue.h" #include "qpid/framing/reply_exceptions.h" +#include "qpid/log/Statement.h" #include <algorithm> @@ -35,9 +36,10 @@ using namespace qpid::sys; using namespace qpid::broker; namespace { - const StringValue all("all"); - const StringValue any("any"); + const std::string all("all"); + const std::string any("any"); const std::string x_match("x-match"); + const std::string empty; } HeadersExchange::HeadersExchange(const string& _name, Manageable* _parent) : @@ -55,11 +57,27 @@ HeadersExchange::HeadersExchange(const std::string& _name, bool _durable, mgmtExchange->set_type (typeName); } +std::string HeadersExchange::getMatch(const FieldTable* args) +{ + if (!args) { + throw InternalErrorException(QPID_MSG("No arguments given.")); + } + FieldTable::ValuePtr what = args->get(x_match); + if (!what) { + return empty; + } + if (!what->convertsTo<std::string>()) { + throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange.")); + } + return what->get<std::string>(); +} + bool HeadersExchange::bind(Queue::shared_ptr queue, const string& /*routingKey*/, const FieldTable* args){ RWlock::ScopedWlock locker(lock); - FieldTable::ValuePtr what = args->get(x_match); - if (!what || (*what != all && *what != any)) + std::string what = getMatch(args); + if (what != all && what != any) throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange.")); + Bindings::iterator i; for (i = bindings.begin(); i != bindings.end(); i++) @@ -100,6 +118,8 @@ bool HeadersExchange::unbind(Queue::shared_ptr queue, const string& /*routingKey void HeadersExchange::route(Deliverable& msg, const string& /*routingKey*/, const FieldTable* args){ + if (!args) return;//can't match if there were no headers passed in + RWlock::ScopedRlock locker(lock); uint32_t count(0); @@ -153,10 +173,8 @@ namespace bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { typedef FieldTable::ValueMap Map; - FieldTable::ValuePtr what = bind.get(x_match); - if (!what) { - return false; - } else if (*what == all) { + std::string what = getMatch(&bind); + if (what == all) { for (Map::const_iterator i = bind.begin(); i != bind.end(); ++i) @@ -169,7 +187,7 @@ bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) { } } return true; - } else if (*what == any) { + } else if (what == any) { for (Map::const_iterator i = bind.begin(); i != bind.end(); ++i) |
