aboutsummaryrefslogtreecommitdiff
path: root/src/cache.c
diff options
context:
space:
mode:
authorjcid <devnull@localhost>2008-05-29 02:19:08 +0200
committerjcid <devnull@localhost>2008-05-29 02:19:08 +0200
commit1e21147176d202f3c8399c280ca3a6b77f830433 (patch)
tree33dfd52c64dc0fc708391fd143db00150cc2fb14 /src/cache.c
parente4acbd9f0423a47efa7188d801bc58c2bdedf8ba (diff)
- Switched from charset to content-type for handling data.
- Fixed data guesser to detect ASCII, LATIN1, UTF8, KOI8-R, CP-1251 as text.
Diffstat (limited to 'src/cache.c')
-rw-r--r--src/cache.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/cache.c b/src/cache.c
index dc8228f1..ade2bd6a 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -54,6 +54,7 @@ typedef struct {
const DilloUrl *Url; /* Cached Url. Url is used as a primary Key */
char *TypeDet; /* MIME type string (detected from data) */
char *TypeHdr; /* MIME type string as from the HTTP Header */
+ char *TypeMeta; /* MIME type string from META HTTP-EQUIV */
Dstr *Header; /* HTTP header */
const DilloUrl *Location; /* New URI for redirects */
Dstr *Data; /* Pointer to raw data */
@@ -202,6 +203,7 @@ static void Cache_entry_init(CacheEntry_t *NewEntry, const DilloUrl *Url)
NewEntry->Url = a_Url_dup(Url);
NewEntry->TypeDet = NULL;
NewEntry->TypeHdr = NULL;
+ NewEntry->TypeMeta = NULL;
NewEntry->Header = dStr_new("");
NewEntry->Location = NULL;
NewEntry->Data = dStr_sized_new(8*1024);
@@ -290,6 +292,7 @@ static void Cache_entry_free(CacheEntry_t *entry)
a_Url_free((DilloUrl *)entry->Url);
dFree(entry->TypeDet);
dFree(entry->TypeHdr);
+ dFree(entry->TypeMeta);
dStr_free(entry->Header, TRUE);
a_Url_free((DilloUrl *)entry->Location);
dStr_free(entry->Data, 1);
@@ -390,6 +393,47 @@ uint_t a_Cache_get_flags(const DilloUrl *url)
}
/*
+ * Get current content type.
+ */
+static const char *Cache_current_content_type(CacheEntry_t *entry)
+{
+ return entry->TypeMeta ? entry->TypeMeta : entry->TypeHdr ? entry->TypeHdr :
+ entry->TypeDet;
+}
+
+/*
+ * Get current Content-Type for cache entry found by URL.
+ */
+const char *a_Cache_get_content_type(const DilloUrl *url)
+{
+ CacheEntry_t *entry = Cache_entry_search_with_redirect(url);
+
+ return (entry) ? Cache_current_content_type(entry) : NULL;
+}
+
+/*
+ * Change Content-Type for cache entry found by url.
+ * Return new content type.
+ */
+const char *a_Cache_set_content_type(const DilloUrl *url, const char *ctype,
+ bool_t force)
+{
+ const char *ret;
+ CacheEntry_t *entry = Cache_entry_search_with_redirect(url);
+
+ if (!entry) {
+ ret = NULL;
+ } else {
+ if (force == TRUE || entry->TypeMeta == NULL) {
+ dFree(entry->TypeMeta);
+ entry->TypeMeta = dStrdup(ctype);
+ }
+ ret = entry->TypeMeta;
+ }
+ return ret;
+}
+
+/*
* Get the pointer to the URL document, and its size, from the cache entry.
* Return: 1 cached, 0 not cached.
*/
@@ -831,7 +875,7 @@ static void Cache_process_queue(CacheEntry_t *entry)
if (!(entry->Flags & CA_GotContentType)) {
st = a_Misc_get_content_type_from_data(
entry->Data->str, entry->Data->len, &Type);
- _MSG("Cache: detected Content-Type '%s'\n", Type);
+ MSG("Cache: detected Content-Type '%s'\n", Type);
if (st == 0 || entry->Flags & CA_GotData) {
if (a_Misc_content_type_check(entry->TypeHdr, Type) < 0) {
MSG_HTTP("Content-Type '%s' doesn't match the real data.\n",
@@ -885,9 +929,9 @@ static void Cache_process_queue(CacheEntry_t *entry)
if (TypeMismatch) {
AbortEntry = TRUE;
} else {
- st = a_Web_dispatch_by_type(
- entry->TypeHdr ? entry->TypeHdr : entry->TypeDet,
- ClientWeb, &Client->Callback, &Client->CbData);
+ st = a_Web_dispatch_by_type(Cache_current_content_type(entry),
+ ClientWeb, &Client->Callback,
+ &Client->CbData);
if (st == -1) {
/* MIME type is not viewable */
if (ClientWeb->flags & WEB_RootUrl) {