airbrake-ruby 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2498350f956db613816b9cf8ae1579a01b0ca940
4
- data.tar.gz: 3bafaf42dc712d226ac97b3ad5690f923ff49cc6
3
+ metadata.gz: ab4ce2485ab1b938a76f15f2b71d92db0fe6e0e2
4
+ data.tar.gz: a48ae79d2523577c1400d2ed6b914e5340e9f5ff
5
5
  SHA512:
6
- metadata.gz: 097a7a2681e0d28b020ea43a918b96ed0c89167a96d7b8146f27bac98682d95b61431ffe6eb1d78d278068b6321e4c28f196dec021c8a7fb7ed31c7e6465cc3d
7
- data.tar.gz: 3cfdaaf798e0b85835126535434bb10bff78422b1b8890e924cf881b2b3843f0230eea43eaf6efdf0f9e3296941c2e85c217d71d6ed69b8caae3ae94be4baec7
6
+ metadata.gz: 05d26b46d931156979aa32411b8d722c46023056eee2d0545be53df86a26e5ee565640a59999ddd37d1b947db44f113ac6dc636df5e9b6cb800682d66ef87c55
7
+ data.tar.gz: ec26b798eb2c9139ffbd44a0bd42385886663fade0ddcab147ea0b6d68b94c4635813398fe9c2b0b4e87398d26099751d016900e3b026cfac79acd0dc29d9998
@@ -69,6 +69,11 @@ module Airbrake
69
69
  # for special cases where we need to work around older implementations
70
70
  RUBY_19 = RUBY_VERSION.start_with?('1.9')
71
71
 
72
+ ##
73
+ # @return [Boolean] true if current Ruby is Ruby 2.0.*. The result is used
74
+ # for special cases where we need to work around older implementations
75
+ RUBY_20 = RUBY_VERSION.start_with?('2.0')
76
+
72
77
  ##
73
78
  # A Hash that holds all notifiers. The keys of the Hash are notifier
74
79
  # names, the values are Airbrake::Notifier instances.
@@ -188,42 +193,6 @@ module Airbrake
188
193
  call_notifier(notifier, __method__, filter, &block)
189
194
  end
190
195
 
191
- ##
192
- # Specifies which keys should *not* be filtered. All other keys will be
193
- # substituted with the +[Filtered]+ label.
194
- #
195
- # @macro proxy_method
196
- # @example
197
- # Airbrake.whitelist([:email, /user/i, 'account_id'])
198
- #
199
- # @param [Array<String, Symbol, Regexp>] keys The keys, which shouldn't be
200
- # filtered
201
- # @return [void]
202
- # @since v5.0.0
203
- # @see .blacklist_keys
204
- # @deprecated Please use {Airbrake::Config#whitelist_keys} instead
205
- def whitelist_keys(keys, notifier = :default)
206
- call_notifier(notifier, __method__, keys)
207
- end
208
-
209
- ##
210
- # Specifies which keys *should* be filtered. Such keys will be replaced with
211
- # the +[Filtered]+ label.
212
- #
213
- # @macro proxy_method
214
- # @example
215
- # Airbrake.blacklist_keys([:email, /credit/i, 'password'])
216
- #
217
- # @param [Array<String, Symbol, Regexp>] keys The keys, which should be
218
- # filtered
219
- # @return [void]
220
- # @since v5.0.0
221
- # @see .whitelist_keys
222
- # @deprecated Please use {Airbrake::Config#blacklist_keys} instead
223
- def blacklist_keys(keys, notifier = :default)
224
- call_notifier(notifier, __method__, keys)
225
- end
226
-
227
196
  ##
228
197
  # Builds an Airbrake notice. This is useful, if you want to add or modify a
229
198
  # value only for a specific notice. When you're done modifying the notice,
@@ -151,7 +151,7 @@ module Airbrake
151
151
  return false unless defined?(ExecJS::RuntimeError)
152
152
  return true if exception.is_a?(ExecJS::RuntimeError)
153
153
 
154
- if Airbrake::RUBY_19
154
+ if Airbrake::RUBY_19 || Airbrake::RUBY_20
155
155
  # Ruby 1.9 doesn't support Exception#cause. We work around this by
156
156
  # parsing backtraces. It's slow, so we check only a few first frames.
157
157
  exception.backtrace[0..2].each do |frame|
@@ -2,7 +2,7 @@ module Airbrake
2
2
  module Filters
3
3
  ##
4
4
  # A default Airbrake notice filter. Filters only specific keys listed in the
5
- # list of parameters in the modifiable payload of a notice.
5
+ # list of parameters in the payload of a notice.
6
6
  #
7
7
  # @example
8
8
  # filter = Airbrake::Filters::KeysBlacklist.new(:email, /credit/i, 'password')
@@ -13,13 +13,20 @@ module Airbrake
13
13
  # @return [String] The label to replace real values of filtered payload
14
14
  FILTERED = '[Filtered]'.freeze
15
15
 
16
+ ##
17
+ # @return [Array<String,Symbol,Regexp>] the array of classes instances of
18
+ # which can compared with payload keys
19
+ VALID_PATTERN_CLASSES = [String, Symbol, Regexp].freeze
20
+
16
21
  ##
17
22
  # Creates a new KeysBlacklist or KeysWhitelist filter that uses the given
18
23
  # +patterns+ for filtering a notice's payload.
19
24
  #
20
25
  # @param [Array<String,Regexp,Symbol>] patterns
21
- def initialize(*patterns)
26
+ def initialize(logger, *patterns)
27
+ @logger = logger
22
28
  @patterns = patterns
29
+ @valid_patterns = false
23
30
  end
24
31
 
25
32
  ##
@@ -30,6 +37,11 @@ module Airbrake
30
37
  # @return [void]
31
38
  # @see FilterChain
32
39
  def call(notice)
40
+ unless @valid_patterns
41
+ eval_proc_patterns!
42
+ validate_patterns
43
+ end
44
+
33
45
  FILTERABLE_KEYS.each { |key| filter_hash(notice[key]) }
34
46
 
35
47
  if notice[:context][:user]
@@ -86,6 +98,28 @@ module Airbrake
86
98
  return unless url.query
87
99
  notice[:context][:url] = filter_url_params(url)
88
100
  end
