bugsnag 2.6.1 → 2.7.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: 03c6229af994d490629b40b1e38c22f2a60a9377
4
- data.tar.gz: c854283dfae8b5eeb9028340fa08b90c1449c8f7
3
+ metadata.gz: 0d479bf3d15d3a4185dfca6ac8c399babd8a1f0f
4
+ data.tar.gz: 6ea73f53d27cba623b393fea905a964b21b1e217
5
5
  SHA512:
6
- metadata.gz: f3ed228a6c795b107f1d81d5e9d2dfcd2b29b5d73d3b9c988fc0547d439d1ce90997846e1a966e341acb53050aa2223e4ac1555c9c588e0aeddd3eb90c59c1c6
7
- data.tar.gz: d35f27707d883e6b1b23f0c51ed5d15fbe013d249a40aac68707699d9c4678960a913e5e9af600d6e17e9d7a9bad52a92d51811bf5060e1758d939d55853dcf4
6
+ metadata.gz: 27994f415bc764ddb82ef036549dc49eca2b05a66aa3a802a9163791d6da30cfe8594c5c81445047530e5a10c3cc76ce4fe76e5b8a141351a81a029d940c709c
7
+ data.tar.gz: 61885434f5f97dae81e95db08405a8ae27c1076e3a2312ebd4234372845594f8ee3e8768865ad0b830d58545445a626e32a1efbc3659c8d7038b8f0a89daf1f9
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ 2.7.0
5
+ -----
6
+ - Fix configuration of http timeouts
7
+ - Fix configuration of http proxies
8
+ - Remove dependency on httparty
9
+ - Allow for symbols in rack env
10
+
4
11
  2.6.1
5
12
  -----
6
13
  - Fix Ruby 1.8 payload delivery bug (thanks @colin!)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.6.1
1
+ 2.7.0
data/bugsnag.gemspec CHANGED
@@ -20,11 +20,8 @@ Gem::Specification.new do |s|
20
20
  s.add_runtime_dependency 'multi_json', ["~> 1.0"]
21
21
 
22
22
  if RUBY_VERSION < "1.9"
23
- # Use ruby 1.8 compatible httparty
24
- s.add_runtime_dependency 'httparty', ["< 0.12.0", ">= 0.6"]
25
23
  s.add_development_dependency "rake", "~> 10.1.1"
26
24
  else
27
- s.add_runtime_dependency 'httparty', ["< 1.0", ">= 0.6"]
28
25
  s.add_development_dependency 'rake'
29
26
  end
30
27
 
@@ -33,4 +30,3 @@ Gem::Specification.new do |s|
33
30
  s.add_development_dependency 'pry'
34
31
  s.add_development_dependency 'webmock'
35
32
  end
36
-
@@ -1,4 +1,3 @@
1
- require "httparty"
2
1
  require "multi_json"
3
2
  require "bugsnag/deploy"
4
3
 
@@ -1,13 +1,15 @@
1
+ require "net/https"
2
+ require "uri"
3
+
1
4
  module Bugsnag
2
5
  module Delivery
3
6
  class Synchronous
4
7
  HEADERS = {"Content-Type" => "application/json"}
5
- TIMEOUT = 5
6
8
 
7
9
  class << self
8
- def deliver(url, body)
10
+ def deliver(url, body, configuration)
9
11
  begin
10
- response = HTTParty.post(url, {:body => body, :headers => HEADERS, :timeout => TIMEOUT})
12
+ response = request(url, body, configuration)
11
13
  Bugsnag.debug("Notification to #{url} finished, response was #{response.code}, payload was #{body}")
12
14
  rescue StandardError => e
13
15
  # KLUDGE: Since we don't re-raise http exceptions, this breaks rspec
@@ -17,6 +19,29 @@ module Bugsnag
17
19
  Bugsnag.warn(e.backtrace)
18
20
  end
19
21
  end
