Caching favicon node client connection for speed.

This commit is contained in:
Samuel Clay 2012-04-07 14:59:12 -07:00
parent b5edf68df9
commit 04afabc411
2 changed files with 42 additions and 34 deletions

View file

@ -2,27 +2,30 @@ express = require 'express'
mongo = require 'mongodb' mongo = require 'mongodb'
MONGODB_SERVER = if process.env.NODE_ENV == 'dev' then 'localhost' else 'db04' MONGODB_SERVER = if process.env.NODE_ENV == 'dev' then 'localhost' else 'db04'
db = new mongo.Db('newsblur', new mongo.Server(MONGODB_SERVER, 27017)) server = new mongo.Server(MONGODB_SERVER, 27017,
auto_reconnect: true
poolSize: 12)
db = new mongo.Db('newsblur', server)
app = express.createServer() app = express.createServer()
app.use express.bodyParser() app.use express.bodyParser()
db.open (err, @client) => db.open (err, client) =>
client.collection "feed_icons", (err, @collection) =>
app.get /^\/rss_feeds\/icon\/(\d+)\/?/, (req, res) => app.get /^\/rss_feeds\/icon\/(\d+)\/?/, (req, res) =>
# console.log "Req: #{req.params}" # console.log "Req: #{req.params}"
feed_id = parseInt(req.params, 10) feed_id = parseInt(req.params, 10)
@client.collection "feed_icons", (err, collection) -> @collection.findOne _id: feed_id, (err, docs) ->
collection.findOne _id: feed_id, (err, docs) -> if not err and docs and docs.data
if not err and docs and docs.data etag = req.header('If-None-Match')
etag = req.header('If-None-Match') if etag and docs.color == etag
if etag and docs.color == etag res.send 304
res.send 304
else
res.header 'etag', docs.color
res.send new Buffer(docs.data, 'base64'),
"Content-Type": "image/png"
else else
res.redirect '/media/img/icons/silk/world.png' res.header 'etag', docs.color
res.send new Buffer(docs.data, 'base64'),
"Content-Type": "image/png"
else
res.redirect '/media/img/icons/silk/world.png'
app.listen 3030 app.listen 3030

View file

@ -1,5 +1,5 @@
(function() { (function() {
var MONGODB_SERVER, app, db, express, mongo, var MONGODB_SERVER, app, db, express, mongo, server,
_this = this; _this = this;
express = require('express'); express = require('express');
@ -8,38 +8,43 @@
MONGODB_SERVER = process.env.NODE_ENV === 'dev' ? 'localhost' : 'db04'; MONGODB_SERVER = process.env.NODE_ENV === 'dev' ? 'localhost' : 'db04';
db = new mongo.Db('newsblur', new mongo.Server(MONGODB_SERVER, 27017)); server = new mongo.Server(MONGODB_SERVER, 27017, {
auto_reconnect: true,
poolSize: 12
});
db = new mongo.Db('newsblur', server);
app = express.createServer(); app = express.createServer();
app.use(express.bodyParser()); app.use(express.bodyParser());
db.open(function(err, client) { db.open(function(err, client) {
_this.client = client; return client.collection("feed_icons", function(err, collection) {
_this.collection = collection;
});
}); });
app.get(/^\/rss_feeds\/icon\/(\d+)\/?/, function(req, res) { app.get(/^\/rss_feeds\/icon\/(\d+)\/?/, function(req, res) {
var feed_id; var feed_id;
feed_id = parseInt(req.params, 10); feed_id = parseInt(req.params, 10);
return _this.client.collection("feed_icons", function(err, collection) { return _this.collection.findOne({
return collection.findOne({ _id: feed_id
_id: feed_id }, function(err, docs) {
}, function(err, docs) { var etag;
var etag; if (!err && docs && docs.data) {
if (!err && docs && docs.data) { etag = req.header('If-None-Match');
etag = req.header('If-None-Match'); if (etag && docs.color === etag) {
if (etag && docs.color === etag) { return res.send(304);
return res.send(304);
} else {
res.header('etag', docs.color);
return res.send(new Buffer(docs.data, 'base64'), {
"Content-Type": "image/png"
});
}
} else { } else {
return res.redirect('/media/img/icons/silk/world.png'); res.header('etag', docs.color);
return res.send(new Buffer(docs.data, 'base64'), {
"Content-Type": "image/png"
});
} }
}); } else {
return res.redirect('/media/img/icons/silk/world.png');
}
}); });
}); });