Base protocol codec for comm::Engine. Supported retransmissions
[anna.git] / source / diameter.comm / Session.cpp
index fada503..051cbce 100644 (file)
@@ -238,6 +238,7 @@ void Session::expireResponse(diameter::comm::Response* response)
 throw() {
   LOGMETHOD(anna::TraceMethod traceMethod("anna::diameter::comm::Session", "expireResponse", ANNA_FILE_LOCATION));
   bool doUnbind = false;
+  bool doRetransmission = false;
 
   // Quitar el OnExpiry: no tiene sentido habiendo keep-alive (DWR)
   if(response->getClassCode() != ClassCode::Bind) {
@@ -245,9 +246,13 @@ throw() {
       a_onDisconnect = OnDisconnect::IgnorePendings; // Abandon is not graceful
       doUnbind = true;
     }
+    else if(response->getRequest()->getOnExpiry() == Message::OnExpiry::Retransmit) {
+      doRetransmission = true;
+    }
   } else
     doUnbind = true; // (*)
 
+
   try {
     response->setMessage(NULL);
     eventResponse(*response);
@@ -263,6 +268,25 @@ throw() {
     setState(State::Bound);
   }
 
+  if(doRetransmission) {
+    diameter::comm::Message *request = const_cast<Message*>(response->getRequest());
+    eventRequestRetransmission(request);
+
+    int retries = request->getRetries();
+    if (retries > 0) {
+      retries--;
+      request->setRetries(retries);
+      LOGDEBUG
+      (
+        //std::string msg(asString());
+        std::string msg = anna::functions::asString("Retransmission initiated for request with HopByHop: %u; remaining %d retries", response->getHopByHop(), retries);
+        anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+      );
+      diameter::codec::functions::setPotentiallyReTransmittedMessageBit(*request);
+      send(request);
+    }
+  }
+
   response_erase(response);
 
   if(doUnbind) unbind();
@@ -275,7 +299,7 @@ void Session::finalize() throw() {
   cancelActionTimer(); // Action timer
   eventPeerShutdown();
 ///////////////////////////////////////////////////////////////////////
-// Notificar la finalización de las respuestas pendientes de recibir //
+// Notificar la finalizacin de las respuestas pendientes de recibir //
 ///////////////////////////////////////////////////////////////////////
 // RFC 3588 - 5.5.4.  Failover and Failback Procedures
 //