@@ -143,6 +143,9 @@ public class AppSecRequestContext implements DataBundle, Closeable {
143143  // keep a reference to the last published usr.session_id 
144144  private  volatile  String  sessionId ;
145145
146+   // Used to detect missing request-end event at close. 
147+   private  volatile  boolean  requestEndCalled ;
148+ 
146149  private  static  final  AtomicIntegerFieldUpdater <AppSecRequestContext > WAF_TIMEOUTS_UPDATER  =
147150      AtomicIntegerFieldUpdater .newUpdater (AppSecRequestContext .class , "wafTimeouts" );
148151  private  static  final  AtomicIntegerFieldUpdater <AppSecRequestContext > RASP_TIMEOUTS_UPDATER  =
@@ -584,10 +587,15 @@ public void close() {
584587  /* Should be accessible from the modules */ 
585588
586589  public  void  close (boolean  requiresPostProcessing ) {
587-     if  (additive  != null  || derivatives  != null ) {
590+     if  (!requestEndCalled ) {
591+       log .debug (SEND_TELEMETRY , "Request end event was not called before close" );
592+     }
593+     if  (additive  != null ) {
588594      log .debug (
589595          SEND_TELEMETRY , "WAF object had not been closed (probably missed request-end event)" );
590596      closeAdditive ();
597+     }
598+     if  (derivatives  != null ) {
591599      derivatives  = null ;
592600    }
593601
@@ -699,4 +707,9 @@ public boolean isThrottled(RateLimiter rateLimiter) {
699707  public  boolean  isAdditiveClosed () {
700708    return  additiveClosed ;
701709  }
710+ 
711+   /** Must be called during request end event processing. */ 
712+   void  setRequestEndCalled () {
713+     requestEndCalled  = true ;
714+   }
702715}
0 commit comments