apple_shove 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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