22
+
23
+ private
24
+
25
+ def request(url, body, configuration)
26
+ uri = URI.parse(url)
27
+ http = Net::HTTP.new(uri.host, uri.port, configuration.proxy_host, configuration.proxy_port, configuration.proxy_user, configuration.proxy_password)
28
+ http.read_timeout = configuration.timeout
29
+ http.open_timeout = configuration.timeout
30
+
31
+ if uri.scheme == "https"
32
+ http.use_ssl = true
33
+ # the default in 1.9+, but required for 1.8
34
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
35
+ end
36
+
37
+ request = Net::HTTP::Post.new(path(uri), HEADERS)
38
+ request.body = body
39
+ http.request(request)
40
+ end
41
+
42
+ def path(uri)
43
+ uri.path == "" ? "/" : uri.path
44
+ end
20
45
  end
21
46
  end
22
47
  end
@@ -7,14 +7,14 @@ module Bugsnag
7
7
  STOP = Object.new
8
8
 
9
9
  class << self
10
- def deliver(url, body)
10
+ def deliver(url, body, configuration)
11
11
  if queue.length > MAX_OUTSTANDING_REQUESTS
12
12
  Bugsnag.warn("Dropping notification, #{queue.length} outstanding requests")
13
13
  return
14
14
  end
15
15
 
16
16
  # Add delivery to the worker thread
17
- queue.push proc { super(url, body) }
17
+ queue.push proc { super(url, body, configuration) }
18
18
 
19
19
  # Make sure the worker thread is started
20
20
  ensure_worker_thread_started
@@ -1,25 +1,25 @@
1
- require "net/http"
2
- require "uri"
3
1
  require "bugsnag"
4
2
 
5
3
  module Bugsnag
6
4
  class Deploy
7
5
  def self.notify(opts = {})
8
- opts[:api_key] ||= Bugsnag.configuration.api_key
9
- opts[:release_stage] ||= "production"
10
- opts[:endpoint] ||= Bugsnag.configuration.endpoint
11
- opts[:use_ssl] = Bugsnag.configuration.use_ssl if opts[:use_ssl] == nil
12
- opts[:proxy_host] ||= Bugsnag.configuration.proxy_host
13
- opts[:proxy_port] ||= Bugsnag.configuration.proxy_port
14
- opts[:proxy_user] ||= Bugsnag.configuration.proxy_user
15
- opts[:proxy_password] ||= Bugsnag.configuration.proxy_password
16
6
 
17
- endpoint = (opts[:use_ssl] ? "https://" : "http://") + opts[:endpoint] + "/deploy"
7
+ configuration = Bugsnag.configuration.dup
8
+
9
+ # update configuration based on parameters passed in
10
+ [:api_key, :app_version, :release_stage, :endpoint, :use_ssl,
11
+ :proxy_host, :proxy_port, :proxy_user, :proxy_password].each do |param|
12
+ unless opts[param].nil?
13
+ configuration.send :"#{param}=", opts[param]
14
+ end
15
+ end
16
+
17
+ endpoint = (configuration.use_ssl ? "https://" : "http://") + configuration.endpoint + "/deploy"
18
18
 
