Question

In my nodeJS app, I'd like to generate ETags for all the content that I return to the client. I need the ETag to be based off the actual content of the file instead of the date, so that the same file across different node processes has the same ETag.

Right now, I am doing the following:

var fs = require('fs'), crypto = require('crypto');
fs.readFile(pathToFile, function(err, buf){
  var eTag = crypto.createHash('md5').update(buf).digest('hex');
  res.writeHead(200, {'ETag': '"' + eTag + '"','Content-Type':contentType});
  res.end(buf);
});

I am not sure what encodings I should be using for the different crypto functions in order to have a proper system in place. Should I be using something other than hex? Should I get the fs.readFile call to return a hex encoded buffer? If so, will doing so impact the content returned to users?

Best, and Thanks,
Sami

Was it helpful?

Solution

You're doing it fine. There is no reason to encode the file in any special format, and using hex for the output is pretty standard. The requirements, loosely speaking, are:

  • the same document should always return the same ETag
  • any changes in the document causes a change in ETag
  • the ETag data should fit neatly into an HTTP header
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top