James Coglan
866aee9319
Add a 'native' option for opting in to using the native parser and unparser.
2017-03-03 22:21:38 +00:00
James Coglan
000f0b81fc
Due to JRuby's limitation of only accepting 3 arguments on @JRubyMethod methods, we need to pack a few of the arguments to Unparser#frame() into an array.
2017-03-01 00:44:39 +00:00
James Coglan
60e4027c59
Extract the parsing/unparsing code from Hybi into Ruby classes that match the C API, drop the Native driver and allow Hybi to take options for which parsers to use.
2017-01-06 09:11:37 +00:00
James Coglan
0eb64913ca
Capture errors raise by emit() and re-raise them after the parser has finished running.
2016-12-29 00:56:55 +00:00
James Coglan
9ce857b3d4
Revise uses of encoding APIs.
...
When originally implemented, we still supported Ruby 1.8, which
necessitated checking for encoding methods and using a regex to validate
UTF-8. These checks are now gone.
We tagged many strings as binary when not strictly necessary, either
because we were just going to iterate their bytes or because we were
going to hand them off to the caller which should just write them
directly to a socket. Strings used as buffers to accumulate streaming
input are still tagged as binary to avoid encoding
collision/conversion.
The places where we do need to tag as UTF-8 (i.e. just before emitting
to the application) remain, but copy the string if necessary. This
allows us to work with frozen strings.
Finally, strings passed in via the Driver#text method should be
*transcoded* to UTF-8 if necessary, not merely tagged. The Ruby
String#encode method produces a new string so this should also be safe
with frozen strings.
2016-05-19 21:08:22 +01:00
James Coglan
115d82bebb
Silence all -W2 warnings.
2016-05-18 22:42:16 +01:00
James Coglan
15ba7410c6
Remove some unused variables from Hybi#send_frame.
2016-05-18 22:33:33 +01:00
James Coglan
bc7d29cb52
Emit a protocol error when a closing frame has a 1-byte payload.
2015-07-17 22:02:51 +01:00
James Coglan
59940290c9
Emit close code 1000 if the closing frame does not contain one.
2015-07-16 08:19:05 +01:00
James Coglan
be2e5ed9ce
A few stylistic tweaks.
2015-07-11 14:24:19 +01:00
James Coglan
d4245ed3f4
Rather than implementing integer (un)packing ourselves, use the Array#pack and String#unpack methods.
2015-07-10 20:05:19 +01:00
James Coglan
7128d1b030
Standardise the words used to refer to chunks of parser input.
2015-07-10 09:37:03 +01:00
James Coglan
91653036ce
Parse the mask flag and length in the order they appear in the protocol.
2015-07-07 20:49:29 +01:00
James Coglan
9523937428
Initialize StreamReader in the base constructor.
2015-07-07 20:38:26 +01:00
James Coglan
91df761990
Hybi#shutdown doesn't really need to take a block, it can just take a flag to say whether to emit an error.
2015-07-07 20:33:22 +01:00
James Coglan
dcfd35fde8
Remove some excessive whitespace.
2015-07-07 20:32:47 +01:00
James Coglan
582a3b0541
Merge pull request #29 from ioquatix/buffered-input
...
Use StreamReader for both hybi and draft75.
2015-07-06 20:49:24 +01:00
James Coglan
fe6163c336
Perform state changes in #shutdown before calling frame(), which might fail when calling @socket.write.
2015-07-06 20:50:18 +01:00
James Coglan
9b561b6e12
The 'rescue' clause for errors from outgoing extensions should be in #frame, not #send_frame.
2015-07-06 20:48:44 +01:00
Samuel Williams
425e15da83
Use StreamReader for both hybi and draft75.
2015-07-06 10:29:18 +09:00
James Coglan
fa11841bfa
Don't catch errors from event listeners. Instead, make sure that in all parsing methods in Hybi, @stage is set before any user called is invoked so the parser is in the right state before code that might raise is called.
2015-07-05 18:52:53 +01:00
James Coglan
83d317add2
Rescue from Exception when calling event listeners, and use the name 'error' for caught exceptions.
2015-07-05 15:31:36 +01:00
James Coglan
585eded63d
Remove unnecessary code to remove whitespace from Base64 output.
2015-07-04 21:13:06 +01:00
James Coglan
8eccf044b0
Change stage in the Base.shutdown() method to that all parsers stop processing input.
2015-07-04 21:06:50 +01:00
James Coglan
f218999304
If an event listener emits an error, close the connection with code 1011.
2015-07-04 20:54:42 +01:00
James Coglan
7af53b5be0
Add a pong() command for sending unsolicited pong frames.
2015-07-04 18:49:46 +01:00
James Coglan
6720cb2b4a
The client should use secure random numbers for Sec-WebSocket-Key, and we should use the Base64.strict_encode function everywhere.
2015-06-02 22:01:22 +01:00
James Coglan
d6b147f2e0
Fail the connection when the server receives an invalid Sec-WebSocket-Extensions header.
2015-03-26 09:43:59 +00:00
James Coglan
b78ed7706d
Don't send a close frame in response to receiving one, if we already sent a close frame.
2015-03-14 10:03:26 +00:00
James Coglan
95c0261505
Don't emit further error/close events if the driver is already closing.
2015-02-16 09:08:18 +00:00
James Coglan
01c1a762e0
Don't expose the frame structure of messages, only expose their opcode and RSV headers. Extensions will mess with frame boundaries so depending on frame structure won't work.
2014-12-05 23:07:47 +00:00
James Coglan
ef862fd341
Serialise the FIN and RSV bits of frames correctly.
2014-12-05 19:27:39 +00:00
James Coglan
eb20069011
Migrate the internal representation of buffers from arrays to ASCII-8BIT strings, since this is what we're planning on handing off to extensions.
2014-12-05 09:17:09 +00:00
James Coglan
ef4fc7c57a
Migrate the Hybi driver's internals to use Frame and Message objects compatible with websocket-extensions.
2014-12-02 22:51:42 +00:00
James Coglan
1a9f2af571
Use the Headers class to build the default headers for handshakes rather than using loads of ugly string operations.
2014-11-08 17:44:34 +00:00
James Coglan
58c19e7659
If driver.close is called before driver.start, the driver should close.
2014-10-03 00:36:50 +01:00
James Coglan
a403ca4c8d
Simplify the subprotocol selection code.
2014-07-04 20:50:08 +01:00
James Coglan
d00cbadedb
Stop the Hybi parser hanging onto data it doesn't need after emitFrame().
2014-06-16 20:45:48 +01:00
James Coglan
1b3f32bbc7
Trailing blank lines are bad.
2014-05-17 00:34:48 +01:00
James Coglan
18170c0c61
Stop parsing Hybi once we go into a failure state.
2013-12-27 18:13:31 +00:00
James Coglan
74c4cc1190
Extend max-length checking to draft-{75,76}.
2013-12-20 10:27:48 +00:00
James Coglan
fafd949641
Extend max-length checking to short (<= 125 bytes) frames and to sequences of continuation frames.
2013-12-20 10:23:53 +00:00
James Coglan
e3587fcbb1
Add a max_length option to the Hybi/Client class.
2013-12-02 21:55:43 +00:00
James Coglan
ac3bb51cbd
Adjust encoding operations so that encoding is explicit at the call site, and all strings written to I/O are ASCII-8BIT.
2013-07-02 09:46:29 +01:00
James Coglan
ee5fe9ec5f
Messages should be queued when the client is in the 'pre-connecting' state, as the client is initially.
2013-06-06 10:25:10 +01:00
James Coglan
5a7fadbcbe
Add API for setting custom handshake headers.
2013-05-11 20:28:36 +01:00
James Coglan
be1f1cdc35
Rename the module to websocket-driver.
2013-05-04 16:43:25 +01:00