From 6f44e6e7759a4bf57b9662754d8ea984d9a02eff Mon Sep 17 00:00:00 2001 From: Morten Sorvig Date: Fri, 4 Sep 2009 16:08:45 +0200 Subject: Add suport for never-expires data. Does not work yet --- src/eventqueue.cpp | 1 + src/webclientserver.cpp | 23 +++++++++++++++++++++-- src/webclientserver.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/eventqueue.cpp b/src/eventqueue.cpp index abffaea..bb4bc41 100644 --- a/src/eventqueue.cpp +++ b/src/eventqueue.cpp @@ -148,6 +148,7 @@ void EventQueue::handleStaticImageRequest(json_object* jsonRequest, HttpResponse quintptr imageid = staticImageHashToWidgetId.value(imageHash); QByteArray pngImage = staticCompressedImages.value(imageid); DEBUG << imageid << pngImage.count(); + response->setNeverExpires(); response->setBody(pngImage); response->setContentType("image/png"); } diff --git a/src/webclientserver.cpp b/src/webclientserver.cpp index 44d120e..0e32717 100644 --- a/src/webclientserver.cpp +++ b/src/webclientserver.cpp @@ -72,7 +72,7 @@ void HttpRequest::parseText() } HttpResponse::HttpResponse() -: contentType("text/html"), response304(false) { } +: contentType("text/html"), response304(false), neverExpires(false) { } void HttpResponse::setBody(const QByteArray &body) { @@ -99,6 +99,11 @@ void HttpResponse::set304Response() response304 = true; } +void HttpResponse::setNeverExpires() +{ + neverExpires = true; +} + bool HttpResponse::isHandled() const { return response304 || body.isEmpty() == false; @@ -125,7 +130,21 @@ QByteArray HttpResponse::toText() text+= "Set-Cookie: " + cookie + "\r\n"; } - if (eTag.isEmpty() == false) { + // Support three different caching strategies: + // 1. Never-expires. Useful when content has a unique + // name based on e.g. a hash of the content. Allows the + // user agent to get the content once and then cache it + // forever. + // 2. Etag. The url for the content stays the same, the + // etag changes with content changes. Allows the user agent + // to ask if a spesific url as been updated, and then skip + // the content download if not. + // 3. no-cache. For dynamic content. Not cached by the user-agent + // and is re-downloaded on each request. + if (neverExpires) { + text += QByteArray("Cache-control: max-age: 99999 \r\n"); // or -1? + text += "eTag: 24 \r\n"; + } else if (eTag.isEmpty() == false) { text += "eTag: " + eTag + "\r\n"; } else { text += QByteArray("Cace-control: no-cache \r\n"); diff --git a/src/webclientserver.h b/src/webclientserver.h index 2a08b7b..fa4818b 100644 --- a/src/webclientserver.h +++ b/src/webclientserver.h @@ -38,6 +38,7 @@ public: void setContentType(const QByteArray &contentType); void seteTag(const QByteArray &eTag); void set304Response(); + void setNeverExpires(); bool isHandled() const; QByteArray toText(); @@ -47,6 +48,7 @@ public: QByteArray contentType; QByteArray eTag; bool response304; + bool neverExpires; }; class Server; -- cgit v1.2.3