title: s3 streaming with etags (node)
body: <p>We are streaming content from S3 in node using <code>createReadStream()</code> in aws-sdk.  We would like to add etag support.  If we add the 'If-None-Match' header from the client, s3 throws NotModified as an error that I can't seem to handle.  </p>
  
  <pre><code>retrieveFile = function(req, res) {
      var s3 = new AWS.S3(); 
      var params = {
          Bucket: bucket,
          key: key
      };
      if (req.get('If-None-Match')) {
          params.IfNoneMatch = req.get('If-None-Match');
      }
      return s3.getObject(params).on('httpHeaders', function(statusCode, headers) {
          if (headers.etag) {
              res.set('etag', headers.etag);
          }
          if (headers['content-length']) {
              return res.set('content-length', headers['content-length']);
          }
      }).createReadStream().pipe(res);
  };
  </code></pre>
  
  <p>I've tried listening to events on the stream and using callbacks on the Request returned from getObject.  I can get the error's message that way, but something else in aws-sdk appears to be killing my process.  </p>
  
  <pre><code>/Projects/my-app/node_modules/aws-sdk/lib/request.js:31
              throw err;
              ^
  
  NotModified: null
    at Request.extractError (/Projects/my-app/node_modules/aws-sdk/lib/services/s3.js:519:35)
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/request.js:673:14)
    at Request.transition (/Projects/my-app/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.&lt;anonymous&gt; (/Projects/my-app/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.&lt;anonymous&gt; (/Projects/my-app/node_modules/aws-sdk/lib/request.js:675:12)
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/request.js:673:14)
    at Request.transition (/Projects/my-app/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.&lt;anonymous&gt; (/Projects/my-app/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.&lt;anonymous&gt; (/Projects/my-app/node_modules/aws-sdk/lib/request.js:675:12)
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
    at callNextListener (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:95:12)
    at IncomingMessage.onEnd (/Projects/my-app/node_modules/aws-sdk/lib/event_listeners.js:244:11)
    at emitNone (events.js:91:20)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:974:12)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)
  </code></pre>