apple_shove 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fddaff591f202cc2de8d07ce6e6bd5d1ad00d545
4
+ data.tar.gz: 49a5b28b2c56c774435afc25784f0209308e6b65
5
+ SHA512:
6
+ metadata.gz: afaa11ebc095e9fdc384b63a4f8bdcffd5ca9def1a3be8b1899461eb4b60675b70d5e1777d1422d16dec32cc49290086bde30bf3a38a3192859470a4d98f5562
7
+ data.tar.gz: 692a7a94043eb7976a4ba2ec2aa1b3e942231fdc97d2c52f5594af94294ad755d48b17052668ce797e3bd48808bdbda33f8ee346f0caf6e3f09dedba68b20333
@@ -22,7 +22,12 @@ module AppleShove
22
22
 
23
23
  def disconnect
24
24
  @ssl_sock.close if @ssl_sock
25
- @sock.close if @sock
25
+
26
+ begin
27
+ @sock.close if @sock
28
+ rescue IOError
29
+ @sock = nil
30
+ end
26
31
  end
27
32
 
28
33
  def reconnect
@@ -39,19 +39,12 @@ module AppleShove
39
39
  end
40
40
 
41
41
  socket.write message
42
- rescue Errno::EPIPE
43
- Logger.warn("broken pipe. reconnecting.", self, notification)
44
- reconnect
45
- # EPIPE raises on the second write to a closed pipe. We need to resend
46
- # the previous notification that didn't make it through.
47
- socket.write @last_message if @last_message
48
- retry
49
- rescue Errno::ETIMEDOUT
50
- Logger.warn("timeout. reconnecting.", self, notification)
51
- reconnect
52
- retry
53
42
  rescue Exception => e
54
- Logger.error("error sending notification: #{e.message}", self, notification)
43
+ handler = WriteExceptionHandler.new(e)
44
+ Logger.warn(handler.message, self, notification)
45
+ reconnect if handler.reconnect?
46
+ socket.write @last_message if handler.rewrite? && @last_message
47
+ retry if handler.retry?
55
48
  else
56
49
  Logger.info("delivered notification", self, notification)
57
50
  end
@@ -0,0 +1,54 @@
1
+ require 'openssl'
2
+
3
+ module AppleShove
4
+ module APNS
5
+ class WriteExceptionHandler
6
+
7
+ attr_reader :message
8
+
9
+ def initialize exception
10
+
11
+ # defaults
12
+
13
+ @message = "error sending notification: #{exception.class} - #{exception.message}"
14
+ @reconnect = false
15
+ @rewrite = false
16
+ @retry = false
17
+
18
+ # known cases
19
+
20
+ case exception
21
+ when Errno::EPIPE
22
+ @message = "broken pipe. reconnecting."
23
+ @reconnect = true
24
+ @rewrite = true
25
+ @retry = true
26
+ when Errno::ETIMEDOUT
27
+ @message = "timeout. reconnecting."
28
+ @reconnect = true
29
+ @retry = true
30
+ when OpenSSL::SSL::SSLError
31
+ if exception.message.match 'bad write retry'
32
+ @message = "SSL bad write. reconnecting."
33
+ @reconnect = true
34
+ @retry = true
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ def reconnect?
41
+ @reconnect
42
+ end
43
+
44
+ def rewrite?
45
+ @rewrite
46
+ end
47
+
48
+ def retry?
49
+ @retry
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -28,7 +28,7 @@ module AppleShove
28
28
  # Apple APNS format
29
29
  def binary_message
30
30
  payload_json = @payload.to_json
