title: Measuring time on node.js http requests
body: <p>I was wondering if we can measure the time it takes for an http request to be completed using node.js. Modifying slightly an example from the documentation (<a href="http://nodejs.org/api/http.html#http_http_request_options_callback" rel="noreferrer">here</a>), one can easily write down the following code.<div class="snippet" data-lang="js" data-hide="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>var http = require('http');
  var stamp1 = new Date();
  var stamp2, stamp3, stamp4;
  var options = {
    hostname: 'www.google.com',
    port: 80,
    path: '/upload',
    method: 'POST'
  };
  
  var req = http.request(options, function(res) {
    stamp3 = new Date();
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      console.log('BODY: ' + chunk);
    });
    res.on('end', function () {
      stamp4 = new Date();
      console.log ("Stamp 3: " + stamp3);
      console.log ("Stamp 4: " + stamp4);
    });
  });
  req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
  });
  
  // write data to request body
  req.write('data\n');
  req.write('data\n');
  req.end();
  
  stamp2 = new Date();
  console.log ("Stamp 1: " + stamp1);
  console.log ("Stamp 2: " + stamp2);</code></pre>
  </div>
  </div>
  </p>
  
  <p>Now let me come to my point. On the response one can easily measure the time it takes for the response, since in the beginning stamp3 is set and on end stamp 4 is set. So, in principle for relatively large amounts of data these two timestamps will be different.</p>
  
  <p>However, the question that I have is whether stamps 1 and 2 actually measure what is happening when the request is being prepared and dispatched. In other words, is req.write(....) a synchronous operation? Based on node.js principles I would expect req.write(...) to be an asynchronous operation where one can pass an arbitrarily large document and then upon successful completion we can have a callback knowing that the request has finished.</p>
  
  <p>Comments?</p>