19
19
  parameters = {
20
- "apiKey" => opts[:api_key],
21
- "releaseStage" => opts[:release_stage],
22
- "appVersion" => opts[:app_version],
20
+ "apiKey" => configuration.api_key,
21
+ "releaseStage" => configuration.release_stage,
22
+ "appVersion" => configuration.app_version,
23
23
  "revision" => opts[:revision],
24
24
  "repository" => opts[:repository],
25
25
  "branch" => opts[:branch]
@@ -27,19 +27,8 @@ module Bugsnag
27
27
 
28
28
  raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
29
29
 
30
- uri = URI.parse(endpoint)
31
- req = Net::HTTP::Post.new(uri.path)
32
- req.set_form_data(parameters)
33
- http = Net::HTTP.new(
34
- uri.host,
35
- uri.port,
36
- opts[:proxy_host],
37
- opts[:proxy_port],
38
- opts[:proxy_user],
39
- opts[:proxy_password]
40
- )
41
- http.use_ssl = true if opts[:use_ssl]
42
- http.request(req)
30
+ payload_string = Bugsnag::Helpers.dump_json(parameters)
31
+ Bugsnag::Delivery::Synchronous.deliver(endpoint, payload_string, configuration)
43
32
  end
44
33
  end
45
34
  end
@@ -1,11 +1,3 @@
1
- module HTTParty
2
- class Parser
3
- def json
4
- Bugsnag::Helpers.load_json(body)
5
- end
6
- end
7
- end
8
-
9
1
  module Bugsnag
10
2
  module Helpers
11
3
  MAX_STRING_LENGTH = 4096
@@ -28,7 +28,7 @@ module Bugsnag::Middleware
28
28
  headers = {}
29
29
 
30
30
  env.each_pair do |key, value|
31
- if key.start_with?("HTTP_")
31
+ if key.to_s.start_with?("HTTP_")
32
32
  header_key = key[5..-1]
33
33
  elsif ["CONTENT_TYPE", "CONTENT_LENGTH"].include?(key)
34
34
  header_key = key
@@ -1,11 +1,8 @@
1
- require "httparty"
2
1
  require "multi_json"
3
2
  require "pathname"
4
3
 
5
4
  module Bugsnag
6
5
  class Notification
7
- include HTTParty
8
-
9
6
  NOTIFIER_NAME = "Ruby Bugsnag Notifier"
10
7
  NOTIFIER_VERSION = Bugsnag::VERSION
11
8
  NOTIFIER_URL = "http://www.bugsnag.com"
@@ -40,7 +37,7 @@ module Bugsnag
40
37
  payload_string = Bugsnag::Helpers.dump_json(payload)
41
38
  end
42
39
 
43
- Bugsnag::Delivery[delivery_method || configuration.delivery_method].deliver(url, payload_string)
40
+ Bugsnag::Delivery[delivery_method || configuration.delivery_method].deliver(url, payload_string, configuration)
44
41
  end
45
42
  end
46
43
 
@@ -101,9 +98,6 @@ module Bugsnag
101
98
  ex = nil
102
99
  end
103
100
  end
104
-
105
- self.class.http_proxy(configuration.proxy_host, configuration.proxy_port, configuration.proxy_user, configuration.proxy_password) if configuration.proxy_host
106
- self.class.default_timeout(configuration.timeout) if configuration.timeout
107
101
  end
108
102
 
109
103
  # Add a single value as custom data, to this notification
@@ -31,4 +31,56 @@ describe 'Bugsnag' do
31
31
 
32
32
  expect(request['events'][0]['exceptions'][0]['message']).to eq('yo')
33
33
  end
34
+
35
+ it 'should send deploys over the wire' do
36
+ Bugsnag.configure do |config|
37
+ config.endpoint = "localhost:#{server.config[:Port]}"
38
+ config.use_ssl = false
39
+ end
40
+ WebMock.allow_net_connect!
41
+
42
+ Bugsnag::Deploy.notify :app_version => '1.1.1'
43
+
44
+ expect(request['appVersion']).to eq('1.1.1')
45
+ end
46
+
47
+ describe 'with a proxy' do
48
+ proxy = nil
49
+ pqueue = Queue.new
50
+
51
+ before do
52
+ proxy = WEBrick::HTTPServer.new :Port => 0, :Logger => WEBrick::Log.new("/dev/null"), :AccessLog => []
53
+ proxy.mount_proc '/' do |req, res|
54
+ pqueue.push req
55
+ res.status = 200
56
+ res.body = "OK\n"
57
+ end
58
+ Thread.new{ proxy.start }
59
+ end
60
+ after do
61
+ proxy.stop
62
+ end
63
+
64
+ let(:proxied_request) { pqueue.pop }
65
+
66
+ it 'should use a proxy when configured' do
67
+ Bugsnag.configure do |config|
68
+
69
+ config.endpoint = "localhost:#{server.config[:Port]}"
70
+ config.use_ssl = false
71
+
72
+ config.proxy_host = 'localhost'
73
+ config.proxy_port = proxy.config[:Port]
74
+ config.proxy_user = 'conrad'
75
+ config.proxy_password = '$ecret'
76
+ end
77
+
78
+ Bugsnag.notify 'oy'
79
+
80
+ r = proxied_request
81
+
82
+ expect(r.header['proxy-authorization'].first).to eq("Basic Y29ucmFkOiRlY3JldA==")
83
+ expect(r.request_line).to eq("POST http://localhost:#{server.config[:Port]}/ HTTP/1.1\r\n")
84
+ end
85
+ end
34
86
  end
@@ -645,71 +645,6 @@ describe Bugsnag::Notification do
645
645
  }
