From 7cd4071ab06f6b92206943e826dd39e1e03b80ed Mon Sep 17 00:00:00 2001 From: Marco De Marco <demarco@oats.inaf.it> Date: Thu, 14 Nov 2013 11:39:48 +0100 Subject: [PATCH] Communication works without error messages --- src/DBManager.cpp | 7 +++++++ src/PlainSession.cpp | 35 +++++++++++++++++++++---------- src/ProtocolManager.cpp | 46 ++++++++++++++++++++--------------------- src/SSLSession.cpp | 34 ++++++++++++++++++++---------- src/Server.cpp | 13 ++++++++++-- src/Session.cpp | 18 ++++++++++------ src/Session.h | 3 +++ 7 files changed, 103 insertions(+), 53 deletions(-) diff --git a/src/DBManager.cpp b/src/DBManager.cpp index ac0254d..5d4ce13 100644 --- a/src/DBManager.cpp +++ b/src/DBManager.cpp @@ -103,6 +103,13 @@ DBManager::InformationList DBManager::retrieveInformation(std::string schema, std::copy(rows.begin(), rows.end(), std::back_inserter(informationList)); + if(informationList.empty()) + { + std::stringstream errorStream; + errorStream << schema << "." << table << " not exists"; + throw soci::soci_error(errorStream.str()); + } + return informationList; } diff --git a/src/PlainSession.cpp b/src/PlainSession.cpp index 71157c6..9c9a662 100644 --- a/src/PlainSession.cpp +++ b/src/PlainSession.cpp @@ -1,8 +1,7 @@ #include <PlainSession.h> #include <boost/bind.hpp> - -#include <netinet/in.h> +#include <boost/lexical_cast.hpp> namespace MetadataExporter_ns { @@ -26,6 +25,9 @@ PlainSession::~PlainSession() { DEBUG_STREAM << "PlainSession::~PlainSession()" << endl; + INFO_STREAM << "PlainSession::~PlainSession() Disconnection from " + << remoteEndpoint << endl; + boost::system::error_code errorCode; m_plainSocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorCode); @@ -63,7 +65,11 @@ void PlainSession::start() { DEBUG_STREAM << "PlainSession::start()" << endl; - INFO_STREAM << m_plainSocket.remote_endpoint() << " CONNECTED" << endl; + remoteEndpoint = boost::lexical_cast<std::string>( + m_plainSocket.remote_endpoint()); + + INFO_STREAM << "PlainSession::start() Connection from " + << remoteEndpoint << endl; startReadRequestHeader(); } @@ -89,14 +95,16 @@ void PlainSession::startReadRequestBody(boost::uint32_t bodySize) { DEBUG_STREAM << "PlainSession::startReadRequestBody()" << endl; - INFO_STREAM << m_plainSocket.remote_endpoint() - << " >>>> " << bodySize << " BYTE" << endl; - m_readBuff.resize(HEADER_SIZE + bodySize); boost::asio::mutable_buffers_1 mutableBuffer = boost::asio::buffer(&m_readBuff[HEADER_SIZE], bodySize); + #ifdef VERBOSE_DEBUG + INFO_STREAM << "PlainSession::startReadRequestBody() " + << remoteEndpoint << " >>>> " << bodySize << " BYTE" << endl; + #endif + boost::asio::async_read(m_plainSocket, mutableBuffer, m_strand.wrap(boost::bind(&PlainSession::handleReadRequestBody, shared_from_this(), boost::asio::placeholders::error))); @@ -119,9 +127,6 @@ void PlainSession::startWriteResponse() boost::uint32_t bodySize = response_sp->ByteSize(); - INFO_STREAM << m_plainSocket.remote_endpoint() - << " <<<< " << bodySize << " BYTE" << endl; - std::vector<boost::uint8_t> writeBuff; writeBuff.resize(HEADER_SIZE + bodySize); @@ -129,17 +134,25 @@ void PlainSession::startWriteResponse() response_sp->SerializeToArray(&writeBuff[HEADER_SIZE], bodySize); + #ifdef VERBOSE_DEBUG + INFO_STREAM << "PlainSession::startWriteResponse() " + << remoteEndpoint << " <<<< " << bodySize << " byte" << endl; + #endif + boost::asio::async_write(m_plainSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&PlainSession::handleWriteResponse, shared_from_this(), boost::asio::placeholders::error))); } catch(std::runtime_error& ec) { - ERROR_STREAM << "SSLSession::startWriteResponse() " << ec.what() << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() " + << ec.what() << " from " << remoteEndpoint << endl; } catch(...) { - ERROR_STREAM << "SSLSession::startWriteResponse() unknown error" << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() unknown error from " + << remoteEndpoint << endl; + } } diff --git a/src/ProtocolManager.cpp b/src/ProtocolManager.cpp index f1f27a6..19dbb6a 100644 --- a/src/ProtocolManager.cpp +++ b/src/ProtocolManager.cpp @@ -150,39 +150,32 @@ ResponseSP ProtocolManager::prepareValidation(RequestSP request_sp) const std::string& schema = validationReq.schema(); const std::string& table = validationReq.table(); - DBManager::InformationList informationList = - m_dBManager_sp->retrieveInformation(schema, table); - - if(validationReq.columns_size() == (int)informationList.size()) + try { + DBManager::InformationList informationList = + m_dBManager_sp->retrieveInformation(schema, table); + + if(validationReq.columns_size() != (int)informationList.size()) + throw std::runtime_error("Columns number does not match"); + const google::protobuf::RepeatedPtrField < Request::Validation::Column >& columns = validationReq.columns(); google::protobuf::RepeatedPtrField < Request::Validation::Column >::const_iterator it; - try - { - for(it=columns.begin(); it!=columns.end();++it) - { - validateColumn(*it, informationList); - } - - m_isValidated = true; - - validationRes->set_state(Response::Validation::ACCEPTED); - validationRes->set_status("Table validated"); - } - catch(std::runtime_error& ex) - { - validationRes->set_state(Response::Validation::REJECTED); - validationRes->set_status(ex.what()); - } + for(it=columns.begin(); it!=columns.end(); ++it) + validateColumn(*it, informationList); + + m_isValidated = true; + + validationRes->set_state(Response::Validation::ACCEPTED); + validationRes->set_status("Table validated"); } - else + catch(std::runtime_error& ex) { validationRes->set_state(Response::Validation::REJECTED); - validationRes->set_status("Columns number does not match"); + validationRes->set_status(ex.what()); } } else @@ -292,6 +285,13 @@ void ProtocolManager::validateColumn(const Request::Validation::Column& column, << "server " << isNullable << " client " << column.nullable(); throw std::runtime_error(errorStream.str()); } + + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SERVER: " << columnName << " | " << columnType + << " | " << isNullable << endl; + INFO_STREAM << "SERVER: " << column.name() << " | " + << column.type() << " | " << column.nullable() << endl; + #endif } } diff --git a/src/SSLSession.cpp b/src/SSLSession.cpp index 7feffa5..cb0394d 100644 --- a/src/SSLSession.cpp +++ b/src/SSLSession.cpp @@ -1,5 +1,7 @@ #include <SSLSession.h> + #include <boost/bind.hpp> +#include <boost/lexical_cast.hpp> namespace MetadataExporter_ns { @@ -24,6 +26,9 @@ SSLSession::~SSLSession() { DEBUG_STREAM << "SSLSession::~SSLSession()" << endl; + INFO_STREAM << "SSLSession::~SSLSession() Disconnection from " + << remoteEndpoint << endl; + boost::system::error_code errorCode; m_sslSocket.shutdown(errorCode); @@ -65,8 +70,10 @@ void SSLSession::start() { DEBUG_STREAM << "SSLSession::start()" << endl; - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " CONNECTED" << endl; + remoteEndpoint = boost::lexical_cast<std::string>( + m_sslSocket.lowest_layer().remote_endpoint()); + + INFO_STREAM << "SSLSession::start() Connection from " << remoteEndpoint << endl; startHandShake(); } @@ -96,9 +103,8 @@ void SSLSession::handleHandShake(const boost::system::error_code& errorCode) } else { - WARN_STREAM << "SSLSession::handleHandShake() error " - << errorCode.message() << " from " - << m_sslSocket.lowest_layer().remote_endpoint() << endl; + ERROR_STREAM << "SSLSession::handleHandShake() error " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -128,8 +134,10 @@ void SSLSession::startReadRequestBody(boost::uint32_t bodySize) boost::asio::mutable_buffers_1 mutableBuffer = boost::asio::buffer(&m_readBuff[HEADER_SIZE], bodySize); - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " >>>> " << bodySize << " BYTE" << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SSLSession::startReadRequestBody() " + << remoteEndpoint << " >>>> " << bodySize << " byte" << endl; + #endif boost::asio::async_read(m_sslSocket, mutableBuffer, m_strand.wrap(boost::bind(&SSLSession::handleReadRequestBody, @@ -161,8 +169,10 @@ void SSLSession::startWriteResponse() response_sp->SerializeToArray(&writeBuff[HEADER_SIZE], bodySize); - INFO_STREAM << m_sslSocket.lowest_layer().remote_endpoint() - << " <<<< " << bodySize << " BYTE" << endl; + #ifdef VERBOSE_DEBUG + INFO_STREAM << "SSLSession::startWriteResponse() " + << remoteEndpoint << " <<<< " << bodySize << " byte" << endl; + #endif boost::asio::async_write(m_sslSocket, boost::asio::buffer(writeBuff), m_strand.wrap(boost::bind(&SSLSession::handleWriteResponse, @@ -170,11 +180,13 @@ void SSLSession::startWriteResponse() } catch(std::runtime_error& ec) { - ERROR_STREAM << "SSLSession::startWriteResponse() " << ec.what() << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() " + << ec.what() << " from " << remoteEndpoint << endl; } catch(...) { - ERROR_STREAM << "SSLSession::startWriteResponse() unknown error" << endl; + ERROR_STREAM << "SSLSession::startWriteResponse() unknown error from " + << remoteEndpoint << endl; } } diff --git a/src/Server.cpp b/src/Server.cpp index a035dcd..0358a95 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -69,7 +69,13 @@ void Server::start() throw(std::runtime_error) std::string localHost = m_configuration_sp->getLocalHost(); unsigned int localPort = m_configuration_sp->getLocalPort(); - INFO_STREAM << "LISTENING ON " << localHost << ":" << localPort << endl; + std::stringstream infoStream; + infoStream << "Listening on " << localHost << ":" << localPort << endl; + + INFO_STREAM << "Server::start()" << infoStream.str() << endl; + + writeState(Tango::ON); + writeStatus(infoStream.str()); boost::asio::ip::tcp::resolver::query query(localHost, boost::lexical_cast<std::string>(localPort)); @@ -101,6 +107,9 @@ void Server::stop() throw(std::runtime_error) { DEBUG_STREAM << "Server::stop()" << endl; + writeState(Tango::OFF); + writeStatus("Disconnected"); + boost::system::error_code errorCode; m_acceptor_sp->close(errorCode); @@ -181,7 +190,7 @@ void Server::handleAccept(Session::SP session_sp, } else { - WARN_STREAM << "Server::handleAccept() " << ec.message() << endl; + ERROR_STREAM << "Server::handleAccept() " << ec.message() << endl; } startAccept(); diff --git a/src/Session.cpp b/src/Session.cpp index 3392997..8fa49c5 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -40,11 +40,13 @@ void Session::handleReadRequestHeader(const boost::system::error_code& errorCode } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleReadRequestBody() end of file" << endl; + DEBUG_STREAM << "Session::handleReadRequestBody() end of file from " + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleReadRequestHeader() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleReadRequestHeader() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -61,11 +63,13 @@ void Session::handleReadRequestBody(const boost::system::error_code& errorCode) } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleReadRequestBody() end of file" << endl; + DEBUG_STREAM << "Session::handleReadRequestBody() end of file from" + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleReadRequestBody() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleReadRequestBody() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } @@ -82,11 +86,13 @@ void Session::handleWriteResponse(const boost::system::error_code& errorCode) } else if(errorCode == boost::asio::error::eof) { - DEBUG_STREAM << "Session::handleWriteResponse() end of file" << endl; + DEBUG_STREAM << "Session::handleWriteResponse() end of file from " + << remoteEndpoint << endl; } else { - WARN_STREAM << "Session::handleWriteResponse() " << errorCode.message() << endl; + ERROR_STREAM << "Session::handleWriteResponse() " + << errorCode.message() << " from " << remoteEndpoint << endl; } } diff --git a/src/Session.h b/src/Session.h index 65e7381..a993320 100644 --- a/src/Session.h +++ b/src/Session.h @@ -89,6 +89,9 @@ protected: //Binary buffer for read data std::vector<boost::uint8_t> m_readBuff; + + //Address and port of remote endpoint + std::string remoteEndpoint; }; } //End of namespace -- GitLab