From 2de0473cf8c64e06396c5f5e6a0cf8b5e982514e Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Thu, 6 Nov 2008 22:08:14 +0000 Subject: Restrict connection close codes to the set defined in the spec git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@711989 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/client/ConnectionHandler.cpp | 20 +++++++++++++++++--- cpp/src/qpid/client/ConnectionHandler.h | 5 ++++- cpp/src/qpid/client/ConnectionImpl.cpp | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) (limited to 'cpp/src/qpid/client') diff --git a/cpp/src/qpid/client/ConnectionHandler.cpp b/cpp/src/qpid/client/ConnectionHandler.cpp index efff4027aa..fc53499fc5 100644 --- a/cpp/src/qpid/client/ConnectionHandler.cpp +++ b/cpp/src/qpid/client/ConnectionHandler.cpp @@ -30,6 +30,7 @@ using namespace qpid::client; using namespace qpid::framing; +using namespace qpid::framing::connection; namespace { const std::string OK("OK"); @@ -40,10 +41,23 @@ const std::string INVALID_STATE_START("start received in invalid state"); const std::string INVALID_STATE_TUNE("tune received in invalid state"); const std::string INVALID_STATE_OPEN_OK("open-ok received in invalid state"); const std::string INVALID_STATE_CLOSE_OK("close-ok received in invalid state"); + +} + +CloseCode ConnectionHandler::convert(uint16_t replyCode) +{ + switch (replyCode) { + case 200: return CLOSE_CODE_NORMAL; + case 320: return CLOSE_CODE_CONNECTION_FORCED; + case 402: return CLOSE_CODE_INVALID_PATH; + case 501: default: + return CLOSE_CODE_FRAMING_ERROR; + } } ConnectionHandler::ConnectionHandler(const ConnectionSettings& s, ProtocolVersion& v) - : StateManager(NOT_STARTED), ConnectionSettings(s), outHandler(*this), proxy(outHandler), errorCode(200), version(v) + : StateManager(NOT_STARTED), ConnectionSettings(s), outHandler(*this), proxy(outHandler), + errorCode(CLOSE_CODE_NORMAL), version(v) { insist = true; @@ -125,7 +139,7 @@ void ConnectionHandler::checkState(STATES s, const std::string& msg) void ConnectionHandler::fail(const std::string& message) { - errorCode = 502; + errorCode = CLOSE_CODE_FRAMING_ERROR; errorText = message; QPID_LOG(warning, message); setState(FAILED); @@ -177,7 +191,7 @@ void ConnectionHandler::redirect(const std::string& /*host*/, const Array& /*kno void ConnectionHandler::close(uint16_t replyCode, const std::string& replyText) { proxy.closeOk(); - errorCode = replyCode; + errorCode = convert(replyCode); errorText = replyText; setState(CLOSED); QPID_LOG(warning, "Broker closed connection: " << replyCode << ", " << replyText); diff --git a/cpp/src/qpid/client/ConnectionHandler.h b/cpp/src/qpid/client/ConnectionHandler.h index 28ca875ace..12323684a5 100644 --- a/cpp/src/qpid/client/ConnectionHandler.h +++ b/cpp/src/qpid/client/ConnectionHandler.h @@ -29,6 +29,7 @@ #include "qpid/framing/AMQP_ClientOperations.h" #include "qpid/framing/AMQP_ServerProxy.h" #include "qpid/framing/Array.h" +#include "qpid/framing/enum.h" #include "qpid/framing/FieldTable.h" #include "qpid/framing/FrameHandler.h" #include "qpid/framing/InputHandler.h" @@ -57,7 +58,7 @@ class ConnectionHandler : private StateManager, Adapter outHandler; framing::AMQP_ServerProxy::Connection proxy; - uint16_t errorCode; + framing::connection::CloseCode errorCode; std::string errorText; bool insist; framing::ProtocolVersion version; @@ -106,6 +107,8 @@ public: ErrorListener onError; std::vector knownBrokersUrls; + + static framing::connection::CloseCode convert(uint16_t replyCode); }; }} diff --git a/cpp/src/qpid/client/ConnectionImpl.cpp b/cpp/src/qpid/client/ConnectionImpl.cpp index ed296cbd4d..b284fb6312 100644 --- a/cpp/src/qpid/client/ConnectionImpl.cpp +++ b/cpp/src/qpid/client/ConnectionImpl.cpp @@ -150,7 +150,7 @@ template void ConnectionImpl::closeInternal(const F& f) { void ConnectionImpl::closed(uint16_t code, const std::string& text) { Mutex::ScopedLock l(lock); - setException(new ConnectionException(code, text)); + setException(new ConnectionException(ConnectionHandler::convert(code), text)); closeInternal(boost::bind(&SessionImpl::connectionClosed, _1, code, text)); } -- cgit v1.2.1