Improve avatar caching

pull/8193/head
Rodrigo Nascimento 8 years ago
parent 56fd1cc813
commit 07bc92d28b
No known key found for this signature in database
GPG Key ID: CFCE33B7B01AC335
  1. 14
      packages/rocketchat-file-upload/server/config/FileSystem.js
  2. 70
      packages/rocketchat-file-upload/server/config/GridFS.js
  3. 15
      server/startup/avatar.js

@ -36,16 +36,6 @@ const FileSystemAvatars = new FileUploadClass({
// store setted bellow
get(file, req, res) {
const reqModifiedHeader = req.headers['if-modified-since'];
if (reqModifiedHeader) {
if (reqModifiedHeader === (file.uploadedAt && file.uploadedAt.toUTCString())) {
res.setHeader('Last-Modified', reqModifiedHeader);
res.writeHead(304);
res.end();
return;
}
}
const filePath = this.store.getFilePath(file._id, file);
try {
@ -53,10 +43,6 @@ const FileSystemAvatars = new FileUploadClass({
if (stat && stat.isFile()) {
file = FileUpload.addExtensionTo(file);
res.setHeader('Content-Disposition', 'inline');
res.setHeader('Last-Modified', file.uploadedAt.toUTCString());
res.setHeader('Content-Type', file.type);
res.setHeader('Content-Length', file.size);
this.store.getReadStream(file._id, file).pipe(res);
}

@ -64,7 +64,7 @@ const getByteRange = function(header) {
// code from: https://github.com/jalik/jalik-ufs/blob/master/ufs-server.js#L310
const readFromGridFS = function(storeName, fileId, file, headers, req, res) {
const readFromGridFS = function(storeName, fileId, file, req, res) {
const store = UploadFS.getStore(storeName);
const rs = store.getReadStream(fileId, file);
const ws = new stream.PassThrough();
@ -82,7 +82,7 @@ const readFromGridFS = function(storeName, fileId, file, headers, req, res) {
const accept = req.headers['accept-encoding'] || '';
// Transform stream
store.transformRead(rs, ws, fileId, file, req, headers);
store.transformRead(rs, ws, fileId, file, req);
const range = getByteRange(req.headers.range);
let out_of_range = false;
if (range) {
@ -91,34 +91,34 @@ const readFromGridFS = function(storeName, fileId, file, headers, req, res) {
// Compress data using gzip
if (accept.match(/\bgzip\b/) && range === null) {
headers['Content-Encoding'] = 'gzip';
delete headers['Content-Length'];
res.writeHead(200, headers);
res.setHeader('Content-Encoding', 'gzip');
res.removeHeader('Content-Length');
res.writeHead(200);
ws.pipe(zlib.createGzip()).pipe(res);
} else if (accept.match(/\bdeflate\b/) && range === null) {
// Compress data using deflate
headers['Content-Encoding'] = 'deflate';
delete headers['Content-Length'];
res.writeHead(200, headers);
res.setHeader('Content-Encoding', 'deflate');
res.removeHeader('Content-Length');
res.writeHead(200);
ws.pipe(zlib.createDeflate()).pipe(res);
} else if (range && out_of_range) {
// out of range request, return 416
delete headers['Content-Length'];
delete headers['Content-Type'];
delete headers['Content-Disposition'];
delete headers['Last-Modified'];
headers['Content-Range'] = `bytes */${ file.size }`;
res.writeHead(416, headers);
res.removeHeader('Content-Length');
res.removeHeader('Content-Type');
res.removeHeader('Content-Disposition');
res.removeHeader('Last-Modified');
res.setHeader('Content-Range', `bytes */${ file.size }`);
res.writeHead(416);
res.end();
} else if (range) {
headers['Content-Range'] = `bytes ${ range.start }-${ range.stop }/${ file.size }`;
delete headers['Content-Length'];
headers['Content-Length'] = range.stop - range.start + 1;
res.writeHead(206, headers);
res.setHeader('Content-Range', `bytes ${ range.start }-${ range.stop }/${ file.size }`);
res.removeHeader('Content-Length');
res.setHeader('Content-Length', range.stop - range.start + 1);
res.writeHead(206);
logger.debug('File upload extracting range');
ws.pipe(new ExtractRange({ start: range.start, stop: range.stop })).pipe(res);
} else {
res.writeHead(200, headers);
res.writeHead(200);
ws.pipe(res);
}
};
@ -140,13 +140,13 @@ new FileUploadClass({
get(file, req, res) {
file = FileUpload.addExtensionTo(file);
const headers = {
'Content-Disposition': `attachment; filename*=UTF-8''${ encodeURIComponent(file.name) }`,
'Last-Modified': file.uploadedAt.toUTCString(),
'Content-Type': file.type,
'Content-Length': file.size
};
return readFromGridFS(file.store, file._id, file, headers, req, res);
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${ encodeURIComponent(file.name) }`);
res.setHeader('Last-Modified', file.uploadedAt.toUTCString());
res.setHeader('Content-Type', file.type);
res.setHeader('Content-Length', file.size);
return readFromGridFS(file.store, file._id, file, req, res);
}
});
@ -154,22 +154,8 @@ new FileUploadClass({
name: 'GridFS:Avatars',
get(file, req, res) {
const reqModifiedHeader = req.headers['if-modified-since'];
if (reqModifiedHeader && reqModifiedHeader === (file.uploadedAt && file.uploadedAt.toUTCString())) {
res.setHeader('Last-Modified', reqModifiedHeader);
res.writeHead(304);
res.end();
return;
}
file = FileUpload.addExtensionTo(file);
const headers = {
'Cache-Control': 'public, max-age=0',
'Expires': '-1',
'Content-Disposition': 'inline',
'Last-Modified': file.uploadedAt.toUTCString(),
'Content-Type': file.type,
'Content-Length': file.size
};
return readFromGridFS(file.store, file._id, file, headers, req, res);
return readFromGridFS(file.store, file._id, file, req, res);
}
});

@ -39,6 +39,21 @@ Meteor.startup(function() {
if (file) {
res.setHeader('Content-Security-Policy', 'default-src \'none\'');
const reqModifiedHeader = req.headers['if-modified-since'];
if (reqModifiedHeader && reqModifiedHeader === (file.uploadedAt && file.uploadedAt.toUTCString())) {
res.setHeader('Last-Modified', reqModifiedHeader);
res.writeHead(304);
res.end();
return;
}
res.setHeader('Cache-Control', 'public, max-age=0');
res.setHeader('Expires', '-1');
res.setHeader('Content-Disposition', 'inline');
res.setHeader('Last-Modified', file.uploadedAt.toUTCString());
res.setHeader('Content-Type', file.type);
res.setHeader('Content-Length', file.size);
return FileUpload.get(file, req, res);
} else {
res.setHeader('Content-Type', 'image/svg+xml');

Loading…
Cancel
Save