diff options
Diffstat (limited to 'src/cache.c')
-rw-r--r-- | src/cache.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/cache.c b/src/cache.c index d2827e65..319de1b6 100644 --- a/src/cache.c +++ b/src/cache.c @@ -52,6 +52,7 @@ typedef struct { 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 */ + char *ContentDisposition; /**< Content-Disposition header */ Dstr *Header; /**< HTTP header */ const DilloUrl *Location; /**< New URI for redirects */ Dlist *Auth; /**< Authentication fields */ @@ -196,6 +197,7 @@ static void Cache_entry_init(CacheEntry_t *NewEntry, const DilloUrl *Url) NewEntry->TypeHdr = NULL; NewEntry->TypeMeta = NULL; NewEntry->TypeNorm = NULL; + NewEntry->ContentDisposition = NULL; NewEntry->Header = dStr_new(""); NewEntry->Location = NULL; NewEntry->Auth = NULL; @@ -302,6 +304,7 @@ static void Cache_entry_free(CacheEntry_t *entry) dFree(entry->TypeHdr); dFree(entry->TypeMeta); dFree(entry->TypeNorm); + dFree(entry->ContentDisposition); dStr_free(entry->Header, TRUE); a_Url_free((DilloUrl *)entry->Location); Cache_auth_free(entry->Auth); @@ -813,6 +816,9 @@ static void Cache_parse_header(CacheEntry_t *entry) _MSG("TypeMeta {%s}\n", entry->TypeMeta); dFree(Type); } + + entry->ContentDisposition = Cache_parse_field(header, "Content-Disposition"); + Cache_ref_data(entry); } @@ -1123,6 +1129,7 @@ static void Cache_null_client(int Op, CacheClient_t *Client) typedef struct { BrowserWindow *bw; DilloUrl *url; + char* filename; } Cache_savelink_t; /** @@ -1133,7 +1140,7 @@ static void Cache_savelink_cb(void *vdata) { Cache_savelink_t *data = (Cache_savelink_t*) vdata; - a_UIcmd_save_link(data->bw, data->url); + a_UIcmd_save_link(data->bw, data->url, data->filename); a_Url_free(data->url); dFree(data); } @@ -1184,6 +1191,8 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) bool_t AbortEntry = FALSE; bool_t OfferDownload = FALSE; bool_t TypeMismatch = FALSE; + char *dtype = NULL; + char *dfilename = NULL; if (Busy) MSG_ERR("FATAL!: >>>> Cache_process_queue Caught busy!!! <<<<\n"); @@ -1204,6 +1213,9 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) } else return entry; /* i.e., wait for more data */ } + if (entry->ContentDisposition) { + a_Misc_parse_content_disposition(entry->ContentDisposition, &dtype, &dfilename); + } Busy = TRUE; for (i = 0; (Client = dList_nth_data(ClientQueue, i)); ++i) { @@ -1268,6 +1280,8 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) * connection and to keep a failed-resource flag in * the cache entry. */ } + } else if (dtype && dStrnAsciiCasecmp(dtype, "attachment", 10) == 0) { + AbortEntry = OfferDownload = TRUE; } } if (AbortEntry) { @@ -1337,6 +1351,7 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) Cache_savelink_t *data = dNew(Cache_savelink_t, 1); data->bw = Client_bw; data->url = a_Url_dup(url); + data->filename = dStrdup(dfilename); a_Timeout_add(0.0, Cache_savelink_cb, data); } } @@ -1345,6 +1360,8 @@ static CacheEntry_t *Cache_process_queue(CacheEntry_t *entry) Cache_auth_entry(entry, Client_bw); } + dFree(dtype); dFree(dfilename); + /* Trigger cleanup when there are no cache clients */ if (dList_length(ClientQueue) == 0) { a_Dicache_cleanup(); |