apns_gatling 0.1.5 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/push_message.rb +3 -1
- data/lib/apns_gatling/apns_client.rb +44 -8
- data/lib/apns_gatling/request.rb +2 -1
- data/lib/apns_gatling/response.rb +9 -1
- data/lib/apns_gatling/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 683a9f97a25ddb358da1ded897fcf852dd394753
|
4
|
+
data.tar.gz: 7f5088c3f030e43c7530ff7f91d5ba75524d93a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5e4721d36638633fedeb0c2d7b755316a57d3365f3af2568ee938d145ae7d4972fdbc78d3c831bb2812eb997ecf05000423f3632030946a507c3920070bae78
|
7
|
+
data.tar.gz: 9f9568bd6b3814d2c904f326f4aefe5122762aac79b3c0d20c2591332d87513ee7b5f36f1175a2ff0eb66fb9229dcdf4767b5708d49d940064e70cf7c1ff9770
|
data/examples/push_message.rb
CHANGED
@@ -15,6 +15,7 @@ module ApnsGatling
|
|
15
15
|
@token_maker = Token.new(team_id, auth_key_id, ecdsa_key)
|
16
16
|
@sandbox = sandbox
|
17
17
|
@mutex = Mutex.new
|
18
|
+
@requests = {}
|
18
19
|
@cv = ConditionVariable.new
|
19
20
|
init_vars
|
20
21
|
end
|
@@ -51,28 +52,62 @@ module ApnsGatling
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
55
|
+
def connection_error(e)
|
56
|
+
@mutex.synchronize do
|
57
|
+
@requests.values.map do | request |
|
58
|
+
block = request[:block]
|
59
|
+
response = request[:response]
|
60
|
+
if block && response
|
61
|
+
response.error_with("connection failed #{e}")
|
62
|
+
block.call response
|
63
|
+
end
|
64
|
+
end
|
65
|
+
@requests = {}
|
66
|
+
@connection = nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
54
70
|
# push message
|
55
|
-
def push(message)
|
71
|
+
def push(message, &block)
|
56
72
|
request = Request.new(message, provider_token, host)
|
57
|
-
response = Response.new
|
58
|
-
|
73
|
+
response = Response.new(message)
|
74
|
+
@mutex.synchronize do
|
75
|
+
@requests[request.id] = {block: block, response: response}
|
76
|
+
end
|
59
77
|
|
60
78
|
begin
|
79
|
+
ensure_socket_open
|
61
80
|
stream = connection.new_stream
|
81
|
+
rescue SocketError => e
|
82
|
+
response.error_with("create connection failed #{e}")
|
83
|
+
block.call response
|
84
|
+
return
|
85
|
+
rescue StreamLimitExceeded
|
86
|
+
response.error_with('stream limit exceeded')
|
87
|
+
block.call response
|
88
|
+
return
|
89
|
+
rescue ConnectionClosed
|
90
|
+
close
|
91
|
+
response.error_with('connection closed')
|
92
|
+
block.call response
|
93
|
+
return
|
62
94
|
rescue StandardError => e
|
63
95
|
close
|
64
|
-
|
96
|
+
response.error_with("standard error #{e}")
|
97
|
+
block.call response
|
98
|
+
return
|
65
99
|
end
|
66
100
|
|
67
101
|
stream.on(:close) do
|
68
102
|
@mutex.synchronize do
|
103
|
+
@requests.delete request.id
|
69
104
|
@token_generated_at = 0 if response.status == '403' && response.error[:reason] == 'ExpiredProviderToken'
|
70
105
|
if @blocking
|
71
106
|
@blocking = false
|
72
107
|
@cv.signal
|
73
108
|
end
|
109
|
+
block.call response if block
|
74
110
|
end
|
75
|
-
yield response
|
76
111
|
end
|
77
112
|
|
78
113
|
stream.on(:headers) do |h|
|
@@ -112,12 +147,12 @@ module ApnsGatling
|
|
112
147
|
socket_loop
|
113
148
|
rescue EOFError
|
114
149
|
init_vars
|
115
|
-
|
150
|
+
connection_error(SocketError.new('Socket was remotely closed'))
|
116
151
|
rescue Exception => e
|
117
152
|
init_vars
|
118
|
-
|
153
|
+
connection_error(e)
|
119
154
|
end
|
120
|
-
end
|
155
|
+
end
|
121
156
|
end
|
122
157
|
end
|
123
158
|
|
@@ -169,6 +204,7 @@ module ApnsGatling
|
|
169
204
|
def close
|
170
205
|
exit_thread(@socket_thread)
|
171
206
|
init_vars
|
207
|
+
@connection = nil
|
172
208
|
end
|
173
209
|
|
174
210
|
def exit_thread(thread)
|
data/lib/apns_gatling/request.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module ApnsGatling
|
2
2
|
class Request
|
3
|
-
attr_reader :host, :path, :auth_token, :headers, :data
|
3
|
+
attr_reader :id, :host, :path, :auth_token, :headers, :data
|
4
4
|
|
5
5
|
def initialize(message, auth_token, host)
|
6
6
|
path = "/3/device/#{message.token}"
|
7
|
+
@id = message.apns_id
|
7
8
|
@path = path
|
8
9
|
@auth_token = auth_token
|
9
10
|
@headers = headers_from message, auth_token, host, path
|
@@ -4,10 +4,13 @@ module ApnsGatling
|
|
4
4
|
class Response
|
5
5
|
# See: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
|
6
6
|
attr_accessor :headers, :data
|
7
|
+
attr_reader :message
|
7
8
|
|
8
|
-
def initialize()
|
9
|
+
def initialize(message)
|
9
10
|
@headers = {}
|
10
11
|
@data = ''
|
12
|
+
@message = message
|
13
|
+
@internal_error = nil
|
11
14
|
end
|
12
15
|
|
13
16
|
def status
|
@@ -22,7 +25,12 @@ module ApnsGatling
|
|
22
25
|
JSON.parse(@data) rescue @data
|
23
26
|
end
|
24
27
|
|
28
|
+
def error_with(reason)
|
29
|
+
@internal_error = {reason: reason, 'apns-id': @message.apns_id, status: '0'}
|
30
|
+
end
|
31
|
+
|
25
32
|
def error
|
33
|
+
return @internal_error if @internal_error
|
26
34
|
if status != '200'
|
27
35
|
e = {}
|
28
36
|
e.merge!(status: @headers[':status']) if @headers[':status']
|
data/lib/apns_gatling/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apns_gatling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cloud
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http-2
|