dl
Version:
DreamLab Libs
175 lines (143 loc) • 6.42 kB
JavaScript
var Core = require('core');
var Request = Core.http.Request;
var BinaryData = Core.data.BinaryData;
var OnetHeadersFilter = function () {};
OnetHeadersFilter.filter = function (req, res) {
var method = req.getMethod(),
statusCode = res.getStatusCode(),
contentType = res.getHeader('content-type'),
cacheControl = res.getHeader('cache-control'),
expires = res.getHeader('expires'),
pragma = res.getHeader('pragma'),
body = res.getBody(),
nowDate = new Date().toUTCString(),
yearBackDate = new Date(),
nowPlus7Days = new Date(),
nType = false;
yearBackDate.setDate(yearBackDate.getDate() - 365);
yearBackDate = yearBackDate.toUTCString();
nowPlus7Days.setDate(nowPlus7Days.getDate() + 7);
nowPlus7Days = nowPlus7Days.toUTCString();
// typy dla ktorych cachujemy wewnatrz onetu
// ale do klienta zwracamy ze nie wolno cachowac
if (contentType) {
nType = contentType.indexOf('html') > -1 ||
contentType.indexOf('xml') > -1 ||
contentType.indexOf('json') > -1 ||
contentType.indexOf('text/plain') > -1;
}
// ustawiam domyslny charset dla stron typu nType
if (contentType && nType && res.getCharset() == null) {
res.setHeader(
'content-type',
contentType + '; charset=' + OnetHeadersFilter.CHARSET,
true
);
contentType = res.getHeader('content-type');
}
// ustawiam domyslny date
if (res.getHeader('date') == null) {
res.setHeader('date', nowDate, true);
}
// zawsze nadpisuje naglowek server
res.setHeader('server', OnetHeadersFilter.SERVER, true);
/* TODO: wylaczone do czasu przeniesienia isDevelView
if (req.isDevelView()) {
// jezeli jest wlaczone devel view albo status jest inny niz 200 OK
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
} else if (!statusCode) {*/
if (!statusCode) {
res.setStatusCode(503);
res.setBody(new BinaryData(
OnetHeadersFilter.E503_MSG,
BinaryData.Encoding.TEXT,
BinaryData.CharacterEncoding.UTF8
));
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
res.setHeader('retry-after', '4', true);
} else if (statusCode == 503) {
res.setBody(new BinaryData(
OnetHeadersFilter.E503_MSG,
BinaryData.Encoding.TEXT,
BinaryData.CharacterEncoding.UTF8
));
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
res.setHeader('retry-after', '4', true);
} else if (statusCode != 200) {
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
} else if (!body || body.length() < 1) {
// obsluga pustych stron
res.setStatusCode(503);
res.setBody(new BinaryData(
OnetHeadersFilter.E503_MSG,
BinaryData.Encoding.TEXT,
BinaryData.CharacterEncoding.UTF8
));
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
res.setHeader('retry-after', '4', true);
} else if (method == Request.POST) {
if (nType && cacheControl == 'server') {
res.setHeader('cache-control', 'private', true);
} else {
res.setHeader('cache-control', 'no-cache', true);
}
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
} else if (method == Request.GET) {
if (nType && cacheControl == 'server') {
res.setHeader('cache-control', 'max-age=120', true);
res.setHeader('expires', yearBackDate, true);
res.setHeader('x-onet-squid', 'SP/1', true);
res.removeHeader('pragma');
} else if (nType) {
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
} else if (cacheControl == 'server') {
res.setHeader('cache-control', 'max-age=3600', true);
res.setHeader('expires', nowPlus7Days, true);
res.removeHeader('x-onet-squid');
// przekazuje pragma takie jak bylo
} else if (!cacheControl || cacheControl == 'no-cache') {
res.setHeader('cache-control', 'no-cache', true);
res.setHeader('expires', yearBackDate, true);
res.removeHeader('x-onet-squid');
res.setHeader('pragma', 'no-cache', true);
} else {
// przekazuje cache-control takie jak bylo
if (!expires) {
res.setHeader('expires', yearBackDate, true);
}
res.removeHeader('x-onet-squid');
if (!pragma) {
res.setHeader('pragma', 'no-cache', true);
}
}
}
};
OnetHeadersFilter.SERVER = 'edgeserver';
OnetHeadersFilter.E503_MSG = '<html><head><title>Operacja w toku</title><me' +
'ta http-equiv=Refresh content=4><meta http-equiv=Content-Type content=' +
'"text/html; charset=iso-8859-2"></head><body style="cursor: wait"><fon' +
't face="verdana, arial, geneva, helvetica, lucida, sans-serif" size=2 ' +
'style="font-size: 12px">Trwa laczenie z serwerem, prosze czekac...</fo' +
'nt></body></html>';
OnetHeadersFilter.CHARSET = 'utf8';
exports.OnetHeadersFilter = OnetHeadersFilter;