31
-
31
+
32
32
  frame = [ [ 1, 32, @device_token ].pack('CnH64'),
33
33
  [ 2, payload_json.length, payload_json ].pack('Cna*'),
34
34
  [ 3, 4, '' ].pack('CnA4'),
@@ -1,3 +1,3 @@
1
1
  module AppleShove
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -0,0 +1,38 @@
1
+ require 'apple_shove'
2
+ require 'openssl'
3
+
4
+ describe AppleShove::APNS::WriteExceptionHandler do
5
+
6
+ def build_handler(exception, message)
7
+ begin
8
+ raise exception, message
9
+ rescue Exception => e
10
+ handler = AppleShove::APNS::WriteExceptionHandler.new(e)
11
+ end
12
+
13
+ handler
14
+ end
15
+
16
+ context 'when it encounters an unknown error' do
17
+ subject(:handler) { build_handler StandardError, "some unknown error" }
18
+
19
+ it 'has default values' do
20
+ expect(handler.message).to match(/error sending notification/)
21
+ expect(handler).not_to be_reconnect
22
+ expect(handler).not_to be_rewrite
23
+ expect(handler).not_to be_retry
24
+ end
25
+ end
26
+
27
+ context "when it's SSL connection has issues" do
28
+ subject(:handler) { build_handler OpenSSL::SSL::SSLError, "SSL_write:: bad write retry" }
29
+
30
+ it 'reconnects and retries' do
31
+ expect(handler).to be_reconnect
32
+ expect(handler).to be_retry
33
+ expect(handler).to_not be_rewrite
34
+ end
35
+ end
36
+
37
+
38
+ end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apple_shove
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
5
- prerelease:
4
+ version: 2.0.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Taylor Boyko
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-09-19 00:00:00.000000000 Z
11
+ date: 2014-02-24 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,39 +27,34 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: redis
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: daemons
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: celluloid
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -126,6 +113,7 @@ files:
126
113
  - lib/apple_shove/apns/error_response_packet.rb
127
114
  - lib/apple_shove/apns/feedback_connection.rb
128
115
  - lib/apple_shove/apns/notify_connection.rb
116
+ - lib/apple_shove/apns/write_exception_handler.rb
129
117
  - lib/apple_shove/apple_shove.rb
130
118
  - lib/apple_shove/config.rb
131
119
  - lib/apple_shove/demultiplexer.rb
@@ -137,6 +125,7 @@ files:
137
125
  - lib/apple_shove/version.rb
138
126
  - lib/tasks/apple_shove.rake
139
127
  - script/daemon
128
+ - spec/apns/write_exception_handler_spec.rb
140
129
  - spec/apple_shove_spec.rb
141
130
  - spec/demultiplexer_spec.rb
142
131
  - spec/notification_helper.rb
@@ -145,35 +134,29 @@ files:
145
134
  homepage: https://github.com/tboyko/apple_shove
146
135
  licenses:
147
136
  - MIT
137
+ metadata: {}
148
138
  post_install_message:
149
139
  rdoc_options: []
150
140
  require_paths:
151
141
  - lib
152
142
  required_ruby_version: !ruby/object:Gem::Requirement
153
- none: false
154
143
  requirements:
155
- - - ! '>='
144
+ - - '>='
156
145
  - !ruby/object:Gem::Version
157
146
  version: '0'
158
- segments:
159
- - 0
160
- hash: 144914022133974576
161
147
  required_rubygems_version: !ruby/object:Gem::Requirement
162
- none: false
163
148
  requirements:
164
- - - ! '>='
149
+ - - '>='
165
150
  - !ruby/object:Gem::Version
166
151
  version: '0'
167
- segments:
168
- - 0
169
- hash: 144914022133974576
170
152
  requirements: []
171
153
  rubyforge_project:
172
- rubygems_version: 1.8.24
154
+ rubygems_version: 2.0.14
173
155
  signing_key:
174
- specification_version: 3
156
+ specification_version: 4
175
157
  summary: ''
176
158
  test_files:
159
+ - spec/apns/write_exception_handler_spec.rb
177
160
  - spec/apple_shove_spec.rb
178
161
  - spec/demultiplexer_spec.rb
179
162
  - spec/notification_helper.rb