Name: js-handler/node_modules/restify/lib/plugins/full_response.js 
1:
// Copyright 2012 Mark Cavage, Inc.  All rights reserved.
2:
 
3:
var crypto = require('crypto');
4:
 
5:
var httpDate = require('../http_date');
6:
 
7:
 
8:
 
9:
///--- Globals
10:
 
11:
var ALLOW_HEADERS = [
12:
        'Accept',
13:
        'Accept-Version',
14:
        'Content-Length',
15:
        'Content-MD5',
16:
        'Content-Type',
17:
        'Date',
18:
        'Api-Version',
19:
        'Response-Time'
20:
].join(', ');
21:
 
22:
var EXPOSE_HEADERS = [
23:
        'Api-Version',
24:
        'Request-Id',
25:
        'Response-Time'
26:
].join(', ');
27:
 
28:
 
29:
 
30:
///--- API
31:
 
32:
function setHeaders(req, res) {
33:
        var hash;
34:
        var now = new Date();
35:
        var methods;
36:
 
37:
        if (!res.getHeader('Access-Control-Allow-Origin'))
38:
                res.setHeader('Access-Control-Allow-Origin', '*');
39:
 
40:
        if (!res.getHeader('Access-Control-Allow-Headers'))
41:
                res.setHeader('Access-Control-Allow-Headers', ALLOW_HEADERS);
42:
 
43:
        if (!res.getHeader('Access-Control-Allow-Methods')) {
44:
                if (res.methods && res.methods.length > 0) {
45:
                        methods = res.methods.join(', ');
46:
                        res.setHeader('Access-Control-Allow-Methods', methods);
47:
                }
48:
        }
49:
 
50:
        if (!res.getHeader('Access-Control-Expose-Headers'))
51:
                res.setHeader('Access-Control-Expose-Headers', EXPOSE_HEADERS);
52:
 
53:
        if (!res.getHeader('Connection')) {
54:
                res.setHeader('Connection',
55:
                              req.isKeepAlive() ? 'Keep-Alive' : 'close');
56:
        }
57:
 
58:
        if (res._data && !res.getHeader('Content-MD5')) {
59:
                hash = crypto.createHash('md5');
60:
                hash.update(res._data);
61:
                res.setHeader('Content-MD5', hash.digest('base64'));
62:
        }
63:
 
64:
        if (!res.getHeader('Date'))
65:
                res.setHeader('Date', httpDate(now));
66:
 
67:
        if (res.etag && !res.getHeader('Etag'))
68:
                res.setHeader('Etag', res.etag);
69:
 
70:
        if (!res.getHeader('Server'))
71:
                res.setHeader('Server', res.serverName);
72:
 
73:
        if (res.version && !res.getHeader('Api-Version'))
74:
                res.setHeader('Api-Version', res.version);
75:
 
76:
        if (!res.getHeader('Request-Id'))
77:
                res.setHeader('Request-Id', req.getId());
78:
 
79:
        if (!res.getHeader('Response-Time'))
80:
                res.setHeader('Response-Time', now.getTime() - req._time);
81:
 
82:
}
83:
 
84:
 
85:
 
86:
function fullResponse() {
87:
        function restifyResponseHeaders(req, res, next) {
88:
                res.once('header', function () {
89:
 
90:
                        // Restify 1.0 compatibility
91:
                        if (res.defaultResponseFormatters)
92:
                                res.defaultResponseFormatters(res._data);
93:
 
94:
                        res.emit('beforeSend', res._data, res._body);
95:
 
96:
                        // end backwards-compatibility
97:
                        return (setHeaders(req, res));
98:
                });
99:
 
100:
                return (next());
101:
        }
102:
 
103:
        return (restifyResponseHeaders);
104:
}
105:
 
106:
 
107:
 
108:
///--- Exports
109:
 
110:
module.exports = fullResponse;