646
646
  end
647
647
 
648
- it "uses a proxy host if configured" do
649
- Bugsnag.configure do |config|
650
- config.proxy_host = "host_name"
651
- end
652
-
653
- expect(Bugsnag::Notification).to receive(:http_proxy) do |*args|
654
- expect(args.length).to eq(4)
655
- expect(args[0]).to eq("host_name")
656
- expect(args[1]).to eq(nil)
657
- expect(args[2]).to eq(nil)
658
- expect(args[3]).to eq(nil)
659
- end
660
-
661
- notify_test_exception
662
- end
663
-
664
- it "uses a proxy host/port if configured" do
665
- Bugsnag.configure do |config|
666
- config.proxy_host = "host_name"
667
- config.proxy_port = 1234
668
- end
669
-
670
- expect(Bugsnag::Notification).to receive(:http_proxy) do |*args|
671
- expect(args.length).to eq(4)
672
- expect(args[0]).to eq("host_name")
673
- expect(args[1]).to eq(1234)
674
- expect(args[2]).to eq(nil)
675
- expect(args[3]).to eq(nil)
676
- end
677
-
678
- notify_test_exception
679
- end
680
-
681
- it "uses a proxy host/port/user/pass if configured" do
682
- Bugsnag.configure do |config|
683
- config.proxy_host = "host_name"
684
- config.proxy_port = 1234
685
- config.proxy_user = "user"
686
- config.proxy_password = "password"
687
- end
688
-
689
- expect(Bugsnag::Notification).to receive(:http_proxy) do |*args|
690
- expect(args.length).to eq(4)
691
- expect(args[0]).to eq("host_name")
692
- expect(args[1]).to eq(1234)
693
- expect(args[2]).to eq("user")
694
- expect(args[3]).to eq("password")
695
- end
696
-
697
- notify_test_exception
698
- end
699
-
700
- it "sets the timeout time to the value in the configuration" do
701
- Bugsnag.configure do |config|
702
- config.timeout = 10
703
- end
704
-
705
- expect(Bugsnag::Notification).to receive(:default_timeout) do |*args|
706
- expect(args.length).to eq(1)
707
- expect(args[0]).to eq(10)
708
- end
709
-
710
- notify_test_exception
711
- end
712
-
713
648
  it "should fix invalid utf8" do
714
649
  invalid_data = "fl\xc3ff"
715
650
  invalid_data.force_encoding('BINARY') if invalid_data.respond_to?(:force_encoding)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.1
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-17 00:00:00.000000000 Z
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -24,26 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: httparty
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "<"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: '0.6'
37
- type: :runtime
38
- prerelease: false
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - "<"
42
- - !ruby/object:Gem::Version
43
- version: '1.0'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: '0.6'
47
27
  - !ruby/object:Gem::Dependency
48
28
  name: rake
49
29
  requirement: !ruby/object:Gem::Requirement