Commit Graph

179 Commits

Author SHA1 Message Date
James Coglan 780dd331fe The 'connect' event should emit a ConnectEvent object. 2015-07-07 21:33:15 +01:00
James Coglan 4a3d51cc5b Incorporate StreamReader into Draft75 so that it retains input and recovers safely from exceptions in event listeners. 2015-07-07 21:30:06 +01:00
James Coglan ed17186354 In the Hybi driver, perform parser state changes before validating and emitting events. This protects the parser against errors thrown by event listeners. 2015-07-07 20:36:30 +01:00
James Coglan 1df1293456 Change stage in the Base.shutdown() method to that all parsers stop processing input. 2015-07-04 21:07:34 +01:00
James Coglan d901d3e48d If an event listener emits an error, close the connection with code 1011. 2015-07-04 20:54:22 +01:00
Victor Gama 5f6873ebc0 Ensure message is always defined 2015-07-04 18:33:59 +01:00
Victor Gama 309b5651a7 Implement 'pong' command to hybi.js 2015-07-04 18:33:59 +01:00
James Coglan 0034f5fe19 Fail the connection when the server receives an invalid Sec-WebSocket-Extensions header. 2015-03-26 08:51:34 +00:00
James Coglan 8a0235ef51 Don't send a close frame in response to receiving one, if we already sent a close frame. 2015-03-12 12:58:43 +00:00
James Coglan 23d0a9ea5e Don't parse incoming data if the client is already closed. This stops the headers being interpreted as WebSocket data if the client is closed before receiving the server's handshake. Fixes https://github.com/faye/websocket-extensions-node/issues/1. 2015-02-21 12:34:37 +00:00
James Coglan 8cf42d6050 Apply @zingaburga's StreamReader optimisations from https://github.com/faye/websocket-driver-node/issues/10. 2015-02-16 20:07:40 +00:00
James Coglan ebe4ce1382 Because Driver.frame() will now admit input when in readyState 2 (to allow for async extension shutdown), the Messages stream should use the text() and binary() methods that will block messages in that state. 2015-02-16 09:51:40 +00:00
James Coglan daa37974c6 Don't emit further error/close events if the driver is already closing. 2015-02-16 09:08:10 +00:00
James Coglan cc5e5c245e Use Extensions.close(callback) to make sure close follows all pending messages.
viz.: https://github.com/faye/websocket-extensions-node/commit/1b77290e8279f654089eac963942309fb19b9312
2015-02-15 13:18:21 +00:00
James Coglan bdc081ab57 Adapt to the changes to the HTTPParser API introduced in iojs. 2015-02-02 21:06:51 +00:00
James Coglan 5cba268409 Throw an error if drivers are created with unrecognised options. 2014-12-17 22:18:06 +00:00
James Coglan 23675e08ee Don't expose the internal frame structure of messages to extensions; they should not be able to depend on seeing the actual frame boundaries off the wire because that requires all extensions to leave them intact. 2014-12-06 22:08:37 +00:00
James Coglan 66f46330e7 Remove some blank lines. 2014-12-05 19:36:06 +00:00
James Coglan 7376f48d6a Catch errors raised by Extensions.activate(). 2014-12-02 22:53:16 +00:00
James Coglan 330fa2073d Don't assume that messages coming out of extensions have anything but the standard websocket-extensions API. 2014-11-29 01:54:20 +00:00
James Coglan 58474a837c Populate the Message.data field before handing off to extensions. 2014-11-29 01:13:18 +00:00
James Coglan 82182eb348 Close the Extensions object when ending the session. 2014-11-29 00:55:02 +00:00
James Coglan 94041e7a86 websocket-extensions uses Node-style callbacks rather than emitting error events. 2014-11-27 09:32:49 +00:00
James Coglan e73f7db754 Rename validFrame() to validFrameRsv(). 2014-11-26 09:59:08 +00:00
James Coglan 0efc0ebb8d Don't pass the driver into the Extensions constructor. 2014-11-25 23:17:39 +00:00
James Coglan f904131d21 Extract the Extensions class into another module. 2014-11-25 21:14:17 +00:00
James Coglan ee664ba6c9 Decouple Extensions and individual extension libs from the Driver.fail() method, emitting errors instead. 2014-11-25 19:42:54 +00:00
James Coglan 538239b761 Move the header-parsing functions into class methods on Extensions. 2014-11-25 09:11:58 +00:00
James Coglan 2bc103c781 Adjust the data structures in the Extensions parser so that the server sets the order of extensions, per the spec. 2014-11-24 23:03:50 +00:00
James Coglan eceb59e2fb Implement the client-side framework for extensions. 2014-11-24 22:05:31 +00:00
James Coglan 40341c5439 The Client driver requires the crypto module for generating keys. 2014-11-24 00:41:34 +00:00
James Coglan 396637d463 Extract permessage-deflate into a separate module. 2014-11-23 21:46:04 +00:00
James Coglan c986ad231c Enable strict mode on all source files. 2014-11-23 20:09:26 +00:00
James Coglan ef897eed1c Implement deflate compression on server-to-client messages. 2014-11-23 19:45:02 +00:00
James Coglan 724a5f19a4 Flesh out the parameter validation for extensions, and provide better support for multiple values of extension params and HTTP headers. 2014-11-23 15:21:11 +00:00
James Coglan 0332ce2625 Initial support for permessage-deflate, only supports client-to-server compression but enough to pass the Autobahn suite. 2014-11-23 13:11:24 +00:00
James Coglan 6146615801 Extract Hybi parser state into Frame and Message structs.
This makes the structure of all the state in the parser easier to see,
it makes it easier to free memory by deleting a single struct rather
than many related fields, and it produces some data structures that will
be useful for adding extensions.
2014-11-22 13:34:34 +00:00
James Coglan 7325241d11 Move the header setting for Sec-WebSocket-Protocol. 2014-11-08 17:46:03 +00:00
James Coglan eb2d329a16 Clean up some formatting typos. 2014-11-08 17:20:51 +00:00
James Coglan 623a93c0b7 Duplicate headers should be allowed if ALLOWED_DUPLICATES *includes* the name. 2014-11-08 16:39:40 +00:00
James Coglan 208be33754 Refactor the way headers are generated in all the drivers. 2014-11-08 16:12:14 +00:00
James Coglan 0bb47c17b4 Remove TLS concerns from the proxy implementation.
This results in a more simple design, in the sense of fewer concerns
being mixed together. It makes the API more verbose, but it's not
difficult to use correctly.

