summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Sorvig <msorvig@trolltech.com>2009-09-04 16:08:45 +0200
committerMorten Sorvig <msorvig@trolltech.com>2009-09-04 16:08:45 +0200
commit6f44e6e7759a4bf57b9662754d8ea984d9a02eff (patch)
tree47e1e783d0160f17b9ef7670112c9a0e564b27b4
parent74659abee1f79da324b2222808392f5782aa8123 (diff)
Add suport for never-expires data. Does not work yet
-rw-r--r--src/eventqueue.cpp1
-rw-r--r--src/webclientserver.cpp23
-rw-r--r--src/webclientserver.h2
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;