Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fs = require('fs');
- http = require('http');
- url = require('url');
- crypto = require('crypto');
- path = require('path');
- sys = require('sys');
- memcached = require('./lib/memcached-v1');
- config = require('./lib/config').init((process.argv[2] == null) ? 'config.json' : process.argv[2]);
- log = require('./lib/log');
- log.init(config);
- client = new memcached('localhost:11211');
- server = http.createServer(null);
- hash = crypto.createHash('md5');
- data = new memcached.Chunk();
- tag = new memcached.Chunk();
- magic = new Buffer('module.exports.flush', 'utf8');
- config.node.magicBuffer = new Buffer('module.exports.' + config.node.call, 'utf8');
- server.addListener('request', function(request, response) {
- target = path.join(process.cwd(), url.parse(request.url).pathname);
- console.log('Serving ' + target);
- data.assignClient(client);
- data.key = config.memcached.prefix + ':data:' + target;
- tag.assignClient(client);
- tag.key = config.memcached.prefix + ':hash:' + target;
- data.get(function(cached) {
- if (cached && false) {
- console.log('extracting ' + target + ' from memcached');
- tag.get(function(tag) {
- if (request.headers['if-none-match'] == tag) {
- console.log('not modified');
- response.writeHead(304, 'Not modified');
- response.end();
- }
- else {
- console.log('sending cached content');
- response.writeHead(200, 'OK - memcached', { 'ETag' : tag, 'Content-Encoding' : 'utf-8', 'Strict-Transport-Security' : 'max-age=15768000 ; includeSubDomains'});
- response.end(cached);
- }
- });
- }
- else {
- fs.stat(target, function(err, stats) {
- if (err) {
- console.log("stat failed: " + err);
- switch (err) {
- case 2: console.log("no such file or directory");
- response.writeHead(404);
- response.end();
- break;
- case 13:// permission denied
- response.writeHead(403);
- response.end();
- break;
- default:
- response.writeHead(500);
- response.end();
- break;
- }
- }
- else {
- fs.open(target, 'r', 0666, function(err, fd) {
- if(err) {
- response.writeHead(500);
- response.end();
- }
- else {
- scan = (path.extname(target) == '.js');
- dyn = false;
- data.value = new Buffer(stats.size);
- fs.read(fd, data.value, 0, stats.size, 0, function(err, bytesRead) {
- if (bytesRead >= config.node.magicBuffer.length && scan) {
- scan = false;
- if (compareBuffers(data.value, config.node.magicBuffer)) {
- dyn = true;
- fs.close(fd, function() {
- log.append(7, 'Executing node.js module \'' + target + '\'.');
- require(target.substring(0, target.length - 3)).flush(request, response);
- });
- }
- }
- if (bytesRead == stats.size && !scan && !dyn) {
- hash.update(data.value);
- tag.value = hash.digest('base64');
- response.writeHead(200, {'ETag': tag.value});
- response.end(data.value);
- data.value = data.value.toString('binary');
- data.set(3600, function(reponse) {
- log.append(8, 'refreshed ' + data.key);
- });
- tag.set(3600, function(reponse) {
- log.append(8, 'refreshed ' + tag.key + ' ' + tag.value);
- });
- }
- });
- }
- });
- }
- });
- }
- });
- });
- function compareBuffers(a, b) {
- len = (a.length < b.length) ? a.length : b.length;
- for (i = 0; i < len; i++)
- if (a[i] != b[i])
- return false;
- return true;
- }
- server.listen(config.server.port, config.server.host);
Add Comment
Please, Sign In to add comment