HAnother member RAII'ed.
This commit is contained in:
48
src/cache.cc
48
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)) {
|
||||
|
Reference in New Issue
Block a user