@@ -30,25 +30,19 @@ def clean_url(url)
3030
3131 begin
3232 uri = URI ( url )
33- rescue URI ::InvalidURIError
34- pre_query_string , _query_string = url . split ( '?' , 2 )
35-
36- return "#{ pre_query_string } ?#{ FILTERED } "
37- end
3833
39- return url unless uri . query
40-
41- query_params = uri . query . split ( '&' ) . map { |pair | pair . split ( '=' ) }
42- query_params . map! do |key , val |
43- if filters_match? ( key )
44- "#{ key } =#{ FILTERED } "
34+ if uri . is_a? ( URI ::MailTo )
35+ clean_mailto_url ( url , uri )
4536 else
46- " #{ key } = #{ val } "
37+ clean_generic_url ( url , uri )
4738 end
48- end
39+ rescue URI ::InvalidURIError
40+ pre_query_string , _query_string = url . split ( '?' , 2 )
4941
50- uri . query = query_params . join ( '&' )
51- uri . to_s
42+ "#{ pre_query_string } ?#{ FILTERED } "
43+ rescue StandardError
44+ FILTERED
45+ end
5246 end
5347
5448 ##
@@ -209,5 +203,33 @@ def scope_should_be_filtered?(scope)
209203 scope . start_with? ( "#{ scope_to_filter } ." )
210204 end
211205 end
206+
207+ def clean_generic_url ( original_url , uri )
208+ return original_url unless uri . query
209+
210+ query_params = uri . query . split ( '&' ) . map { |pair | pair . split ( '=' ) }
211+
212+ uri . query = filter_uri_parameter_array ( query_params ) . join ( '&' )
213+ uri . to_s
214+ end
215+
216+ def clean_mailto_url ( original_url , uri )
217+ return original_url unless uri . headers
218+
219+ # headers in mailto links can't contain square brackets so we replace
220+ # filtered parameters with 'FILTERED' instead of '[FILTERED]'
221+ uri . headers = filter_uri_parameter_array ( uri . headers , 'FILTERED' ) . join ( '&' )
222+ uri . to_s
223+ end
224+
225+ def filter_uri_parameter_array ( parameters , replacement = FILTERED )
226+ parameters . map do |key , value |
227+ if filters_match? ( key )
228+ "#{ key } =#{ replacement } "
229+ else
230+ "#{ key } =#{ value } "
231+ end
232+ end
233+ end
212234 end
213235end
0 commit comments