« index

Coverage for /Users/yunong/workspace/node-restify/lib/plugins/full_response.js : 92%

106 lines | 98 run | 8 missing | 3 partial | 18 blocks | 15 blocks run | 3 blocks missing

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

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

  // Copyright 2012 Mark Cavage, Inc.  All rights reserved.
  
  var crypto = require('crypto');
  
  var httpDate = require('../http_date');
  
  
  ///--- Globals
  
  var ALLOW_HEADERS = [
      'Accept',
      'Accept-Version',
      'Content-Length',
      'Content-MD5',
      'Content-Type',
      'Date',
      'Api-Version',
      'Response-Time'
  ].join(', ');
  
  var EXPOSE_HEADERS = [
      'Api-Version',
      'Request-Id',
      'Response-Time'
  ].join(', ');
  
  
  ///--- API
  
  function setHeaders(req, res) {
      var hash;
      var now = new Date();
      var methods;
  
      if (!res.getHeader('Access-Control-Allow-Origin'))
          res.setHeader('Access-Control-Allow-Origin', '*');
  
      if (!res.getHeader('Access-Control-Allow-Headers'))
          res.setHeader('Access-Control-Allow-Headers', ALLOW_HEADERS);
  
      if (!res.getHeader('Access-Control-Allow-Methods')) {
          if (res.methods && res.methods.length > 0) {
              methods = res.methods.join(', ');
              res.setHeader('Access-Control-Allow-Methods', methods);
          }
      }
  
      if (!res.getHeader('Access-Control-Expose-Headers'))
          res.setHeader('Access-Control-Expose-Headers', EXPOSE_HEADERS);
  
      if (!res.getHeader('Connection')) {
          res.setHeader('Connection',
              req.isKeepAlive() ? 'Keep-Alive' : 'close');
      }
  
      if (res._data && !res.getHeader('Content-MD5'))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.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'))
          res.setHeader('Response-Time', now.getTime() - req._time);
  
  }
  
  
  function fullResponse() {
      function restifyResponseHeaders(req, res, next) {
          res.once('header', function () {
  
              // 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;
« index | cover.io