--- /dev/null
+package dolda.jsvc.util;
+
+import dolda.jsvc.*;
+import java.util.*;
+
+public class Cache {
+ public static void checkmtime(Request req, long mtime) {
+ /* Since the HTTP time format is (reasonably enough) precise
+ * only to seconds, any extra milliseconds must be trimmed
+ * off, or the mtime will almost certainly not match. */
+ Date mdate = new Date((mtime / 1000) * 1000);
+ String ims = req.inheaders().get("If-Modified-Since");
+ if(ims != null) {
+ Date cldate;
+ try {
+ cldate = Http.parsedate(ims);
+ } catch(java.text.ParseException e) {
+ throw(Restarts.stdresponse(400, "The If-Modified-Since header is not parseable."));
+ }
+ if(mdate.compareTo(cldate) <= 0) {
+ req.status(304);
+ req.outheaders().put("Content-Length", "0");
+ throw(Restarts.done());
+ }
+ }
+ req.outheaders().put("Last-Modified", Http.fmtdate(mdate));
+ }
+}
public static RequestRestart stdresponse(int code) {
return(stdresponse(code, "An error occurred", Misc.statustext(code)));
}
+
+ public static RequestRestart done() {
+ return(new RequestRestart() {
+ public void respond(Request req) {
+ }
+ });
+ }
}
}
if(in == null)
throw(Restarts.stdresponse(404));
- String ims = req.inheaders().get("If-Modified-Since");
- Date mtime = new Date((req.ctx().starttime() / 1000) * 1000);
- if(ims != null) {
- Date d;
- try {
- d = Http.parsedate(ims);
- } catch(java.text.ParseException e) {
- throw(Restarts.stdresponse(400));
- }
- if(mtime.compareTo(d) <= 0) {
- req.status(304);
- req.outheaders().put("Content-Length", "0");
- return;
- }
- }
+ Cache.checkmtime(req, req.ctx().starttime());
try {
try {
req.outheaders().put("Content-Type", mimetype);
- req.outheaders().put("Last-Modified", Http.fmtdate(mtime));
Misc.cpstream(in, req.output());
} finally {
in.close();