wzp
2021-05-13 7d694a9113118daec5be7ac224dab46a3b20f106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright 2012 Mark Cavage, Inc.  All rights reserved.
 
'use strict';
 
var crypto = require('crypto');
var httpDate = require('./utils/httpDate');
var hrTimeDurationInMs = require('./utils/hrTimeDurationInMs');
 
///--- API
 
function setHeaders(req, res) {
    var hash;
    var now = new Date();
 
    if (!res.getHeader('Connection')) {
        res.setHeader('Connection', req.isKeepAlive() ? 'Keep-Alive' : 'close');
    }
 
    if (res._data && !res.getHeader('Content-MD5')) {
        hash = crypto.createHash('md5');
        hash.update(res._data);
        res.setHeader('Content-MD5', hash.digest('base64'));
    }
 
    if (!res.getHeader('Date')) {
        res.setHeader('Date', httpDate(now));
    }
 
    if (res.etag && !res.getHeader('Etag')) {
        res.setHeader('Etag', res.etag);
    }
 
    if (!res.getHeader('Server')) {
        res.setHeader('Server', res.serverName);
    }
 
    if (res.version && !res.getHeader('Api-Version')) {
        res.setHeader('Api-Version', res.version);
    }
 
    if (!res.getHeader('Request-Id')) {
        res.setHeader('Request-Id', req.getId());
    }
 
    if (!res.getHeader('Response-Time')) {
        // we cannot use req._timeFlushed here as
        // the response is not flushed yet
        res.setHeader(
            'Response-Time',
            hrTimeDurationInMs(req._timeStart, process.hrtime())
        );
    }
}
 
/**
 * handles disappeared CORS headers.
 * https://github.com/restify/node-restify/issues/284
 *
 * @public
 * @function fullResponse
 * @returns  {Function} Handler
 */
function fullResponse() {
    function restifyResponseHeaders(req, res, next) {
        res.once('header', function onceHeader() {
            // Restify 1.0 compatibility
            if (res.defaultResponseFormatters) {
                res.defaultResponseFormatters(res._data);
            }
 
            res.emit('beforeSend', res._data, res._body);
 
            // end backwards-compatibility
            return setHeaders(req, res);
        });
 
        return next();
    }
 
    return restifyResponseHeaders;
}
 
///--- Exports
 
module.exports = fullResponse;