/usr/lib/ruby/1.8/innate/request.rb is in libinnate-ruby1.8 2010.07-1.
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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | module Innate
# Subclass Rack::Request and add some convenient methods.
#
# An instance is available via the #request method in your Node.
#
# NOTE:
# Please make sure to read the documentation of Rack::Request together with
# this, as there are a lot of features available.
#
# A list of methods from Rack::Request so you get a gist of it:
#
# ## Generally
#
# * body
# * cookies
# * env
# * fullpath
# * host
# * port
# * scheme
# * url
#
# ## ENV shortcuts
#
# * accept_encoding
# * content_charset
# * content_length
# * content_type
# * ip
# * media_type
# * media_type_params
# * path_info
# * path_info=
# * query_string
# * referrer
# * script_name
# * script_name=
# * xhr?
#
# ## Query request method
#
# * delete?
# * get?
# * head?
# * post?
# * put?
# * request_method
#
# ## parameter handling
#
# * []
# * []=
# * form_data?
# * params
# * values_at
class Request < Rack::Request
# Currently handled request from Thread.current[:request]
# Call it from anywhere via Innate::Request.current
def self.current
Current.request
end
# Let's allow #[] to act like #values_at.
#
# Usage given a GET request like /hey?foo=duh&bar=doh
#
# request[:foo, :bar] # => ['duh', 'doh']
#
# Both +value+ and the elements of +keys+ will be turned into String by #to_s.
def [](value, *keys)
return super(value) if keys.empty?
[value, *keys].map{|key| super(key) }
end
# the full request URI provided by Rack::Request
# e.g. "http://localhost:7000/controller/action?foo=bar.xhtml"
def request_uri
env['REQUEST_URI'] || env['PATH_INFO']
end
# Answers with a subset of request.params with only the key/value pairs for
# which you pass the keys.
# Valid keys are objects that respond to :to_s
#
# @example usage
#
# request.params
# # => {'name' => 'jason', 'age' => '45', 'job' => 'lumberjack'}
# request.subset('name')
# # => {'name' => 'jason'}
# request.subset(:name, :job)
# # => {'name' => 'jason', 'job' => 'lumberjack'}
def subset(*keys)
keys = keys.map{|key| key.to_s }
params.reject{|key, value| not keys.include?(key) }
end
# Try to figure out the domain we are running on, this might work for some
# deployments but fail for others, given the combination of servers in
# front.
#
# @example usage
#
# domain
# # => #<URI::HTTPS:0xb769ecb0 URL:https://localhost:7000/>
# domain('/foo')
# # => #<URI::HTTPS:0xb769ecb0 URL:https://localhost:7000/foo>
#
# @param [#to_s] path
#
# @return [URI]
#
# @api external
# @author manveru
def domain(path = nil, options = {})
uri = URI(self.url)
uri.path = path.to_s if path
uri.query = nil unless options[:keep_query]
uri
end
ipv4 = %w[ 127.0.0.1/32 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 ]
ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
LOCAL = (ipv4 + ipv6).map{|range| IPAddr.new(range)} unless defined?(LOCAL)
# Request is from a local network?
# Checks both IPv4 and IPv6
# Answer is true if the IP address making the request is from local network.
# Optional argument address can be used to check any IP address.
def local_net?(address = ip)
addr = IPAddr.new(address)
LOCAL.find{|range| range.include?(addr) }
rescue ArgumentError => ex
raise ArgumentError, ex unless ex.message == 'invalid address'
end
end
end
|