From a1c2d1742b37d65073b648f9c8483a17a5cf7af8 Mon Sep 17 00:00:00 2001 From: jcid Date: Tue, 27 May 2008 21:06:38 +0200 Subject: - Made an input preserving decoder implementation. --- src/cache.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'src/cache.c') diff --git a/src/cache.c b/src/cache.c index 88cecc9b..dc8228f1 100644 --- a/src/cache.c +++ b/src/cache.c @@ -642,8 +642,8 @@ void a_Cache_process_dbuf(int Op, const char *buf, size_t buf_size, { int offset = 0; int len; + const char *str; CacheEntry_t *entry = Cache_entry_search(Url); - Dstr *dbuf; /* Assert a valid entry (not aborted) */ dReturn_if_fail (entry != NULL); @@ -690,25 +690,30 @@ void a_Cache_process_dbuf(int Op, const char *buf, size_t buf_size, if (!(entry->Flags & CA_GotHeader)) return; - entry->TransferSize += buf_size - offset; + str = buf + offset; + len = buf_size - offset; + entry->TransferSize += len; - dbuf = dStr_sized_new(buf_size - offset); - dStr_append_l(dbuf, buf + offset, buf_size - offset); - - /* Assert we have a Decoder. - * BUG: this is a workaround, more study and a proper design - * for handling redirects is required */ - if (entry->TransferDecoder != NULL) { - dbuf = a_Decode_process(entry->TransferDecoder, dbuf); + if (entry->TransferDecoder) { + Dstr *dbuf = a_Decode_process(entry->TransferDecoder, str, len); + str = dbuf->str; + len = dbuf->len; + dStr_free(dbuf, 0); } - if (entry->ContentDecoder != NULL) { - dbuf = a_Decode_process(entry->ContentDecoder, dbuf); + if (entry->ContentDecoder) { + Dstr *dbuf = a_Decode_process(entry->ContentDecoder, str, len); + if (entry->TransferDecoder) + dFree((char *)str); + str = dbuf->str; + len = dbuf->len; + dStr_free(dbuf, 0); } + dStr_append_l(entry->Data, str, len); + if (entry->TransferDecoder || entry->ContentDecoder) + dFree((char *)str); - dStr_append_l(entry->Data, dbuf->str, dbuf->len); if (entry->Data->len) entry->Flags &= ~CA_IsEmpty; - dStr_free(dbuf, 1); Cache_process_queue(entry); } -- cgit v1.2.3