101
+
102
+ def eval_proc_patterns!
103
+ return unless @patterns.any? { |pattern| pattern.is_a?(Proc) }
104
+
105
+ @patterns = @patterns.flat_map do |pattern|
106
+ next(pattern) unless pattern.respond_to?(:call)
107
+ pattern.call
108
+ end
109
+ end
110
+
111
+ def validate_patterns
112
+ @valid_patterns = @patterns.all? do |pattern|
113
+ VALID_PATTERN_CLASSES.any? { |c| pattern.is_a?(c) }
114
+ end
115
+
116
+ return if @valid_patterns
117
+
118
+ @logger.error(
119
+ "#{LOG_LABEL} one of the patterns in #{self.class} is invalid. " \
120
+ "Known patterns: #{@patterns}"
121
+ )
122
+ end
89
123
  end
90
124
  end
91
125
  end
@@ -1,8 +1,8 @@
1
1
  module Airbrake
2
2
  module Filters
3
3
  ##
4
- # A default Airbrake notice filter. Filters everything in the modifiable
5
- # payload of a notice, but specified keys.
4
+ # A default Airbrake notice filter. Filters everything in the payload of a
5
+ # notice, but specified keys.
6
6
  #
7
7
  # @example
8
8
  # filter = Airbrake::Filters::KeysWhitelist.new(:email, /user/i, 'account_id')
@@ -57,17 +57,14 @@ module Airbrake
57
57
  def initialize(config, exception, params = {})
58
58
  @config = config
59
59
 
