This file is indexed.

/usr/lib/ruby/vendor_ruby/merb-core/controller/mixins/conditional_get.rb is in ruby-merb-core 1.1.3+dfsg-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
107
108
109
110
111
112
113
114
115
# Provides conditional get support in Merb core.
# Conditional get support is intentionally
# simple and does not do fancy stuff like making
# ETag value from Ruby objects for you.
#
# The most interesting method for end user is
# +request_fresh?+ that is used after setting of
# last modification time or ETag:
#
# 
# @example
#   def show
#     self.etag = Digest::SHA1.hexdigest(calculate_cache_key(params))
#
#     if request_fresh?
#       self.status = 304
#       return ''
#     else
#       @product = Product.get(params[:id])
#       display @product
#     end
#   end
module Merb::ConditionalGetMixin

  # Sets ETag response header by calling #to_s on the argument
  #
  # @param tag [#to_s] value of ETag header
  #
  # @return [String] value of ETag header enclosed in double quotes as required by the RFC
  #
  # @api public
  def etag=(tag)
    headers[Merb::Const::ETAG] = %("#{tag}")
  end

  # Value of the ETag header
  #
  # @return [String] Value of ETag response header if set.
  # @return [nil] If ETag header not set.
  #
  # @api public
  def etag
    headers[Merb::Const::ETAG]
  end

  # Test to see if the request's Etag matches the one supplied locally
  #
  # @return [true] if ETag response header equals If-None-Match request header
  # @return [true] if it does not.
  #
  # @api public
  def etag_matches?(tag = self.etag)
    tag == self.request.if_none_match
  end

  # Sets Last-Modified response header
  #
  # @param time [Time,DateTime] The last modified time of the resource
  #
  # @return [String] The last modified time of the resource in the format required by the RFC
  #
  # @api public
  def last_modified=(time)
    time = time.to_time if time.is_a?(DateTime)
    # time.utc.strftime("%a, %d %b %Y %X") if we could rely on locale being American
    headers[Merb::Const::LAST_MODIFIED] = time.httpdate
  end

  # Value of the Last-Modified header
  #
  # @return [Time] Value of Last-Modified response header if set.
  # @return [nil] If Last-Modified not set.
  #
  # @api public
  def last_modified
    last_mod = headers[Merb::Const::LAST_MODIFIED]
    Time.rfc2822(last_mod) if last_mod
  end

  # Test to see if the request's If-Modified-Since is satisfied
  #
  # @param time [Time] Time to test if the If-Modified-Since header against
  #
  # @return [true] Last-Modified response header is < than If-Modified-Since request header
  # @return [false] otherwise
  #
  # @api public
  def not_modified?(time = self.last_modified)
    if !request.if_modified_since.nil? and !time.nil?
      time <= request.if_modified_since
    else
      false
    end
  end

  # Tests freshness of response using all supplied validators
  #
  # A response with no validators is always stale.
  #
  # @return [true] ETag matches and entity is not modified
  # @return [false] One or more validators failed, or none were supplied
  #
  # @api public
  def request_fresh?
    # make sure we have something to compare too.
    return false unless last_modified or etag

    fresh = true

    # only check if we have set the right headers
    fresh &&= etag_matches?(self.etag) if etag
    fresh &&= not_modified?(self.last_modified) if last_modified
    fresh
  end
end