Guest User

Untitled

a guest
Jul 18th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. fs = require('fs');
  2. http = require('http');
  3. url = require('url');
  4. crypto = require('crypto');
  5. path = require('path');
  6. sys = require('sys');
  7. memcached = require('./lib/memcached-v1');
  8. config = require('./lib/config').init((process.argv[2] == null) ? 'config.json' : process.argv[2]);
  9. log = require('./lib/log');
  10.  
  11. log.init(config);
  12.  
  13. client = new memcached('localhost:11211');
  14. server = http.createServer(null);
  15. hash = crypto.createHash('md5');
  16. data = new memcached.Chunk();
  17. tag = new memcached.Chunk();
  18. magic = new Buffer('module.exports.flush', 'utf8');
  19. config.node.magicBuffer = new Buffer('module.exports.' + config.node.call, 'utf8');
  20.  
  21. server.addListener('request', function(request, response) {
  22. target = path.join(process.cwd(), url.parse(request.url).pathname);
  23.  
  24. console.log('Serving ' + target);
  25.  
  26. data.assignClient(client);
  27. data.key = config.memcached.prefix + ':data:' + target;
  28.  
  29. tag.assignClient(client);
  30. tag.key = config.memcached.prefix + ':hash:' + target;
  31.  
  32. data.get(function(cached) {
  33. if (cached && false) {
  34. console.log('extracting ' + target + ' from memcached');
  35. tag.get(function(tag) {
  36. if (request.headers['if-none-match'] == tag) {
  37. console.log('not modified');
  38. response.writeHead(304, 'Not modified');
  39. response.end();
  40. }
  41. else {
  42. console.log('sending cached content');
  43. response.writeHead(200, 'OK - memcached', { 'ETag' : tag, 'Content-Encoding' : 'utf-8', 'Strict-Transport-Security' : 'max-age=15768000 ; includeSubDomains'});
  44. response.end(cached);
  45. }
  46. });
  47. }
  48. else {
  49. fs.stat(target, function(err, stats) {
  50. if (err) {
  51. console.log("stat failed: " + err);
  52. switch (err) {
  53. case 2: console.log("no such file or directory");
  54. response.writeHead(404);
  55. response.end();
  56. break;
  57. case 13:// permission denied
  58. response.writeHead(403);
  59. response.end();
  60. break;
  61. default:
  62. response.writeHead(500);
  63. response.end();
  64. break;
  65. }
  66. }
  67. else {
  68. fs.open(target, 'r', 0666, function(err, fd) {
  69. if(err) {
  70. response.writeHead(500);
  71. response.end();
  72. }
  73. else {
  74. scan = (path.extname(target) == '.js');
  75. dyn = false;
  76. data.value = new Buffer(stats.size);
  77. fs.read(fd, data.value, 0, stats.size, 0, function(err, bytesRead) {
  78. if (bytesRead >= config.node.magicBuffer.length && scan) {
  79. scan = false;
  80. if (compareBuffers(data.value, config.node.magicBuffer)) {
  81. dyn = true;
  82. fs.close(fd, function() {
  83. log.append(7, 'Executing node.js module \'' + target + '\'.');
  84. require(target.substring(0, target.length - 3)).flush(request, response);
  85. });
  86. }
  87. }
  88. if (bytesRead == stats.size && !scan && !dyn) {
  89. hash.update(data.value);
  90. tag.value = hash.digest('base64');
  91. response.writeHead(200, {'ETag': tag.value});
  92. response.end(data.value);
  93. data.value = data.value.toString('binary');
  94. data.set(3600, function(reponse) {
  95. log.append(8, 'refreshed ' + data.key);
  96. });
  97. tag.set(3600, function(reponse) {
  98. log.append(8, 'refreshed ' + tag.key + ' ' + tag.value);
  99. });
  100. }
  101. });
  102. }
  103. });
  104. }
  105. });
  106. }
  107. });
  108. });
  109.  
  110. function compareBuffers(a, b) {
  111. len = (a.length < b.length) ? a.length : b.length;
  112. for (i = 0; i < len; i++)
  113. if (a[i] != b[i])
  114. return false;
  115. return true;
  116. }
  117.  
  118. server.listen(config.server.port, config.server.host);
Add Comment
Please, Sign In to add comment