faye-websocket 0.10.6 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +83 -51
- data/LICENSE.md +12 -0
- data/README.md +76 -72
- data/lib/faye/eventsource.rb +4 -4
- data/lib/faye/rack_stream.rb +1 -0
- data/lib/faye/websocket.rb +5 -4
- data/lib/faye/websocket/api.rb +13 -6
- data/lib/faye/websocket/api/event.rb +1 -1
- data/lib/faye/websocket/api/event_target.rb +2 -2
- data/lib/faye/websocket/client.rb +57 -34
- data/lib/faye/websocket/ssl_verifier.rb +89 -0
- metadata +28 -45
- data/examples/app.rb +0 -54
- data/examples/autobahn_client.rb +0 -47
- data/examples/client.rb +0 -34
- data/examples/config.ru +0 -13
- data/examples/haproxy.conf +0 -20
- data/examples/proxy_server.rb +0 -14
- data/examples/rainbows.conf +0 -3
- data/examples/server.rb +0 -50
- data/examples/sse.html +0 -38
- data/examples/ws.html +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5d911cb9311b3ebcba587cea651bc49cf4ba29db10ef7b3c0b9bb7440571e39e
|
4
|
+
data.tar.gz: 81a0a87fd328f88730e84033ad795b28d969d12dfd7bcdd6c5f93e12b865bf44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c4bc1540dcb37c6c7ed508ae0d459878fef3b66009acd26555ee63b3a7013ba262cffb6fe82120385a002e12847e5c3c33ec3c44cb7ba1e7be7e7f730b1ab05
|
7
|
+
data.tar.gz: 953bdb31da0463fbda511ca4b1276ce88a5e2e9273d52c34e4b13eb018d4dec41c1dbd678c8ebcad700a4230e26dc9576d89753fbebd743e743e1bdb48da394c
|
data/CHANGELOG.md
CHANGED
@@ -1,157 +1,189 @@
|
|
1
|
+
### 0.11.1 / 2021-05-24
|
2
|
+
|
3
|
+
- Prevent the client hanging if `close()` is called when already closing
|
4
|
+
|
5
|
+
### 0.11.0 / 2020-07-31
|
6
|
+
|
7
|
+
- Implement TLS certificate verification and enable it by default on client
|
8
|
+
connections
|
9
|
+
- Add a `:tls` option to the client with sub-fields `:root_cert_file` and
|
10
|
+
`:verify_peer` for configuring TLS verification
|
11
|
+
|
12
|
+
### 0.10.9 / 2019-06-13
|
13
|
+
|
14
|
+
- Use the EventMachine API rather than `IO#write` to write data; this uses the
|
15
|
+
event loop and avoids getting blocked by slow clients
|
16
|
+
|
17
|
+
### 0.10.8 / 2019-06-10
|
18
|
+
|
19
|
+
- In the case of a close timeout, don't block on waiting for writing to the
|
20
|
+
socket to complete
|
21
|
+
- Fix a race condition that caused a timeout not to be cancelled immediately
|
22
|
+
when the WebSocket is closed
|
23
|
+
- Change license from MIT to Apache 2.0
|
24
|
+
|
25
|
+
### 0.10.7 / 2017-02-22
|
26
|
+
|
27
|
+
- Emit an error if `EventMachine::Connection#unbind` is called with an error
|
28
|
+
|
1
29
|
### 0.10.6 / 2017-01-22
|
2
30
|
|
3
|
-
|
31
|
+
- Forcibly close the I/O stream after a timeout if the peer does not respond
|
4
32
|
after calling `close()`
|
5
33
|
|
6
34
|
### 0.10.5 / 2016-11-12
|
7
35
|
|
8
|
-
|
36
|
+
- Set the SNI hostname when making secure requests
|
9
37
|
|
10
38
|
### 0.10.4 / 2016-05-20
|
11
39
|
|
12
|
-
|
40
|
+
- Amend warnings issued when running with -W2
|
13
41
|
|
14
42
|
### 0.10.3 / 2016-02-24
|
15
43
|
|
16
|
-
|
44
|
+
- Use `PATH_INFO` and `QUERY_STRING` rather than the non-standard `REQUEST_URI`
|
45
|
+
from the Rack env
|
17
46
|
|
18
47
|
### 0.10.2 / 2015-11-26
|
19
48
|
|
20
|
-
|
49
|
+
- Fix the `headers` and `status` methods on `Client`, which were broken in the
|
21
50
|
last release
|
22
51
|
|
23
52
|
### 0.10.1 / 2015-11-06
|
24
53
|
|
25
|
-
|
26
|
-
|
54
|
+
- Make sure errors can be safely emitted if creating the driver fails
|
55
|
+
- Prevent a race condition when binding `EM.attach` to the socket
|
27
56
|
|
28
57
|
### 0.10.0 / 2015-07-08
|
29
58
|
|
30
|
-
|
59
|
+
- Add the standard `code` and `reason` parameters to the `close` method
|
31
60
|
|
32
61
|
### 0.9.2 / 2014-12-21
|
33
62
|
|
34
|
-
|
63
|
+
- Only emit `error` once, and don't emit it after `close`
|
35
64
|
|
36
65
|
### 0.9.1 / 2014-12-18
|
37
66
|
|
38
|
-
|
67
|
+
- Check that all options to the WebSocket constructor are recognized
|
39
68
|
|
40
69
|
### 0.9.0 / 2014-12-13
|
41
70
|
|
42
|
-
|
71
|
+
- Allow protocol extensions to be passed into websocket-extensions
|
43
72
|
|
44
73
|
### 0.8.0 / 2014-11-08
|
45
74
|
|
46
|
-
|
75
|
+
- Support connections via HTTP proxies
|
47
76
|
|
48
77
|
### 0.7.5 / 2014-10-04
|
49
78
|
|
50
|
-
|
79
|
+
- Allow sockets to be closed when they are in any state other than `CLOSED`
|
51
80
|
|
52
81
|
### 0.7.4 / 2014-07-06
|
53
82
|
|
54
|
-
|
55
|
-
|
56
|
-
|
83
|
+
- Stop using `define_method` to implement `Event` properties, since it blows the
|
84
|
+
method cache
|
85
|
+
- Stop setup errors masking URI errors in `Client#initialize`
|
86
|
+
- Make the Goliath adapter compatible with goliath-1.0.4.
|
57
87
|
|
58
88
|
### 0.7.3 / 2014-04-24
|
59
89
|
|
60
|
-
|
90
|
+
- Remove an unneeded method override in the `WebSocket` class
|
61
91
|
|
62
92
|
### 0.7.2 / 2013-12-29
|
63
93
|
|
64
|
-
|
94
|
+
- Fix WebSocket detection in cases where the web server does not produce an
|
95
|
+
`env`
|
65
96
|
|
66
97
|
### 0.7.1 / 2013-12-03
|
67
98
|
|
68
|
-
|
69
|
-
|
99
|
+
- Support the `max_length` websocket-driver option
|
100
|
+
- Expose a `message` property on `error` events
|
70
101
|
|
71
102
|
### 0.7.0 / 2013-09-09
|
72
103
|
|
73
|
-
|
104
|
+
- Allow the server to send custom headers with EventSource responses
|
74
105
|
|
75
106
|
### 0.6.3 / 2013-08-04
|
76
107
|
|
77
|
-
|
108
|
+
- Stop implicitly depending on Rack 1.4
|
78
109
|
|
79
110
|
### 0.6.2 / 2013-07-05
|
80
111
|
|
81
|
-
|
112
|
+
- Catch errors thrown by EventMachine and emit `error` and `close` events
|
82
113
|
|
83
114
|
### 0.6.1 / 2013-05-12
|
84
115
|
|
85
|
-
|
116
|
+
- Release a gem without log and pid files in it
|
86
117
|
|
87
118
|
### 0.6.0 / 2013-05-12
|
88
119
|
|
89
|
-
|
120
|
+
- Add support for custom headers
|
90
121
|
|
91
122
|
### 0.5.0 / 2013-05-05
|
92
123
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
124
|
+
- Extract the protocol handlers into the `websocket-driver` library
|
125
|
+
- Support the `rack.hijack` API
|
126
|
+
- Add support for Rainbows 4.5 and Puma
|
127
|
+
- Officially support JRuby and Rubinius
|
97
128
|
|
98
129
|
### 0.4.7 / 2013-02-14
|
99
130
|
|
100
|
-
|
101
|
-
|
102
|
-
|
131
|
+
- Emit the `close` event if TCP is closed before CLOSE frame is acked
|
132
|
+
- Treat the `Upgrade: websocket` header case-insensitively because of IE10
|
133
|
+
- Do not suppress headers in the Thin and Rainbows adapters unless the status is
|
134
|
+
`101`
|
103
135
|
|
104
136
|
### 0.4.6 / 2012-07-09
|
105
137
|
|
106
|
-
|
138
|
+
- Add `Connection: close` to EventSource response
|
107
139
|
|
108
140
|
### 0.4.5 / 2012-04-06
|
109
141
|
|
110
|
-
|
111
|
-
|
142
|
+
- Add WebSocket error code `1011`.
|
143
|
+
- Handle URLs with no path correctly by sending `GET /`
|
112
144
|
|
113
145
|
### 0.4.4 / 2012-03-16
|
114
146
|
|
115
|
-
|
147
|
+
- Fix installation on JRuby with a platform-specific gem
|
116
148
|
|
117
149
|
### 0.4.3 / 2012-03-12
|
118
150
|
|
119
|
-
|
151
|
+
- Make `extconf.rb` a no-op on JRuby
|
120
152
|
|
121
153
|
### 0.4.2 / 2012-03-09
|
122
154
|
|
123
|
-
|
155
|
+
- Port masking-function C extension to Java for JRuby
|
124
156
|
|
125
157
|
### 0.4.1 / 2012-02-26
|
126
158
|
|
127
|
-
|
128
|
-
|
159
|
+
- Treat anything other than an `Array` as a string when calling `send()`
|
160
|
+
- Fix error loading UTF-8 validation code on Ruby 1.9 with `-Ku` flag
|
129
161
|
|
130
162
|
### 0.4.0 / 2012-02-13
|
131
163
|
|
132
|
-
|
133
|
-
|
164
|
+
- Add `ping()` method to server-side `WebSocket` and `EventSource`
|
165
|
+
- Buffer `send()` calls until the draft-76 handshake is complete
|
134
166
|
|
135
167
|
### 0.3.0 / 2012-01-13
|
136
168
|
|
137
|
-
|
138
|
-
|
169
|
+
- Add support for `EventSource` connections
|
170
|
+
- Support the Thin, Rainbows and Goliath web servers
|
139
171
|
|
140
172
|
### 0.2.0 / 2011-12-21
|
141
173
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
174
|
+
- Add support for `Sec-WebSocket-Protocol` negotiation
|
175
|
+
- Support `hixie-76` close frames and 75/76 ignored segments
|
176
|
+
- Improve performance of HyBi parsing/framing functions
|
177
|
+
- Write masking function in C
|
146
178
|
|
147
179
|
### 0.1.2 / 2011-12-05
|
148
180
|
|
149
|
-
|
181
|
+
- Make `hixie-76` sockets work through HAProxy
|
150
182
|
|
151
183
|
### 0.1.1 / 2011-11-30
|
152
184
|
|
153
|
-
|
185
|
+
- Fix `add_event_listener()` interface methods
|
154
186
|
|
155
187
|
### 0.1.0 / 2011-11-27
|
156
188
|
|
157
|
-
|
189
|
+
- Initial release, based on WebSocket components from Faye
|
data/LICENSE.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Copyright 2010-2021 James Coglan
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
4
|
+
this file except in compliance with the License. You may obtain a copy of the
|
5
|
+
License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software distributed
|
10
|
+
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
11
|
+
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
12
|
+
specific language governing permissions and limitations under the License.
|
data/README.md
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
# faye-websocket
|
2
2
|
|
3
|
-
* Travis CI build: [![Build
|
4
|
-
status](https://secure.travis-ci.org/faye/faye-websocket-ruby.svg)](http://travis-ci.org/faye/faye-websocket-ruby)
|
5
|
-
* Autobahn tests: [server](http://faye.jcoglan.com/autobahn/servers/),
|
6
|
-
[client](http://faye.jcoglan.com/autobahn/clients/)
|
7
|
-
|
8
3
|
This is a general-purpose WebSocket implementation extracted from the
|
9
4
|
[Faye](http://faye.jcoglan.com) project. It provides classes for easily building
|
10
5
|
WebSocket servers and clients in Ruby. It does not provide a server itself, but
|
@@ -22,11 +17,11 @@ access via proxies than WebSockets.
|
|
22
17
|
The following web servers are supported. Other servers that implement the
|
23
18
|
`rack.hijack` API should also work.
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
20
|
+
- [Goliath](http://postrank-labs.github.com/goliath/)
|
21
|
+
- [Phusion Passenger](https://www.phusionpassenger.com/) >= 4.0 with nginx >= 1.4
|
22
|
+
- [Puma](http://puma.io/) >= 2.0
|
23
|
+
- [Rainbows](http://rainbows.bogomips.org/)
|
24
|
+
- [Thin](http://code.macournoyer.com/thin/)
|
30
25
|
|
31
26
|
|
32
27
|
## Installation
|
@@ -65,7 +60,7 @@ App = lambda do |env|
|
|
65
60
|
|
66
61
|
else
|
67
62
|
# Normal HTTP request
|
68
|
-
[200, {'Content-Type' => 'text/plain'}, ['Hello']]
|
63
|
+
[200, { 'Content-Type' => 'text/plain' }, ['Hello']]
|
69
64
|
end
|
70
65
|
end
|
71
66
|
```
|
@@ -133,7 +128,7 @@ including any authorization information and custom headers you require:
|
|
133
128
|
ws = Faye::WebSocket::Client.new('ws://www.example.com/', [], {
|
134
129
|
:proxy => {
|
135
130
|
:origin => 'http://username:password@proxy.example.com',
|
136
|
-
:headers => {'User-Agent' => 'ruby'}
|
131
|
+
:headers => { 'User-Agent' => 'ruby' }
|
137
132
|
}
|
138
133
|
})
|
139
134
|
```
|
@@ -190,45 +185,78 @@ ws = Faye::WebSocket::Client.new(url, protocols, options)
|
|
190
185
|
`protocols` as an array of subprotocols as described above, or `nil`. `options`
|
191
186
|
is an optional hash containing any of these keys:
|
192
187
|
|
193
|
-
|
188
|
+
- `:extensions` - an array of
|
194
189
|
[websocket-extensions](https://github.com/faye/websocket-extensions-ruby)
|
195
190
|
compatible extensions, as described above
|
196
|
-
|
191
|
+
- `:headers` - a hash containing key-value pairs representing HTTP headers to be
|
197
192
|
sent during the handshake process
|
198
|
-
|
193
|
+
- `:max_length` - the maximum allowed size of incoming message frames, in bytes.
|
199
194
|
The default value is `2^26 - 1`, or 1 byte short of 64 MiB.
|
200
|
-
|
195
|
+
- `:ping` - an integer that sets how often the WebSocket should send ping
|
201
196
|
frames, measured in seconds
|
202
|
-
|
197
|
+
- `:tls` - a hash containing key-value pairs for specifying TLS parameters.
|
203
198
|
These are passed along to EventMachine and you can find
|
204
199
|
[more details here](http://rubydoc.info/gems/eventmachine/EventMachine%2FConnection%3Astart_tls)
|
205
200
|
|
201
|
+
### Secure sockets
|
202
|
+
|
203
|
+
Starting with version 0.11.0, `Faye::WebSocket::Client` will verify the server
|
204
|
+
certificate for `wss` connections. This is not the default behaviour for
|
205
|
+
EventMachine's TLS interface, and so our defaults for the `:tls` option are a
|
206
|
+
little different.
|
207
|
+
|
208
|
+
First, `:verify_peer` is enabled by default. Our implementation checks that the
|
209
|
+
chain of certificates sent by the server is trusted by your root certificates,
|
210
|
+
and that the final certificate's hostname matches the hostname in the request
|
211
|
+
URL.
|
212
|
+
|
213
|
+
By default, we use your system's root certificate store by invoking
|
214
|
+
`OpenSSL::X509::Store#set_default_paths`. If you want to use a different set of
|
215
|
+
root certificates, you can pass them via the `:root_cert_file` option, which
|
216
|
+
takes a path or an array of paths to the certificates you want to use.
|
217
|
+
|
218
|
+
```ruby
|
219
|
+
ws = Faye::WebSocket::Client.new('wss://example.com/', [], :tls => {
|
220
|
+
:root_cert_file => ['path/to/certificate.pem']
|
221
|
+
})
|
222
|
+
```
|
223
|
+
|
224
|
+
If you want to switch off certificate verification altogether, then set
|
225
|
+
`:verify_peer` to `false`.
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
ws = Faye::WebSocket::Client.new('wss://example.com/', [], :tls => {
|
229
|
+
:verify_peer => false
|
230
|
+
})
|
231
|
+
```
|
232
|
+
|
206
233
|
## WebSocket API
|
207
234
|
|
208
235
|
Both the server- and client-side `WebSocket` objects support the following API:
|
209
236
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
237
|
+
- **`on(:open) { |event| }`** fires when the socket connection is established.
|
238
|
+
Event has no attributes.
|
239
|
+
- **`on(:message) { |event| }`** fires when the socket receives a message. Event
|
240
|
+
has one attribute, **`data`**, which is either a `String` (for text frames) or
|
241
|
+
an `Array` of unsigned integers, i.e. integers in the range `0..255` (for
|
242
|
+
binary frames).
|
243
|
+
- **`on(:error) { |event| }`** fires when there is a protocol error due to bad
|
244
|
+
data sent by the other peer. This event is purely informational, you do not
|
245
|
+
need to implement error recovery.
|
246
|
+
- **`on(:close) { |event| }`** fires when either the client or the server closes
|
247
|
+
the connection. Event has two optional attributes, **`code`** and
|
248
|
+
**`reason`**, that expose the status code and message sent by the peer that
|
221
249
|
closed the connection.
|
222
|
-
|
250
|
+
- **`send(message)`** accepts either a `String` or an `Array` of byte-sized
|
223
251
|
integers and sends a text or binary message over the connection to the other
|
224
252
|
peer; binary data must be encoded as an `Array`.
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
253
|
+
- **`ping(message, &callback)`** sends a ping frame with an optional message and
|
254
|
+
fires the callback when a matching pong is received.
|
255
|
+
- **`close(code, reason)`** closes the connection, sending the given status code
|
256
|
+
and reason text, both of which are optional.
|
257
|
+
- **`version`** is a string containing the version of the `WebSocket` protocol
|
258
|
+
the connection is using.
|
259
|
+
- **`protocol`** is a string (which may be empty) identifying the subprotocol
|
232
260
|
the socket is using.
|
233
261
|
|
234
262
|
|
@@ -261,7 +289,7 @@ App = lambda do |env|
|
|
261
289
|
|
262
290
|
else
|
263
291
|
# Normal HTTP request
|
264
|
-
[200, {'Content-Type' => 'text/plain'}, ['Hello']]
|
292
|
+
[200, { 'Content-Type' => 'text/plain' }, ['Hello']]
|
265
293
|
end
|
266
294
|
end
|
267
295
|
```
|
@@ -276,29 +304,29 @@ es.send('Breaking News!', :event => 'notification', :id => '99')
|
|
276
304
|
|
277
305
|
The `EventSource` object exposes the following properties:
|
278
306
|
|
279
|
-
|
307
|
+
- **`url`** is a string containing the URL the client used to create the
|
280
308
|
EventSource.
|
281
|
-
|
282
|
-
|
283
|
-
|
309
|
+
- **`last_event_id`** is a string containing the last event ID received by the
|
310
|
+
client. You can use this when the client reconnects after a dropped connection
|
311
|
+
to determine which messages need resending.
|
284
312
|
|
285
313
|
When you initialize an EventSource with `Faye::EventSource.new`, you can pass
|
286
314
|
configuration options after the `env` parameter. Available options are:
|
287
315
|
|
288
|
-
|
316
|
+
- **`:headers`** is a hash containing custom headers to be set on the
|
289
317
|
EventSource response.
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
318
|
+
- **`:retry`** is a number that tells the client how long (in seconds) it should
|
319
|
+
wait after a dropped connection before attempting to reconnect.
|
320
|
+
- **`:ping`** is a number that tells the server how often (in seconds) to send
|
321
|
+
'ping' packets to the client to keep the connection open, to defeat timeouts
|
322
|
+
set by proxies. The client will ignore these messages.
|
295
323
|
|
296
324
|
For example, this creates a connection that allows access from any origin, pings
|
297
325
|
every 15 seconds and is retryable every 10 seconds if the connection is broken:
|
298
326
|
|
299
327
|
```ruby
|
300
328
|
es = Faye::EventSource.new(es,
|
301
|
-
:headers => {'Access-Control-Allow-Origin' => '*'},
|
329
|
+
:headers => { 'Access-Control-Allow-Origin' => '*' },
|
302
330
|
:ping => 15,
|
303
331
|
:retry => 10
|
304
332
|
)
|
@@ -487,27 +515,3 @@ class EchoServer < Goliath::API
|
|
487
515
|
end
|
488
516
|
end
|
489
517
|
```
|
490
|
-
|
491
|
-
|
492
|
-
## License
|
493
|
-
|
494
|
-
(The MIT License)
|
495
|
-
|
496
|
-
Copyright (c) 2010-2017 James Coglan
|
497
|
-
|
498
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
499
|
-
this software and associated documentation files (the 'Software'), to deal in
|
500
|
-
the Software without restriction, including without limitation the rights to
|
501
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
502
|
-
the Software, and to permit persons to whom the Software is furnished to do so,
|
503
|
-
subject to the following conditions:
|
504
|
-
|
505
|
-
The above copyright notice and this permission notice shall be included in all
|
506
|
-
copies or substantial portions of the Software.
|
507
|
-
|
508
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
509
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
510
|
-
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
511
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
512
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
513
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|