Blame view

node_modules/fresh/index.js 1.7 KB
f7563de62   Palak Handa   first commit
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
  /*!
   * fresh
   * Copyright(c) 2012 TJ Holowaychuk
   * Copyright(c) 2016-2017 Douglas Christopher Wilson
   * MIT Licensed
   */
  
  'use strict'
  
  /**
   * RegExp to check for no-cache token in Cache-Control.
   * @private
   */
  
  var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/
  
  /**
   * Simple expression to split token list.
   * @private
   */
  
  var TOKEN_LIST_REGEXP = / *, */
  
  /**
   * Module exports.
   * @public
   */
  
  module.exports = fresh
  
  /**
   * Check freshness of the response using request and response headers.
   *
   * @param {Object} reqHeaders
   * @param {Object} resHeaders
   * @return {Boolean}
   * @public
   */
  
  function fresh (reqHeaders, resHeaders) {
    // fields
    var modifiedSince = reqHeaders['if-modified-since']
    var noneMatch = reqHeaders['if-none-match']
  
    // unconditional request
    if (!modifiedSince && !noneMatch) {
      return false
    }
  
    // Always return stale when Cache-Control: no-cache
    // to support end-to-end reload requests
    // https://tools.ietf.org/html/rfc2616#section-14.9.4
    var cacheControl = reqHeaders['cache-control']
    if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
      return false
    }
  
    // if-none-match
    if (noneMatch && noneMatch !== '*') {
      var etag = resHeaders['etag']
      var etagStale = !etag || noneMatch.split(TOKEN_LIST_REGEXP).every(function (match) {
        return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag
      })
  
      if (etagStale) {
        return false
      }
    }
  
    // if-modified-since
    if (modifiedSince) {
      var lastModified = resHeaders['last-modified']
      var modifiedStale = !lastModified || Date.parse(lastModified) > Date.parse(modifiedSince)
  
      if (modifiedStale) {
        return false
      }
    }
  
    return true
  }