Do some HTTP caching, because we have all of the information to make it easy.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3764 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2022-01-15 19:05:59 +00:00
parent b8068b9ed1
commit e927ff915b

View File

@ -374,27 +374,27 @@ async function wellKnownHandler(request, response, path) {
} }
} }
function sendData(response, data, type) { function sendData(response, data, type, headers) {
if (data) { if (data) {
if (startsWithBytes(data, [0xff, 0xd8, 0xff, 0xdb]) || if (startsWithBytes(data, [0xff, 0xd8, 0xff, 0xdb]) ||
startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01]) || startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01]) ||
startsWithBytes(data, [0xff, 0xd8, 0xff, 0xee]) || startsWithBytes(data, [0xff, 0xd8, 0xff, 0xee]) ||
startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe1, null, null, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00])) { startsWithBytes(data, [0xff, 0xd8, 0xff, 0xe1, null, null, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00])) {
response.writeHead(200, {"Content-Type": "image/jpeg", "Content-Length": data.byteLength}); response.writeHead(200, Object.assign({"Content-Type": "image/jpeg", "Content-Length": data.byteLength}, headers || {}));
response.end(data); response.end(data);
} else if (startsWithBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) { } else if (startsWithBytes(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {
response.writeHead(200, {"Content-Type": "image/png", "Content-Length": data.byteLength}); response.writeHead(200, Object.assign({"Content-Type": "image/png", "Content-Length": data.byteLength}, headers || {}));
response.end(data); response.end(data);
} else if (startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]) || } else if (startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]) ||
startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61])) { startsWithBytes(data, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61])) {
response.writeHead(200, {"Content-Type": "image/gif", "Content-Length": data.byteLength}); response.writeHead(200, Object.assign({"Content-Type": "image/gif", "Content-Length": data.byteLength}, headers || {}));
response.end(data); response.end(data);
} else { } else {
response.writeHead(200, {"Content-Type": type || "text/javascript; charset=utf-8", "Content-Length": data.byteLength}); response.writeHead(200, Object.assign({"Content-Type": type || "text/javascript; charset=utf-8", "Content-Length": data.byteLength}, headers || {}));
response.end(data); response.end(data);
} }
} else { } else {
response.writeHead(404, {"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}); response.writeHead(404, Object.assign({"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}, headers || {}));
response.end("File not found"); response.end("File not found");
} }
} }
@ -446,16 +446,24 @@ async function blobHandler(request, response, blobId, uri) {
if (match = /^\/\~(\w+)\/(\w+)$/.exec(blobId)) { if (match = /^\/\~(\w+)\/(\w+)$/.exec(blobId)) {
var id = await new Database(match[1]).get('path:' + match[2]); var id = await new Database(match[1]).get('path:' + match[2]);
if (id) { if (id) {
data = await getBlobOrContent(id); if (request.headers['if-none-match'] && request.headers['if-none-match'] == '"' + id + '"') {
if (match[3]) { response.writeHead(304, {});
var app = JSON.parse(data); response.end();
data = app.files[match[3]]; } else {
data = await getBlobOrContent(id);
if (match[3]) {
var app = JSON.parse(data);
data = app.files[match[3]];
}
sendData(response, data, undefined, {etag: '"' + id + '"'});
} }
} else {
sendData(response, data);
} }
} else { } else {
data = await getBlobOrContent(blobId); data = await getBlobOrContent(blobId);
sendData(response, data);
} }
sendData(response, data);
} else if (uri == "/save") { } else if (uri == "/save") {
let newBlobId = await ssb.blobStore(request.body); let newBlobId = await ssb.blobStore(request.body);
@ -478,23 +486,33 @@ async function blobHandler(request, response, blobId, uri) {
} else { } else {
var data; var data;
var type; var type;
var headers;
if (match = /^\/\~(\w+)\/(\w+)$/.exec(blobId)) { if (match = /^\/\~(\w+)\/(\w+)$/.exec(blobId)) {
var db = new Database(match[1]); var db = new Database(match[1]);
var id = await db.get('path:' + match[2]); var id = await db.get('path:' + match[2]);
if (id) { if (id) {
data = utf8Decode(await getBlobOrContent(id)); if (request.headers['if-none-match'] && request.headers['if-none-match'] == '"' + id + '"') {
var app = JSON.parse(data); response.writeHead(304, {});
data = app.files[uri.substring(1)]; response.end();
data = await getBlobOrContent(data); } else {
type = guessType(uri); data = utf8Decode(await getBlobOrContent(id));
var app = JSON.parse(data);
data = app.files[uri.substring(1)];
data = await getBlobOrContent(data);
type = guessType(uri);
headers = {'ETag': '"' + id + '"'};
sendData(response, data, type, headers);
}
} else {
sendData(response, data, type, headers);
} }
} else { } else {
data = utf8Decode(await getBlobOrContent(blobId)); data = utf8Decode(await getBlobOrContent(blobId));
var app = JSON.parse(data); var app = JSON.parse(data);
data = app.files[uri.substring(1)]; data = app.files[uri.substring(1)];
data = await getBlobOrContent(data); data = await getBlobOrContent(data);
sendData(response, data, type, headers);
} }
sendData(response, data, type);
} }
} }
} }