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; |