60
- @private_payload = {
61
- notifier: NOTIFIER
62
- }.freeze
63
-
64
- @modifiable_payload = {
60
+ @payload = {
65
61
  errors: NestedException.new(exception, @config.logger).as_json,
66
62
  context: context(params),
67
63
  environment: {},
68
64
  session: {},
69
65
  params: params
70
66
  }
67
+
71
68
  extract_custom_attributes(exception)
72
69
 
73
70
  @truncator = PayloadTruncator.new(PAYLOAD_MAX_SIZE, @config.logger)
@@ -82,7 +79,7 @@ module Airbrake
82
79
  def to_json
83
80
  loop do
84
81
  begin
85
- json = payload.to_json
82
+ json = @payload.to_json
86
83
  rescue *JSON_EXCEPTIONS => ex
87
84
  @config.logger.debug("#{LOG_LABEL} `notice.to_json` failed: #{ex.class}: #{ex}")
88
85
  else
@@ -100,7 +97,7 @@ module Airbrake
100
97
  # @see #ignored?
101
98
  # @note Ignored noticed can't be unignored
102
99
  def ignore!
103
- @modifiable_payload = nil
100
+ @payload = nil
104
101
  end
105
102
 
106
103
  ##
@@ -109,21 +106,21 @@ module Airbrake
109
106
  # @return [Boolean]
110
107
  # @see #ignore!
111
108
  def ignored?
112
- @modifiable_payload.nil?
109
+ @payload.nil?
113
110
  end
114
111
 
115
112
  ##
116
- # Reads a value from notice's modifiable payload.
113
+ # Reads a value from notice's payload.
117
114
  # @return [Object]
118
115
  #
119
116
  # @raise [Airbrake::Error] if the notice is ignored
120
117
  def [](key)
121
118
  raise_if_ignored
122
- @modifiable_payload[key]
119
+ @payload[key]
123
120
  end
124
121
 
125
122
  ##
126
- # Writes a value to the modifiable payload hash. Restricts unrecognized
123
+ # Writes a value to the payload hash. Restricts unrecognized
127
124
  # writes.
128
125
  # @example
129
126
  # notice[:params][:my_param] = 'foobar'
@@ -137,7 +134,7 @@ module Airbrake
137
134
  raise_if_unrecognized_key(key)
138
135
  raise_if_non_hash_value(value)
139
136
 
140
- @modifiable_payload[key] = value.to_hash
137
+ @payload[key] = value.to_hash
141
138
  end
142
139
 
143
140
  private
@@ -178,17 +175,13 @@ module Airbrake
178
175
  raise Airbrake::Error, "Got #{value.class} value, wanted a Hash"
179
176
  end
180
177
 
181
- def payload
182
- @modifiable_payload.merge(@private_payload)
183
- end
184
-
185
178
  def truncate_payload
186
- @modifiable_payload[:errors].each do |error|
179
+ @payload[:errors].each do |error|
187
180
  @truncator.truncate_error(error)
188
181
  end
189
182
 
190
183
  Filters::FILTERABLE_KEYS.each do |key|
191
- @truncator.truncate_object(@modifiable_payload[key])
184
+ @truncator.truncate_object(@payload[key])
192
185
  end
193
186
 
194
187
  new_max_size = @truncator.reduce_max_size
@@ -196,7 +189,7 @@ module Airbrake
196
189
  @config.logger.error(
197
190
  "#{LOG_LABEL} truncation failed. File an issue at " \
198
191
  "https://github.com/airbrake/airbrake-ruby " \
199
- "and attach the following payload: #{payload}"
192
+ "and attach the following payload: #{@payload}"
200
193
  )
201
194
  end
202
195
 
@@ -218,7 +211,7 @@ module Airbrake
218
211
  return unless attributes
219
212
 
220
213
  begin
221
- @modifiable_payload.merge!(attributes)
214
+ @payload.merge!(attributes)
222
215
  rescue TypeError
223
216
  @config.logger.error(
224
217
  "#{LOG_LABEL} #{exception.class}#to_airbrake failed:" \
@@ -36,13 +36,7 @@ module Airbrake
36
36
 
37
37
  @filter_chain = FilterChain.new(@config)
38
38
 
39
- if @config.blacklist_keys.any?
40
- add_filter(Filters::KeysBlacklist.new(*@config.blacklist_keys))
41
- end
42
-
43
- if @config.whitelist_keys.any?
44
- add_filter(Filters::KeysWhitelist.new(*@config.whitelist_keys))
45
- end
39
+ add_filters_for_config_keys
46
40
 
47
41
  @async_sender = AsyncSender.new(@config)
48
42
  @sync_sender = SyncSender.new(@config)
@@ -71,28 +65,6 @@ module Airbrake
71
65
  @filter_chain.add_filter(block_given? ? block : filter)
72
66
  end
73
67
 
74
- ##
75
- # @macro see_public_api_method
76
- # @deprecated Please use {Airbrake::Config#whitelist_keys} instead
77
- def whitelist_keys(keys)
78
- @config.logger.warn(
79
- "#{LOG_LABEL} Airbrake.whitelist_keys is deprecated. Please use the " \
80
- "whitelist_keys option instead (https://goo.gl/sQwpYN)"
81
- )
82
- add_filter(Filters::KeysWhitelist.new(*keys))
83
- end
84
-
85
- ##
86
- # @macro see_public_api_method
87
- # @deprecated Please use {Airbrake::Config#blacklist_keys} instead
88
- def blacklist_keys(keys)
89
- @config.logger.warn(
90
- "#{LOG_LABEL} Airbrake.blacklist_keys is deprecated. Please use the " \
91
- "blacklist_keys option instead (https://goo.gl/jucrFt)"
92
- )
93
- add_filter(Filters::KeysBlacklist.new(*keys))
94
- end
95
-
96
68
  ##
97
69
  # @macro see_public_api_method
98
70
  def build_notice(exception, params = {})
@@ -171,5 +143,15 @@ module Airbrake
171
143
  return caller_copy if clean_bt.empty?
172
144
  clean_bt
173
145
  end
146
+
147
+ def add_filters_for_config_keys
148
+ if @config.blacklist_keys.any?
149
+ add_filter(Filters::KeysBlacklist.new(@config.logger, *@config.blacklist_keys))
150
+ end
151
+
152
+ return if @config.whitelist_keys.none?
153
+
154
+ add_filter(Filters::KeysWhitelist.new(@config.logger, *@config.whitelist_keys))
155
+ end
174
156
  end
175
157
  end
@@ -67,12 +67,10 @@ module Airbrake
67
67
  end
68
68
 
69
69
  def proxy_params
70
- if @config.proxy.key?(:host)
71
- [@config.proxy[:host],
72
- @config.proxy[:port],
73
- @config.proxy[:user],
74
- @config.proxy[:password]]
75
- end
70
+ return unless @config.proxy.key?(:host)
71
+
72
+ [@config.proxy[:host], @config.proxy[:port], @config.proxy[:user],
73
+ @config.proxy[:password]]
76
74
  end
77
75
  end
78
76
  end
@@ -4,5 +4,5 @@
4
4
  module Airbrake
5
5
  ##
6
6
  # @return [String] the library version
7
- AIRBRAKE_RUBY_VERSION = '1.5.0'.freeze
7
+ AIRBRAKE_RUBY_VERSION = '1.6.0'.freeze
8
8
  end
@@ -176,14 +176,6 @@ RSpec.describe Airbrake do
176
176
  end
177
177
  end
178
178
 
179
- describe ".whitelist_keys" do
180
- include_examples 'non-configured notifier handling', :whitelist_keys
181
- end
182
-
183
- describe ".blacklist_keys" do
184
- include_examples 'non-configured notifier handling', :blacklist_keys
185
- end
186
-
187
179
  describe ".build_notice" do
188
180
  include_examples 'non-configured notifier handling', :build_notice
189
181
  end
@@ -472,268 +472,6 @@ RSpec.describe Airbrake::Notifier do
472
472
  end
473
473
  end
474
474
 
475
- describe "#blacklist_keys" do
476
- describe "the list of arguments" do
477
- it "accepts regexps" do
478
- @airbrake.blacklist_keys(/\Abin/)
479
-
480
- @airbrake.notify_sync(ex, bingo: 'bango')
481
-
482
- expect(
483
- a_request(:post, endpoint).
484
- with(body: /"params":{"bingo":"\[Filtered\]"}/)
485
- ).to have_been_made.once
486
- end
487
-
488
- it "accepts symbols" do
489
- @airbrake.blacklist_keys(:bingo)
490
-
491
- @airbrake.notify_sync(ex, bingo: 'bango')
492
-
493
- expect(
494
- a_request(:post, endpoint).
495
- with(body: /"params":{"bingo":"\[Filtered\]"}/)
496
- ).to have_been_made.once
497
- end
498
-
499
- it "accepts strings" do
500
- @airbrake.blacklist_keys('bingo')
501
-
502
- @airbrake.notify_sync(ex, bingo: 'bango', bbingoo: 'bbangoo')
503
-
504
- expect(
505
- a_request(:post, endpoint).
506
- with(body: /"params":{"bingo":"\[Filtered\]","bbingoo":"bbangoo"}/)
507
- ).to have_been_made.once
508
- end
509
- end
510
-
511
- describe "hash values" do
512
- context "non-recursive" do
513
- it "filters nested hashes" do
514
- @airbrake.blacklist_keys('bish')
515
-
516
- @airbrake.notify_sync(ex, bongo: { bish: 'bash' })
517
-
518
- expect(
519
- a_request(:post, endpoint).
520
- with(body: /"params":{"bongo":{"bish":"\[Filtered\]"}}/)
521
- ).to have_been_made.once
522
- end
523
- end
524
-
525
- context "recursive" do
526
- it "filters recursive hashes" do
527
- @airbrake.blacklist_keys('bango')
528
-
529
- bongo = { bingo: {} }
530
- bongo[:bingo][:bango] = bongo
531
-
532
- @airbrake.notify_sync(ex, bongo)
533
-
534
- expect(
535
- a_request(:post, endpoint).
536
- with(body: /"params":{"bingo":{"bango":"\[Filtered\]"}}/)
537
- ).to have_been_made.once
538
- end
539
- end
540
- end
541
-
542
- it "filters query parameters correctly" do
543
- @airbrake.blacklist_keys(%w(bish))
544
-
545
- notice = @airbrake.build_notice(ex)
546
- notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash&color=%23FFAAFF'
547
-
548
- @airbrake.notify_sync(notice)
549
-
550
- # rubocop:disable Metrics/LineLength
551
- expected_body =
552
- %r("context":{.*"url":"http://localhost:3000/crash\?foo=bar&baz=bongo&bish=\[Filtered\]&color=%23FFAAFF".*})
553
- # rubocop:enable Metrics/LineLength
554
-
555
- expect(
556
- a_request(:post, endpoint).
557
- with(body: expected_body)
558
- ).to have_been_made.once
559
- end
560
-
561
- it "filters out user" do
562
- @airbrake.blacklist_keys('user')
563
-
564
- notice = @airbrake.build_notice(ex)
565
- notice[:context][:user] = { id: 1337, name: 'Bingo Bango' }
566
-
567
- @airbrake.notify_sync(notice)
568
-
569
- expect_a_request_with_body(/"user":"\[Filtered\]"/)
570
- end
571
-
572
- it "filters out individual user fields" do
573
- @airbrake.blacklist_keys('name')
574
-
575
- notice = @airbrake.build_notice(ex)
576
- notice[:context][:user] = { id: 1337, name: 'Bingo Bango' }
577
-
578
- @airbrake.notify_sync(notice)
579
-
580
- expect_a_request_with_body(/"user":{"id":1337,"name":"\[Filtered\]"}/)
581
- end
582
- end
583
-
584
- describe "#whitelist_keys" do
585
- describe "the list of arguments" do
586
- it "accepts regexes" do
587
- @airbrake.whitelist_keys(/\Abin/)
588
-
589
- @airbrake.notify_sync(ex, bingo: 'bango', bongo: 'bish', bash: 'bosh')
590
-
591
- body = /"params":{"bingo":"bango","bongo":"\[Filtered\]","bash":"\[Filtered\]"}/
592
-
593
- expect(
594
- a_request(:post, endpoint).
595
- with(body: body)
596
- ).to have_been_made.once
597
- end
598
-
599
- it "accepts symbols" do
600
- @airbrake.whitelist_keys(:bongo)
601
-
602
- @airbrake.notify_sync(ex, bingo: 'bango', bongo: 'bish', bash: 'bosh')
603
-
604
- body = /"params":{"bingo":"\[Filtered\]","bongo":"bish","bash":"\[Filtered\]"}/
605
-
606
- expect(
607
- a_request(:post, endpoint).
608
- with(body: body)
609
- ).to have_been_made.once
610
- end
611
-
612
- it "accepts strings" do
613
- @airbrake.whitelist_keys('bash')
614
-
615
- @airbrake.notify_sync(
616
- ex,
617
- bingo: 'bango',
618
- bongo: 'bish',
619
- bash: 'bosh',
620
- bbashh: 'bboshh'
621
- )
622
-
623
- expect(
624
- a_request(:post, endpoint).
625
- with(
626
- body: /"params":{"bingo":"\[Filtered\]","bongo":"\[Filtered\]",
627
- "bash":"bosh","bbashh":"\[Filtered\]"}/x
628
- )
629
- ).to have_been_made.once
630
- end
631
- end
632
-
633
- describe "hash values" do
634
- context "non-recursive" do
635
- it "filters out everything but the provided keys" do
636
- @airbrake.whitelist_keys(%w(bongo bish))
637
-
638
- @airbrake.notify_sync(ex, bingo: 'bango', bongo: { bish: 'bash' })
639
-
640
- expect(
641
- a_request(:post, endpoint).
642
- with(body: /"params":{"bingo":"\[Filtered\]","bongo":{"bish":"bash"}}/)
643
- ).to have_been_made.once
644
- end
645
- end
646
-
647
- context "recursive" do
648
- it "errors when nested hashes are not filtered" do
649
- @airbrake.whitelist_keys(%w(bingo bango))
650
-
651
- bongo = { bingo: {} }
652
- bongo[:bingo][:bango] = bongo
653
-
654
- if RUBY_ENGINE == 'jruby'
655
- # JRuby might raise two different exceptions, which represent the
656
- # same thing. One is a Java exception, the other is a Ruby
657
- # exception. It's probably a JRuby bug:
658
- # https://github.com/jruby/jruby/issues/1903
659
- begin
660
- expect do
661
- @airbrake.notify_sync(ex, bongo)
662
- end.to raise_error(SystemStackError)
663
- rescue RSpec::Expectations::ExpectationNotMetError
664
- expect do
665
- @airbrake.notify_sync(ex, bongo)
666
- end.to raise_error(java.lang.StackOverflowError)
667
- end
668
- else
669
- expect do
670
- @airbrake.notify_sync(ex, bongo)
671
- end.to raise_error(SystemStackError)
672
- end
673
- end
674
- end
675
- end
676
-
677
- describe "context/url" do
678
- it "filters query parameters correctly" do
679
- @airbrake.whitelist_keys(%w(bish))
680
-
681
- notice = @airbrake.build_notice(ex)
682
- notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash'
683
-
684
- @airbrake.notify_sync(notice)
685
-
686
- # rubocop:disable Metrics/LineLength
687
- expected_body =
688
- %r("context":{.*"url":"http://localhost:3000/crash\?foo=\[Filtered\]&baz=\[Filtered\]&bish=bash".*})
689
- # rubocop:enable Metrics/LineLength
690
-
691
- expect(
692
- a_request(:post, endpoint).
693
- with(body: expected_body)
694
- ).to have_been_made.once
695
- end
696
-
697
- context "given a non-standard URL" do
698
- it "leaves the URL unfiltered" do
699
- @airbrake.whitelist_keys(%w(bish))
700
-
701
- notice = @airbrake.build_notice(ex)
702
- notice[:context][:url] =
703
- 'http://localhost:3000/cra]]]sh?foo=bar&baz=bongo&bish=bash'
704
-
705
- @airbrake.notify_sync(notice)
706
-
707
- # rubocop:disable Metrics/LineLength
708
- expected_body =
709
- %r("context":{.*"url":"http://localhost:3000/cra\]\]\]sh\?foo=bar&baz=bongo&bish=bash".*})
710
- # rubocop:enable Metrics/LineLength
711
-
712
- expect(
713
- a_request(:post, endpoint).
714
- with(body: expected_body)
715
- ).to have_been_made.once
716
- end
717
- end
718
-
719
- context "given a URL without a query" do
720
- it "skips params filtering and leaves the URL untouched" do
721
- @airbrake.whitelist_keys(%w(bish))
722
-
723
- notice = @airbrake.build_notice(ex)
724
- notice[:context][:url] = 'http://localhost:3000/crash'
725
-
726
- @airbrake.notify_sync(notice)
727
-
728
- expect(
729
- a_request(:post, endpoint).
730
- with(body: %r("context":{.*"url":"http://localhost:3000/crash".*}))
731
- ).to have_been_made.once
732
- end
733
- end
734
- end
735
- end
736
-
737
475
  describe "#build_notice" do
738
476
  it "builds a notice from exception" do
739
477
  expect(@airbrake.build_notice(ex)).to be_an Airbrake::Notice
@@ -0,0 +1,192 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "Airbrake::Notifier blacklist_keys" do
4
+ def expect_a_request_with_body(body)
5
+ expect(a_request(:post, endpoint).with(body: body)).to have_been_made.once
6
+ end
7
+
8
+ let(:project_id) { 105138 }
9
+ let(:project_key) { 'fd04e13d806a90f96614ad8e529b2822' }
10
+ let(:localhost) { 'http://localhost:8080' }
11
+
12
+ let(:endpoint) do
13
+ "https://airbrake.io/api/v3/projects/#{project_id}/notices?key=#{project_key}"
14
+ end
15
+
16
+ let(:airbrake_params) do
17
+ { project_id: project_id,
18
+ project_key: project_key,
19
+ logger: Logger.new(StringIO.new) }
20
+ end
21
+
22
+ let(:ex) { AirbrakeTestError.new }
23
+
24
+ shared_examples 'blacklisting' do |keys, params|
25
+ it "filters out the value" do
26
+ blacklist = { blacklist_keys: keys }
27
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
28
+
29
+ notifier.notify_sync(ex, params)
30
+
31
+ expect_a_request_with_body(expected_body)
32
+ end
33
+ end
34
+
35
+ shared_examples 'logging' do |keys, params|
36
+ it "logs the error" do
37
+ out = StringIO.new
38
+ blacklist = { blacklist_keys: keys, logger: Logger.new(out) }
39
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
40
+
41
+ notifier.notify_sync(ex, params)
42
+
43
+ expect(out.string).to match(expected_output)
44
+ end
45
+ end
46
+
47
+ before do
48
+ stub_request(:post, endpoint).to_return(status: 201, body: '{}')
49
+ end
50
+
51
+ context "when blacklisting with a Regexp" do
52
+ let(:expected_body) { /"params":{"bingo":"\[Filtered\]"}/ }
53
+ include_examples('blacklisting', [/\Abin/], bingo: 'bango')
54
+ end
55
+
56
+ context "when blacklisting with a Symbol" do
57
+ let(:expected_body) { /"params":{"bingo":"\[Filtered\]"}/ }
58
+ include_examples('blacklisting', [:bingo], bingo: 'bango')
59
+ end
60
+
61
+ context "when blacklisting with a String" do
62
+ let(:expected_body) { /"params":{"bingo":"\[Filtered\]"}/ }
63
+ include_examples('blacklisting', ['bingo'], bingo: 'bango')
64
+ end
65
+
66
+ context "when payload has a hash" do
67
+ context "and it is a non-recursive hash" do
68
+ let(:expected_body) { /"params":{"bongo":{"bish":"\[Filtered\]"}}/ }
69
+ include_examples('blacklisting', ['bish'], bongo: { bish: 'bash' })
70
+ end
71
+
72
+ context "and it is a recursive hash" do
73
+ let(:expected_body) { /"params":{"bingo":{"bango":"\[Filtered\]"}}/ }
74
+
75
+ bongo = { bingo: {} }
76
+ bongo[:bingo][:bango] = bongo
77
+
78
+ include_examples('blacklisting', ['bango'], bongo)
79
+ end
80
+ end
81
+
82
+ context "when there was invalid pattern provided" do
83
+ let(:expected_output) do
84
+ /ERROR.+KeysBlacklist is invalid.+patterns: \[#<Object:.+>\]/
85
+ end
86
+
87
+ include_examples('logging', [Object.new], bingo: 'bango')
88
+ end
89
+
90
+ context "when there was a proc provided, which returns an array of keys" do
91
+ let(:expected_body) { /"params":{"bingo":"\[Filtered\]","bongo":"bish"}/ }
92
+ include_examples('blacklisting', [proc { 'bingo' }], bingo: 'bango', bongo: 'bish')
93
+ end
94
+
95
+ context "when there was a proc provided along with normal keys" do
96
+ let(:expected_body) do
97
+ /"params":{"bingo":"bango","bongo":"\[Filtered\]","bash":"\[Filtered\]"}/
98
+ end
99
+
100
+ include_examples(
101
+ 'blacklisting',
102
+ [proc { 'bongo' }, :bash],
103
+ bingo: 'bango', bongo: 'bish', bash: 'bosh'
104
+ )
105
+ end
106
+
107
+ context "when there was a proc provided, which doesn't return an array of keys" do
108
+ let(:expected_output) do
109
+ /ERROR.+KeysBlacklist is invalid.+patterns: \[#<Object:.+>\]/
110
+ end
111
+
112
+ include_examples('logging', [proc { Object.new }], bingo: 'bango')
113
+
114
+ it "doesn't blacklist keys" do
115
+ blacklist = { blacklist_keys: [proc { Object.new }] }
116
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
117
+
118
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
119
+
120
+ expect_a_request_with_body(/"params":{"bingo":"bango","bongo":"bish"}/)
121
+ end
122
+ end
123
+
124
+ context "when there was a proc provided, which returns another proc" do
125
+ context "when called once" do
126
+ let(:expected_output) do
127
+ /ERROR.+KeysBlacklist is invalid.+patterns: \[#<Proc:.+>\]/
128
+ end
129
+
130
+ include_examples('logging', [proc { proc { ['bingo'] } }], bingo: 'bango')
131
+ end
132
+
133
+ context "when called twice" do
134
+ it "unwinds procs and filters keys" do
135
+ blacklist = { blacklist_keys: [proc { proc { ['bingo'] } }] }
136
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
137
+
138
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
139
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
140
+
141
+ expect_a_request_with_body(
142
+ /"params":{"bingo":"\[Filtered\]","bongo":"bish"}/
143
+ )
144
+ end
145
+ end
146
+ end
147
+
148
+ it "filters query parameters correctly" do
149
+ blacklist = { blacklist_keys: ['bish'] }
150
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
151
+
152
+ notice = notifier.build_notice(ex)
153
+ notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash&color=%23FFAAFF'
154
+
155
+ notifier.notify_sync(notice)
156
+
157
+ # rubocop:disable Metrics/LineLength
158
+ expected_body =
159
+ %r("context":{.*"url":"http://localhost:3000/crash\?foo=bar&baz=bongo&bish=\[Filtered\]&color=%23FFAAFF".*})
160
+ # rubocop:enable Metrics/LineLength
161
+
162
+ expect_a_request_with_body(expected_body)
163
+ end
164
+
165
+ context "when the user payload is present" do
166
+ context "and when the user key is ignored" do
167
+ it "filters out user entirely" do
168
+ blacklist = { blacklist_keys: ['user'] }
169
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
170
+
171
+ notice = notifier.build_notice(ex)
172
+ notice[:context][:user] = { id: 1337, name: 'Bingo Bango' }
173
+
174
+ notifier.notify_sync(notice)
175
+
176
+ expect_a_request_with_body(/"user":"\[Filtered\]"/)
177
+ end
178
+ end
179
+
180
+ it "filters out individual user fields" do
181
+ blacklist = { blacklist_keys: ['name'] }
182
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(blacklist))
183
+
184
+ notice = notifier.build_notice(ex)
185
+ notice[:context][:user] = { id: 1337, name: 'Bingo Bango' }
186
+
187
+ notifier.notify_sync(notice)
188
+
189
+ expect_a_request_with_body(/"user":{"id":1337,"name":"\[Filtered\]"}/)
190
+ end
191
+ end
192
+ end
@@ -225,200 +225,5 @@ RSpec.describe Airbrake::Notifier do
225
225
  include_examples 'sent notice', environment: :development
226
226
  end
227
227
  end
228
-
229
- describe ":blacklist_keys" do
230
- describe "the list of values" do
231
- it "accepts regexps" do
232
- params = { blacklist_keys: [/\Abin/] }
233
- airbrake = described_class.new(airbrake_params.merge(params))
234
-
235
- airbrake.notify_sync(ex, bingo: 'bango')
236
-
237
- expect_a_request_with_body(/"params":{"bingo":"\[Filtered\]"}/)
238
- end
239
-
240
- it "accepts symbols" do
241
- params = { blacklist_keys: [:bingo] }
242
- airbrake = described_class.new(airbrake_params.merge(params))
243
-
244
- airbrake.notify_sync(ex, bingo: 'bango')
245
-
246
- expect_a_request_with_body(/"params":{"bingo":"\[Filtered\]"}/)
247
- end
248
-
249
- it "accepts strings" do
250
- params = { blacklist_keys: ['bingo'] }
251
- airbrake = described_class.new(airbrake_params.merge(params))
252
-
253
- airbrake.notify_sync(ex, bingo: 'bango')
254
-
255
- expect_a_request_with_body(/"params":{"bingo":"\[Filtered\]"}/)
256
- end
257
- end
258
-
259
- describe "hash values" do
260
- context "non-recursive" do
261
- it "filters nested hashes" do
262
- params = { blacklist_keys: ['bish'] }
263
- airbrake = described_class.new(airbrake_params.merge(params))
264
-
265
- airbrake.notify_sync(ex, bongo: { bish: 'bash' })
266
-
267
- expect_a_request_with_body(/"params":{"bongo":{"bish":"\[Filtered\]"}}/)
268
- end
269
- end
270
-
271
- context "recursive" do
272
- it "filters recursive hashes" do
273
- params = { blacklist_keys: ['bango'] }
274
- airbrake = described_class.new(airbrake_params.merge(params))
275
-
276
- bongo = { bingo: {} }
277
- bongo[:bingo][:bango] = bongo
278
-
279
- airbrake.notify_sync(ex, bongo)
280
-
281
- expect_a_request_with_body(/"params":{"bingo":{"bango":"\[Filtered\]"}}/)
282
- end
283
- end
284
- end
285
-
286
- it "filters query parameters correctly" do
287
- params = { blacklist_keys: ['bish'] }
288
- airbrake = described_class.new(airbrake_params.merge(params))
289
-
290
- notice = airbrake.build_notice(ex)
291
- notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash&color=%23FFAAFF'
292
-
293
- airbrake.notify_sync(notice)
294
-
295
- # rubocop:disable Metrics/LineLength
296
- expected_body =
297
- %r("context":{.*"url":"http://localhost:3000/crash\?foo=bar&baz=bongo&bish=\[Filtered\]&color=%23FFAAFF".*})
298
- # rubocop:enable Metrics/LineLength
299
-
300
- expect_a_request_with_body(expected_body)
301
- end
302
-
303
- it "filters out user" do
304
- params = { blacklist_keys: ['user'] }
305
- airbrake = described_class.new(airbrake_params.merge(params))
306
-
307
- notice = airbrake.build_notice(ex)
308
- notice[:context][:user] = { id: 1337, name: 'Bingo Bango' }
309
-
310
- airbrake.notify_sync(notice)
311
-
312
- expect_a_request_with_body(/"user":"\[Filtered\]"/)
313
- end
314
- end
315
-
316
- describe ":whitelist_keys" do
317
- describe "the list of values" do
318
- it "accepts regexes" do
319
- params = { whitelist_keys: [/\Abin/] }
320
- airbrake = described_class.new(airbrake_params.merge(params))
321
-
322
- airbrake.notify_sync(ex, bingo: 'bango', bongo: 'bish', bash: 'bosh')
323
-
324
- expect_a_request_with_body(
325
- /"params":{"bingo":"bango","bongo":"\[Filtered\]","bash":"\[Filtered\]"}/
326
- )
327
- end
328
-
329
- it "accepts symbols" do
330
- params = { whitelist_keys: [:bongo] }
331
- airbrake = described_class.new(airbrake_params.merge(params))
332
-
333
- airbrake.notify_sync(ex, bingo: 'bango', bongo: 'bish', bash: 'bosh')
334
-
335
- expect_a_request_with_body(
336
- /"params":{"bingo":"\[Filtered\]","bongo":"bish","bash":"\[Filtered\]"}/
337
- )
338
- end
339
-
340
- it "accepts strings" do
341
- params = { whitelist_keys: ['bash'] }
342
- airbrake = described_class.new(airbrake_params.merge(params))
343
-
344
- airbrake.notify_sync(
345
- ex,
346
- bingo: 'bango',
347
- bongo: 'bish',
348
- bash: 'bosh',
349
- bbashh: 'bboshh'
350
- )
351
-
352
- expect_a_request_with_body(
353
- /"params":{"bingo":"\[Filtered\]","bongo":"\[Filtered\]",
354
- "bash":"bosh","bbashh":"\[Filtered\]"}/x
355
- )
356
- end
357
- end
358
-
359
- describe "hash values" do
360
- context "non-recursive" do
361
- it "filters out everything but the provided keys" do
362
- params = { whitelist_keys: %w(bongo bish) }
363
- airbrake = described_class.new(airbrake_params.merge(params))
364
-
365
- airbrake.notify_sync(ex, bingo: 'bango', bongo: { bish: 'bash' })
366
-
367
- expect_a_request_with_body(
368
- /"params":{"bingo":"\[Filtered\]","bongo":{"bish":"bash"}}/
369
- )
370
- end
371
- end
372
-
373
- context "recursive" do
374
- it "errors when nested hashes are not filtered" do
375
- params = { whitelist_keys: %w(bingo bango) }
376
- airbrake = described_class.new(airbrake_params.merge(params))
377
-
378
- bongo = { bingo: {} }
379
- bongo[:bingo][:bango] = bongo
380
-
381
- if RUBY_ENGINE == 'jruby'
382
- # JRuby might raise two different exceptions, which represent the
383
- # same thing. One is a Java exception, the other is a Ruby
384
- # exception. It's probably a JRuby bug:
385
- # https://github.com/jruby/jruby/issues/1903
386
- begin
387
- expect do
388
- airbrake.notify_sync(ex, bongo)
389
- end.to raise_error(SystemStackError)
390
- rescue RSpec::Expectations::ExpectationNotMetError
391
- expect do
392
- airbrake.notify_sync(ex, bongo)
393
- end.to raise_error(java.lang.StackOverflowError)
394
- end
395
- else
396
- expect do
397
- airbrake.notify_sync(ex, bongo)
398
- end.to raise_error(SystemStackError)
399
- end
400
- end
401
- end
402
- end
403
-
404
- describe "context/url" do
405
- it "filters query parameters correctly" do
406
- params = { whitelist_keys: %w(bish) }
407
- airbrake = described_class.new(airbrake_params.merge(params))
408
-
409
- notice = airbrake.build_notice(ex)
410
- notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash'
411
-
412
- airbrake.notify_sync(notice)
413
-
414
- # rubocop:disable Metrics/LineLength
415
- expected_body =
416
- %r("context":{.*"url":"http://localhost:3000/crash\?foo=\[Filtered\]&baz=\[Filtered\]&bish=bash".*})
417
- # rubocop:enable Metrics/LineLength
418
-
419
- expect_a_request_with_body(expected_body)
420
- end
421
- end
422
- end
423
228
  end
424
229
  end
@@ -0,0 +1,246 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "Airbrake::Notifier whitelist_keys" do
4
+ def expect_a_request_with_body(body)
5
+ expect(a_request(:post, endpoint).with(body: body)).to have_been_made.once
6
+ end
7
+
8
+ let(:project_id) { 105138 }
9
+ let(:project_key) { 'fd04e13d806a90f96614ad8e529b2822' }
10
+ let(:localhost) { 'http://localhost:8080' }
11
+
12
+ let(:endpoint) do
13
+ "https://airbrake.io/api/v3/projects/#{project_id}/notices?key=#{project_key}"
14
+ end
15
+
16
+ let(:airbrake_params) do
17
+ { project_id: project_id,
18
+ project_key: project_key,
19
+ logger: Logger.new(StringIO.new) }
20
+ end
21
+
22
+ let(:ex) { AirbrakeTestError.new }
23
+
24
+ shared_examples 'whitelisting' do |keys, params|
25
+ it "filters everything but the value of the specified key" do
26
+ whitelist = { whitelist_keys: keys }
27
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(whitelist))
28
+
29
+ notifier.notify_sync(ex, params)
30
+
31
+ expect_a_request_with_body(expected_body)
32
+ end
33
+ end
34
+
35
+ shared_examples 'logging' do |keys, params|
36
+ it "logs the error" do
37
+ out = StringIO.new
38
+ whitelist = { whitelist_keys: keys, logger: Logger.new(out) }
39
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(whitelist))
40
+
41
+ notifier.notify_sync(ex, params)
42
+
43
+ expect(out.string).to match(expected_output)
44
+ end
45
+ end
46
+
47
+ before do
48
+ stub_request(:post, endpoint).to_return(status: 201, body: '{}')
49
+ end
50
+
51
+ context "when whitelisting with a Regexp" do
52
+ let(:expected_body) do
53
+ /"params":{"bingo":"bango","bongo":"\[Filtered\]","bash":"\[Filtered\]"}/
54
+ end
55
+
56
+ include_examples(
57
+ 'whitelisting',
58
+ [/\Abin/],
59
+ bingo: 'bango', bongo: 'bish', bash: 'bosh'
60
+ )
61
+ end
62
+
63
+ context "when whitelisting with a Symbol" do
64
+ let(:expected_body) do
65
+ /"params":{"bingo":"\[Filtered\]","bongo":"bish","bash":"\[Filtered\]"}/
66
+ end
67
+
68
+ include_examples(
69
+ 'whitelisting',
70
+ [:bongo],
71
+ bingo: 'bango', bongo: 'bish', bash: 'bosh'
72
+ )
73
+ end
74
+
75
+ context "when whitelisting with a String" do
76
+ let(:expected_body) do
77
+ /"params":{"bingo":"\[Filtered\]","bongo":"\[Filtered\]",
78
+ "bash":"bosh","bbashh":"\[Filtered\]"}/x
79
+ end
80
+
81
+ include_examples(
82
+ 'whitelisting',
83
+ ['bash'],
84
+ bingo: 'bango', bongo: 'bish', bash: 'bosh', bbashh: 'bboshh'
85
+ )
86
+ end
87
+
88
+ context "when payload has a hash" do
89
+ context "and it is a non-recursive hash" do
90
+ let(:expected_body) { /"params":{"bingo":"\[Filtered\]","bongo":{"bish":"bash"}}/ }
91
+
92
+ include_examples(
93
+ 'whitelisting',
94
+ %w(bongo bish),
95
+ bingo: 'bango', bongo: { bish: 'bash' }
96
+ )
97
+ end
98
+
99
+ context "and it is a recursive hash" do
100
+ it "errors when nested hashes are not filtered" do
101
+ whitelist = airbrake_params.merge(whitelist_keys: %w(bingo bango))
102
+ notifier = Airbrake::Notifier.new(whitelist)
103
+
104
+ bongo = { bingo: {} }
105
+ bongo[:bingo][:bango] = bongo
106
+
107
+ if RUBY_ENGINE == 'jruby'
108
+ # JRuby might raise two different exceptions, which represent the
109
+ # same thing. One is a Java exception, the other is a Ruby
110
+ # exception. It's probably a JRuby bug:
111
+ # https://github.com/jruby/jruby/issues/1903
112
+ begin
113
+ expect do
114
+ notifier.notify_sync(ex, bongo)
115
+ end.to raise_error(SystemStackError)
116
+ rescue RSpec::Expectations::ExpectationNotMetError
117
+ expect do
118
+ notifier.notify_sync(ex, bongo)
119
+ end.to raise_error(java.lang.StackOverflowError)
120
+ end
121
+ else
122
+ expect do
123
+ notifier.notify_sync(ex, bongo)
124
+ end.to raise_error(SystemStackError)
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ context "when there was a proc provided, which returns an array of keys" do
131
+ let(:expected_body) do
132
+ /"params":{"bingo":"\[Filtered\]","bongo":"bish","bash":"\[Filtered\]"}/
133
+ end
134
+
135
+ include_examples(
136
+ 'whitelisting',
137
+ [proc { 'bongo' }],
138
+ bingo: 'bango', bongo: 'bish', bash: 'bosh'
139
+ )
140
+ end
141
+
142
+ context "when there was a proc provided along with normal keys" do
143
+ let(:expected_body) do
144
+ /"params":{"bingo":"\[Filtered\]","bongo":"bish","bash":"bosh"}/
145
+ end
146
+
147
+ include_examples(
148
+ 'whitelisting',
149
+ [proc { 'bongo' }, :bash],
150
+ bingo: 'bango', bongo: 'bish', bash: 'bosh'
151
+ )
152
+ end
153
+
154
+ context "when there was a proc provided, which returns another proc" do
155
+ context "when called once" do
156
+ let(:expected_output) do
157
+ /ERROR.+KeysWhitelist is invalid.+patterns: \[#<Proc:.+>\]/
158
+ end
159
+
160
+ include_examples('logging', [proc { proc { ['bingo'] } }], bingo: 'bango')
161
+ end
162
+
163
+ context "when called twice" do
164
+ it "unwinds procs and filters keys" do
165
+ whitelist = { whitelist_keys: [proc { proc { ['bingo'] } }] }
166
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(whitelist))
167
+
168
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
169
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
170
+
171
+ expect_a_request_with_body(
172
+ /"params":{"bingo":"bango","bongo":"\[Filtered\]"}/
173
+ )
174
+ end
175
+ end
176
+ end
177
+
178
+ context "when there was a proc provided, which doesn't return an array of keys" do
179
+ let(:expected_output) do
180
+ /ERROR.+KeysWhitelist is invalid.+patterns: \[#<Object:.+>\]/
181
+ end
182
+
183
+ include_examples('logging', [proc { Object.new }], bingo: 'bango')
184
+
185
+ it "doesn't whitelist keys" do
186
+ whitelist = { whitelist_keys: [proc { Object.new }] }
187
+ notifier = Airbrake::Notifier.new(airbrake_params.merge(whitelist))
188
+
189
+ notifier.notify_sync(ex, bingo: 'bango', bongo: 'bish')
190
+
191
+ expect_a_request_with_body(
192
+ /"params":{"bingo":"\[Filtered\]","bongo":"\[Filtered\]"}/
193
+ )
194
+ end
195
+ end
196
+
197
+ describe "context/url" do
198
+ let(:notifier) do
199
+ Airbrake::Notifier.new(airbrake_params.merge(whitelist_keys: %w(bish)))
200
+ end
201
+
202
+ context "given a standard URL" do
203
+ it "filters query parameters correctly" do
204
+ notice = notifier.build_notice(ex)
205
+ notice[:context][:url] = 'http://localhost:3000/crash?foo=bar&baz=bongo&bish=bash'
206
+
207
+ notifier.notify_sync(notice)
208
+
209
+ expect_a_request_with_body(
210
+ # rubocop:disable Metrics/LineLength
211
+ %r("context":{.*"url":"http://localhost:3000/crash\?foo=\[Filtered\]&baz=\[Filtered\]&bish=bash".*})
212
+ # rubocop:enable Metrics/LineLength
213
+ )
214
+ end
215
+ end
216
+
217
+ context "given a non-standard URL" do
218
+ it "leaves the URL unfiltered" do
219
+ notice = notifier.build_notice(ex)
220
+ notice[:context][:url] =
221
+ 'http://localhost:3000/cra]]]sh?foo=bar&baz=bongo&bish=bash'
222
+
223
+ notifier.notify_sync(notice)
224
+
225
+ expect_a_request_with_body(
226
+ # rubocop:disable Metrics/LineLength
227
+ %r("context":{.*"url":"http://localhost:3000/cra\]\]\]sh\?foo=bar&baz=bongo&bish=bash".*})
228
+ # rubocop:enable Metrics/LineLength
229
+ )
230
+ end
231
+ end
232
+
233
+ context "given a URL without a query" do
234
+ it "skips params filtering and leaves the URL untouched" do
235
+ notice = notifier.build_notice(ex)
236
+ notice[:context][:url] = 'http://localhost:3000/crash'
237
+
238
+ notifier.notify_sync(notice)
239
+
240
+ expect_a_request_with_body(
241
+ %r("context":{.*"url":"http://localhost:3000/crash".*})
242
+ )
243
+ end
244
+ end
245
+ end
246
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airbrake-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airbrake Technologies, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-09 00:00:00.000000000 Z
11
+ date: 2016-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1'
61
+ version: '2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1'
68
+ version: '2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: benchmark-ips
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -121,7 +121,9 @@ files:
121
121
  - spec/nested_exception_spec.rb
122
122
  - spec/notice_spec.rb
123
123
  - spec/notifier_spec.rb
124
+ - spec/notifier_spec/blacklist_keys_spec.rb
124
125
  - spec/notifier_spec/options_spec.rb
126
+ - spec/notifier_spec/whitelist_keys_spec.rb
125
127
  - spec/payload_truncator_spec.rb
126
128
  - spec/spec_helper.rb
127
129
  - spec/sync_sender_spec.rb
@@ -158,7 +160,9 @@ test_files:
158
160
  - spec/filter_chain_spec.rb
159
161
  - spec/nested_exception_spec.rb
160
162
  - spec/notice_spec.rb
163
+ - spec/notifier_spec/blacklist_keys_spec.rb
161
164
  - spec/notifier_spec/options_spec.rb
165
+ - spec/notifier_spec/whitelist_keys_spec.rb
162
166
  - spec/notifier_spec.rb
163
167
  - spec/payload_truncator_spec.rb
164
168
  - spec/spec_helper.rb