@@ -4,12 +4,6 @@ module Sentry
44 class RequestInterface < Interface
55 REQUEST_ID_HEADERS = %w[ action_dispatch.request_id HTTP_X_REQUEST_ID ] . freeze
66 CONTENT_HEADERS = %w[ CONTENT_TYPE CONTENT_LENGTH ] . freeze
7- IP_HEADERS = [
8- "REMOTE_ADDR" ,
9- "HTTP_CLIENT_IP" ,
10- "HTTP_X_REAL_IP" ,
11- "HTTP_X_FORWARDED_FOR"
12- ] . freeze
137
148 # Regex to detect lowercase chars — match? is allocation-free (no MatchData/String)
159 LOWERCASE_PATTERN = /[a-z]/ . freeze
@@ -30,7 +24,7 @@ class RequestInterface < Interface
3024 # @return [String]
3125 attr_accessor :query_string
3226
33- # @return [String ]
27+ # @return [Hash ]
3428 attr_accessor :cookies
3529
3630 # @return [Hash]
@@ -40,33 +34,29 @@ class RequestInterface < Interface
4034 attr_accessor :env
4135
4236 # @param env [Hash]
43- # @param send_default_pii [Boolean]
37+ # @param data_collection [DataCollection]
38+ # @param send_default_pii [Boolean] Deprecated compatibility input; still gates legacy cookie,
39+ # body, query-string, and Authorization header collection until those categories are migrated.
4440 # @param rack_env_whitelist [Array]
41+ # @see Configuration#data_collection
4542 # @see Configuration#send_default_pii
4643 # @see Configuration#rack_env_whitelist
47- def initialize ( env :, send_default_pii :, rack_env_whitelist :)
44+ def initialize ( env :, data_collection : , send_default_pii :, rack_env_whitelist :)
4845 env = env . dup
49-
50- unless send_default_pii
51- # need to completely wipe out ip addresses
52- RequestInterface ::IP_HEADERS . each do |header |
53- env . delete ( header )
54- end
55- end
56-
5746 request = ::Rack ::Request . new ( env )
5847
5948 if send_default_pii
6049 self . data = read_data_from ( request )
61- self . cookies = request . cookies
6250 self . query_string = request . query_string
6351 end
6452
53+ self . cookies = data_collection . cookies . filter ( request . cookies , cookie : true )
6554 self . url = request . scheme && request . url . split ( "?" ) . first
6655 self . method = request . request_method
6756
68- self . headers = filter_and_format_headers ( env , send_default_pii )
69- self . env = filter_and_format_env ( env , rack_env_whitelist )
57+ collection = data_collection . http_headers . request
58+ self . headers = filter_and_format_headers ( env , collection )
59+ self . env = filter_and_format_env ( env , collection , rack_env_whitelist )
7060 end
7161
7262 private
@@ -86,14 +76,13 @@ def read_data_from(request)
8676 e . message
8777 end
8878
89- def filter_and_format_headers ( env , send_default_pii )
79+ def filter_and_format_headers ( env , collection )
9080 env . each_with_object ( { } ) do |( key , value ) , memo |
9181 begin
9282 key = key . to_s # rack env can contain symbols
9383 next memo [ "X-Request-Id" ] ||= Utils ::RequestId . read_from ( env ) if Utils ::RequestId ::REQUEST_ID_HEADERS . include? ( key )
9484 next if is_server_protocol? ( key , value , env [ "SERVER_PROTOCOL" ] )
9585 next if is_skippable_header? ( key )
96- next if key == "HTTP_AUTHORIZATION" && !send_default_pii
9786
9887 # Rack stores headers as HTTP_WHAT_EVER, we need What-Ever
9988 key = key . delete_prefix ( "HTTP_" )
@@ -107,12 +96,13 @@ def filter_and_format_headers(env, send_default_pii)
10796 Sentry . sdk_logger . warn ( LOGGER_PROGNAME ) { "Error raised while formatting headers: #{ e . message } " }
10897 next
10998 end
99+ end . then do |e |
100+ collection . filter ( e )
110101 end
111102 end
112103
113104 def is_skippable_header? ( key )
114105 key . match? ( LOWERCASE_PATTERN ) || # lower-case envs aren't real http headers
115- key == "HTTP_COOKIE" || # Cookies don't go here, they go somewhere else
116106 !( key . start_with? ( "HTTP_" ) || CONTENT_HEADERS . include? ( key ) )
117107 end
118108
@@ -134,11 +124,15 @@ def self.rack_3_or_above?
134124 Gem ::Version . new ( ::Rack . release ) >= Gem ::Version . new ( "3.0" )
135125 end
136126
137- def filter_and_format_env ( env , rack_env_whitelist )
138- return env if rack_env_whitelist . empty?
139-
140- env . select do |k , _v |
141- rack_env_whitelist . include? k . to_s
127+ def filter_and_format_env ( env , collection , rack_env_whitelist )
128+ if rack_env_whitelist . empty?
129+ env
130+ else
131+ env . select do |k , _v |
132+ rack_env_whitelist . include? k . to_s
133+ end
134+ end . then do |e |
135+ collection . filter ( e )
142136 end
143137 end
144138 end
0 commit comments