From b1e1f8e98e1a86e1ff6ac41c38fefd28cac6d64261bd22a7382479e2f8714de2 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Mon, 18 Aug 2025 02:53:32 -0400 Subject: [PATCH] HAnother member RAII'ed. --- src/cache.cc | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/cache.cc b/src/cache.cc index 727078e..1e81923 100644 --- a/src/cache.cc +++ b/src/cache.cc @@ -55,7 +55,7 @@ struct CacheEntry_t char *TypeHdr; /**< MIME type string as from the HTTP Header */ char *TypeMeta; /**< MIME type string from META HTTP-EQUIV */ char *TypeNorm; /**< MIME type string normalized */ - Dstr *Header; /**< HTTP header */ + std::string Header; /**< HTTP header */ std::unique_ptr< const DilloUrl > Location; /**< New URI for redirects */ Dlist *Auth; /**< Authentication fields */ Dstr *Data; /**< Pointer to raw data */ @@ -198,7 +198,6 @@ static void Cache_entry_init(CacheEntry_t *NewEntry, const DilloUrl *Url) NewEntry->TypeHdr = NULL; NewEntry->TypeMeta = NULL; NewEntry->TypeNorm = NULL; - NewEntry->Header = dStr_new(""); NewEntry->Location = NULL; NewEntry->Auth = NULL; NewEntry->Data = dStr_sized_new(8*1024); @@ -304,7 +303,6 @@ CacheEntry_t::~CacheEntry_t() dFree(entry->TypeHdr); dFree(entry->TypeMeta); dFree(entry->TypeNorm); - dStr_free(entry->Header, TRUE); Cache_auth_free(entry->Auth); dStr_free(entry->Data, 1); dStr_free(entry->UTF8Data, 1); @@ -659,8 +657,8 @@ static Dlist *Cache_parse_multiple_fields(const char *header, */ static void Cache_parse_header(CacheEntry_t *entry) { - char *header = entry->Header->str; - bool_t server1point0 = !strncmp(entry->Header->str, "HTTP/1.0", 8); + const char *header = entry->Header.c_str(); + bool_t server1point0 = !strncmp(entry->Header.c_str(), "HTTP/1.0", 8); char *Length, *Type, *location_str, *encoding, *connection, *hsts; #ifndef DISABLE_COOKIES Dlist *Cookies; @@ -671,13 +669,12 @@ static void Cache_parse_header(CacheEntry_t *entry) _MSG("Cache_parse_header\n"); - if (entry->Header->len > 12) { + if (entry->Header.size() > 12) { if (header[9] == '1' && header[10] == '0' && header[11] == '0') { /* 100: Continue. The "real" header has not come yet. */ MSG("An actual 100 Continue header!\n"); entry->Flags &= ~CA_GotHeader; - dStr_free(entry->Header, 1); - entry->Header = dStr_new(""); + entry->Header = ""; return; } if (header[9] == '3' && header[10] == '0' && @@ -825,27 +822,27 @@ static int Cache_get_header(CacheEntry_t *entry, const char *buf, size_t buf_size) { size_t N, i; - Dstr *hdr = entry->Header; + std::string &hdr = entry->Header; /* Header finishes when N = 2 */ - N = (hdr->len && hdr->str[hdr->len - 1] == '\n'); + N = (not hdr.empty() && hdr.back() == '\n'); for (i = 0; i < buf_size && N < 2; ++i) { if (buf[i] == '\r' || !buf[i]) continue; if (N == 1 && (buf[i] == ' ' || buf[i] == '\t')) { /* unfold multiple-line header */ _MSG("Multiple-line header!\n"); - dStr_erase(hdr, hdr->len - 1, 1); + hdr.pop_back(); } N = (buf[i] == '\n') ? N + 1 : 0; - dStr_append_c(hdr, buf[i]); + hdr+= buf[i]; } if (N == 2) { /* Got whole header */ - _MSG("Header [buf_size=%d]\n%s", i, hdr->str); + _MSG("Header [buf_size=%d]\n%s", i, hdr.c_str()); entry->Flags |= CA_GotHeader; - dStr_fit(hdr); + hdr.shrink_to_fit(); /* Return number of header bytes in 'buf' [1 based] */ return i; } @@ -1117,22 +1114,23 @@ static void Cache_null_client(int Op, CacheClient_t *Client) return; } -typedef struct { +struct Cache_savelink_t +{ + ~Cache_savelink_t(); + BrowserWindow *bw; - DilloUrl *url; -} Cache_savelink_t; + std::unique_ptr< DilloUrl > url; +}; /** * Save link from behind a timeout so that Cache_process_queue() can * get on with its work. */ -static void Cache_savelink_cb(void *vdata) +Cache_savelink_t::~Cache_savelink_t() { - Cache_savelink_t *data = (Cache_savelink_t*) vdata; + Cache_savelink_t *data= this; - a_UIcmd_save_link(data->bw, data->url); - delete data->url; - dFree(data); + a_UIcmd_save_link(data->bw, data->url.get()); } /** @@ -1331,10 +1329,10 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) /* Remove entry when 'conn' is already done */ Cache_entry_remove(NULL, url.get()); if (a_Cache_download_enabled(url.get())) { - Cache_savelink_t *data = dNew(Cache_savelink_t, 1); + auto data = std::make_unique< Cache_savelink_t >(); data->bw = Client_bw; - data->url = a_Url_dup(url.get()).release(); - Timeout::add(0.0, [=]{ Cache_savelink_cb( data ); } ); + data->url = a_Url_dup(url.get()); + Timeout::add(0.0, [data= data.release()]{ delete data; } ); } } } else if (entry->Auth && !(entry->Flags & CA_InProgress)) {