aboutsummaryrefslogtreecommitdiff
path: root/src/cache.c
diff options
context:
space:
mode:
authorJorge Arellano Cid <jcid@dillo.org>2009-01-21 18:54:29 -0300
committerJorge Arellano Cid <jcid@dillo.org>2009-01-21 18:54:29 -0300
commitce12353e70a468374baf90a7d09cdb71b2224add (patch)
tree2c158dcf57c372ada6be6b4a04a3bcd7df8bd4a3 /src/cache.c
parent94f2baf7660ac7b0baccbe79725a817ed877260f (diff)
Fixed charset decoding given in HTTP and META. (bugs and race condition)
Diffstat (limited to 'src/cache.c')
-rw-r--r--src/cache.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/cache.c b/src/cache.c
index 328d4913..5a804b21 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -497,23 +497,31 @@ const char *a_Cache_set_content_type(const DilloUrl *url, const char *ctype)
curr = Cache_current_content_type(entry);
if (entry->TypeMeta) {
- /* Type is already been set. Do nothing.
+ /* Type is already been set. Do nothing. META overrides TypeHdr.
* Multiple META elements? */
- } else if (a_Misc_content_type_cmp(curr, ctype)) {
- /* TypeMeta not set, and META gives one different from default */
- curr = entry->TypeMeta = dStrdup(ctype);
- if (entry->CharsetDecoder)
- a_Decode_free(entry->CharsetDecoder);
- a_Misc_parse_content_type(ctype, NULL, NULL, &charset);
- entry->CharsetDecoder = a_Decode_charset_init(charset);
- dFree(charset);
-
- /* Invalidate UTF8Data */
- dStr_free(entry->UTF8Data, 1);
- entry->UTF8Data = NULL;
+ } else {
+ if (!entry->TypeHdr) {
+ /* Content-Type from HTTP header */
+ entry->TypeHdr = dStrdup(ctype);
+ } else {
+ /* Content-Type from META */
+ entry->TypeMeta = dStrdup(ctype);
+ }
+ if (a_Misc_content_type_cmp(curr, ctype)) {
+ /* ctype gives one different from current */
+ if (entry->CharsetDecoder)
+ a_Decode_free(entry->CharsetDecoder);
+ a_Misc_parse_content_type(ctype, NULL, NULL, &charset);
+ entry->CharsetDecoder = a_Decode_charset_init(charset);
+ dFree(charset);
+ curr = Cache_current_content_type(entry);
+
+ /* Invalidate UTF8Data */
+ dStr_free(entry->UTF8Data, 1);
+ entry->UTF8Data = NULL;
+ }
}
-
return curr;
}
@@ -739,7 +747,6 @@ static void Cache_parse_header(CacheEntry_t *entry)
dStr_free(entry->Data, 1);
entry->Data = dStr_sized_new(MIN(entry->ExpectedSize, MAX_INIT_BUF));
}
- Cache_ref_data(entry);
/* Get Content-Type */
if ((Type = Cache_parse_field(header, "Content-Type")) == NULL) {
@@ -750,10 +757,12 @@ static void Cache_parse_header(CacheEntry_t *entry)
} else {
/* This HTTP Content-Type is not trusted. It's checked against real data
* in Cache_process_queue(); only then CA_GotContentType becomes true. */
- entry->TypeHdr = Type;
+ a_Cache_set_content_type(entry->Url, Type);
_MSG("TypeHdr {%s} {%s}\n", Type, URL_STR(entry->Url));
_MSG("TypeMeta {%s}\n", entry->TypeMeta);
+ dFree(Type);
}
+ Cache_ref_data(entry);
}
/*