From c0339b8f4d652b819563244a49e27690ae821a54 Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Tue, 16 Feb 2021 01:08:05 +0700
Subject: [PATCH] [*] Some fixes for expired cache delete

---
 .../http_server/http_client/dap_http_client.c | 20 +++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
index a3ae2a556c..8996588f54 100644
--- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c
+++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c
@@ -87,14 +87,8 @@ void dap_http_client_new( dap_events_socket_t *a_esocket, void *a_arg )
 
     pthread_rwlock_rdlock(&l_http_client->http->url_proc->cache_rwlock);
     if(l_http_client->http->url_proc->cache){
-        if (l_http_client->http->url_proc->cache->ts_expire < time(NULL) )
+        if ( ! l_http_client->http->url_proc->cache->ts_expire || l_http_client->http->url_proc->cache->ts_expire < time(NULL) )
             l_http_client->out_headers = dap_http_headers_dup(l_http_client->http->url_proc->cache->headers);
-        else{
-            pthread_rwlock_unlock(&l_http_client->http->url_proc->cache_rwlock);
-            pthread_rwlock_wrlock(&l_http_client->http->url_proc->cache_rwlock);
-            dap_http_cache_delete(l_http_client->http->url_proc->cache);
-            l_http_client->http->url_proc->cache = NULL;
-        }
     }
     pthread_rwlock_unlock(&l_http_client->http->url_proc->cache_rwlock);
     return;
@@ -553,10 +547,20 @@ void dap_http_client_write( dap_events_socket_t * a_esocket, void *a_arg )
         case DAP_HTTP_CLIENT_STATE_DATA:{
             if ( l_http_client->proc ){
                 pthread_rwlock_rdlock(&l_http_client->proc->cache_rwlock);
-                if ( l_http_client->proc->cache == NULL && l_http_client->proc->data_write_callback ){
+                if  ( ( l_http_client->proc->cache == NULL && l_http_client->proc->data_write_callback ) ||
+                      ( l_http_client->proc->data_write_callback &&
+                        l_http_client->http->url_proc->cache->ts_expire >= time(NULL) )
+                    ){
+                    if (l_http_client->proc->cache){
+                        pthread_rwlock_unlock(&l_http_client->http->url_proc->cache_rwlock);
+                        pthread_rwlock_wrlock(&l_http_client->http->url_proc->cache_rwlock);
+                        dap_http_cache_delete(l_http_client->http->url_proc->cache);
+                        l_http_client->http->url_proc->cache = NULL;
+                    }
                     pthread_rwlock_unlock(&l_http_client->proc->cache_rwlock);
                     l_http_client->proc->data_write_callback( l_http_client, NULL );
                 }else if(l_http_client->proc->cache) {
+
                     size_t l_to_send=l_http_client->proc->cache->body_size-l_http_client->out_cache_position ;
                     size_t l_sent = dap_events_socket_write_unsafe(l_http_client->esocket,
                                                    l_http_client->proc->cache->body+l_http_client->out_cache_position,
-- 
GitLab