It also means that we make the I/O implementation deal with TLS, so it
can use tls.connect({socket: io}) or the upcoming TLSSocket class,
rather than this module needing a huge amount of boilerplate and
internal indirection to use tls.createSecurePair() and make Proxy wrap
pair.encrypted.

Using tls.connect({socket: io}) would be awkward on this end, because it
expects a stream that emits *incoming* data from the TCP connection. All
the streams in this module emit *outgoing* data that should be written
to TCP, so their polarity is flipped compared to what tls.connect()
wants, and resolving that involves even more stream boilerplate.
2014-11-08 15:20:08 +00:00
James Coglan d6da566641 Only call tls.checkServerIdentity() if it is available (i.e. before Node 0.8.). 2014-11-07 19:17:12 +00:00
James Coglan cde48d625c Move http_parser.js up into the lib/websocket directory. 2014-11-07 19:16:35 +00:00
James Coglan 6eb04d5acc Remove a redundant assignment. 2014-11-06 23:20:32 +00:00
James Coglan 4348bec390 Some cleanup to remove bits I left lying around while refactoring proxy support. 2014-11-06 23:04:11 +00:00
James Coglan 550b3d906d Unify the proxy handshake, TLS handshake, and WebSocket protocol into a single stream when using driver.proxy() to simplify the API. 2014-11-05 23:30:15 +00:00
David Glasser b88b8d6856 proxy should emit 'close' when it's done
This will cause any stream piped into it to stop piping into it. (It's
the only way to unpipe a Node 0.8 Streams1-style pipe.)

This change allows you to remove the empty "stream.on('data')" in
faye-websocket.
2014-10-29 16:47:56 -07:00
James Coglan 76f4128634 Redesign the proxy API so that we can more cleanly deal with TLS, either to the proxy server or origin server or both, while still allowing control of the TLS options and custom headers, and not leaking so much of the implementation. 2014-10-29 22:07:01 +00:00
James Coglan 32e6715b6e [wip] Emit a proxy-connect event so the client can perform a TLS handshake at the right time. 2014-10-29 19:27:30 +00:00