#include <anna/diameter.comm/Message.hpp>
#include <anna/diameter.comm/TimerManager.hpp>
#include <anna/diameter.comm/Timer.hpp>
+#include <anna/diameter.comm/OriginHostManager.hpp>
+#include <anna/diameter.comm/OriginHost.hpp>
#include <anna/comm/Network.hpp>
#include <anna/comm/ClientSocket.hpp>
Session::Session(const char *className, const char *timerName) : anna::timex::Timer(timerName, (anna::Millisecond)0) /* not assigned */,
a_className(className),
a_timeController(NULL),
- a_engine(NULL),
a_notifyOrphansOnExpiration(true),
- a_actionTimer(NULL),
- a_dpr(ClassCode::ApplicationMessage) { // realmente no es necesario, los Message son por defecto de aplicacion
+ a_actionTimer(NULL) {
initialize();
}
a_nextEndToEnd = ((::time(NULL) & 0xFFF) << 20) + (rand() & 0xFFFFF);
}
-void Session::sendDPA()
+void Session::sendDPA(const Engine *commEngine, const anna::DataBlock &dprDataBlock)
noexcept(false) {
LOGMETHOD(anna::TraceMethod traceMethod("anna::diameter::comm::Session", "sendDPA", ANNA_FILE_LOCATION));
anna::DataBlock dpa(true);
- a_engine->readDPA(dpa, a_dpr.getBody()); // Asume that DPA is valid ...
+ commEngine->readDPA(dpa, dprDataBlock); // Asume that DPA is valid ...
if(dpa.isEmpty()) {
LOGWARNING(anna::Logger::warning("This diameter agent defines an empty DPA message. Remote disconnection DPR will be ignored going to the Bound state", ANNA_FILE_LOCATION));
doUnbind = true; // (*)
+ // Get origin host corresponding to the message:
+ anna::diameter::comm::OriginHostManager &ohm = anna::diameter::comm::OriginHostManager::instantiate();
+
+ // Extract OriginHost from datablock (db):
+ std::string originHostName = anna::diameter::helpers::base::functions::getOriginHost(response->getRequest()->getBody());
+ LOGDEBUG(anna::Logger::debug(anna::functions::asString("ORIGIN HOST FOR THE MESSAGE WHICH WAS EXPIRED: %s", originHostName.c_str()), ANNA_FILE_LOCATION));
+ anna::diameter::comm::OriginHost *originHost = ohm.getOriginHost(originHostName);
+
try {
response->setMessage(NULL);
- eventResponse(*response);
+ eventResponse(*response, originHost);
} catch(anna::RuntimeException& ex) {
ex.trace();
}
try {
response->setMessage(NULL);
- eventResponse(*response);
+ eventResponse(*response, nullptr); // upstream, we need to check second argument to know if comes from here.
+ // If originHost is NULL, and we are client, we could access through engine: a_engine->getOriginHostName(), and then ohm.getOriginHost(name). BUT CLIENTS DO NOTHING WITH THIS ARGUMENT.
+ // If server, we must return there: add protection for second argument.
} catch(anna::RuntimeException& ex) {
ex.trace();
}
Response::release(response);
if(a_state == State::Disconnecting) // only OnDisconnect::WaitPendings arrives here (the other disconnect suddently)
- if(getOTARequests() == 0) sendDPA();
+ if(getOTARequests() == 0) {
+ // TODO: decode response->getRequest(), which is a comm message, so we get Origin-Host, and then, from OriginHostManager, we get the commEngine to provide:
+ //sendDPA(commEngine, dprDataBlock);
+ }
if(a_state == State::Closing) // only OnDisconnect::WaitPendings arrives here (the other disconnect suddently)
if(getOTARequests() == 0) unbind();