Commit graph

553 commits

Author SHA1 Message Date
Yonathan Yusim
3ae39ff796 allow message processing from onopen browser context
Found an issue in libwebsockets - if a server sends a message within its "onopen" context then the message is getting swallowed and not passed to calling client (means LWS_CALLBACK_CLIENT_RECEIVE is never getting called).
I've fixed the bug - pls find attached patch.

Signed-off-by: Yonathan Yusim <yonathan@boxee.tv>
Signed-off-by: Andy Green <andy@warmcat.com>
2012-04-09 06:42:39 +08:00
Tobias Maier
e8c9b565a4 use ssize_t instead of size_t for return values of read/recv/SSL_read
Signed-off-by: Tobias Maier <tobias.maier@netplace.com>
2012-04-05 18:24:53 +08:00
Nick Dowell
c04c193dc3 close connection if socket recv() fails.
This prevents a problem observed on Windows whereby a client that
disconnects before fully establishing the WebSocket would cause the
server to use 100% CPU since recv() would continually return -1 for that
socket.

Signed-off-by: Nick Dowell <nick@nickdowell.com>
2012-04-05 10:29:39 +08:00
Artem Egorkine
d515ddd51d Don't care for the human-readable part of "HTTP/1.1 101" reply
While the protocol specification gives example of the
human-readable message associated with a 101-code reply,
nowhere does it actually enforce it. Ws4py gevent middleware
is known to have a message other than "Switching Protocols".
2012-02-19 17:26:17 +01:00
Andy Green
cc01247c50 debug move most spew into debug macro
This quietens the spew so all typical debug info now is coming from
the user code (mirror protocol in the sample server / client case).

Signed-off-by: Andy Green <andy@warmcat.com>
2011-11-07 19:53:23 +08:00
Alex Bligh
49146dbcce Add libwebsockets_ensure_user_space
This patch unifies the code for per-connection user allocation, and allows
it to be allocated earlier, duiring HTTP service time.  It's also OK to
attempt allocation multiple times, it will just return any existing
allocation.

Signed-off-by: Alex Bligh <alex@alex.org.uk>
2011-11-07 17:19:25 +08:00
David Galeano
7b11fec7ca Added support for Windows XP. 2011-10-04 19:55:18 +08:00
David Galeano
f70093583b Fixed compiler warnings.
Signed-off-by: David Galeano <davidgaleano@turbulenz.biz>
2011-09-26 12:09:54 +01:00
Andy Green
c15cb38d13 my compiler version didn't find it, but there is an uninitialized usage of
len pointed out by Sonic on the blog

Reported-by: Sven <sven@killig.de>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-06-26 10:27:28 +01:00
Andy Green
0922650b53 extensions fix deflate stream vs mux and veto it on mux children
This patch gets deflate-stream working with x-google-mux.

It adds a clean veto system where are extension can veto the proposal
of any extension when opening a new connection.  x-google-mux uses that
in its callback to defeat any use of deflate-stream on mux children.

However deflate stream is allowed on the parent connection and works
transparently now alongside x-google-mux.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-28 10:19:19 +01:00
Andy Green
68b4504329 extensions introduce pre close veto
This establishes a pre-close extension check to allow an extension to
veto a close.  x-google-mux then uses this to stop ch1 going down
(subchannel 1 is the original socket connection that turns into a mux
parent) if it has active mux children; it just marks ch1 as closed in
its conn struct in that case and returns 1 from the callback to veto.

Code is also added to take care of the case ch1 is 'closed', and the
last child is subsequently closed, it actively calls close on the mux
parent then.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-25 21:41:57 +01:00
Andy Green
f6652412f3 extensions ensure per conn allocation starts zeroed
Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-25 20:46:18 +01:00
Andy Green
66a16f393e x google mux implement child close
This implements clean client and server close for mux child connections,
and deals with accounting for parent child lists.

The mux link can then survive constant connection bringup and teardown
found in the new test client.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-24 22:07:45 +01:00
Andy Green
2d1301e8cb dump active protocols and extensions at context create
Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-24 10:14:41 +01:00
Andy Green
a41314f3bf introduce x google mux very draft indeed
This is initial x-google-mux support.  It's disabled by default
since it's very pre-alpha.

1) To enable it, reconfigure with --enable-x-google-mux

2) It conflicts with deflate-stream, use the -u switch on
   the test client to disable deflate-stream

3) It deviates from the google standard by sending full
   headers in the addchannel subcommand rather than just
   changed ones from original connect

4) Quota is not implemented yet

5) Close of subchannel is not really implemented yet

6) Google opcode 0xf is changed to 0x7 to account for
   v7 protocol changes to opcode layout

However despite those caveats, in fact it can run the
test client reliably over one socket (both dumb-increment
and lws-mirror-protocol), you can open a browser on the
same test server too and see the circles, etc.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-05-23 10:00:03 +01:00
Andy Green
27a0b91333 fix frgmented server reply
Server handshake reply might not come in one packet as pointed out by
Pavel Borzenkov.  This replaces his fix with one directly in the packet
state machine.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-04-16 10:54:28 +01:00
Andy Green
72c34321d3 Revert Pavel's patch looping in recv
Signed-off-by: Andy Green <andy@warmcat.com>
2011-04-16 10:46:21 +01:00
Pavel Borzenkov
876534b0d5 recv() may not return all data
While performing handshake recv() is called only once.
It may return only part of the data and handshake
will fail. This patch modifies libwebsocket_service_fd()
to ensure that there is not data left in the socket.

Signed-off-by: Pavel Borzenkov <pavel.borzenkov@auriga.com>
2011-04-15 13:16:58 +01:00
Pavel Borzenkov
71ea500081 Use IPPROTO_TCP instead of SOL_TCP
This change fixes compilation on *BSD systems.

Signed-off-by: Pavel Borzenkov <pavel.borzenkov@auriga.com>
2011-04-15 13:16:32 +01:00
Pavel Borzenkov
2af39964dc HTTP headers may be case-sensitive
For the IETF revision 00 send 'Upgrade: WebSocket' header
instead of 'Upgrade: websocket' as described in the IETF standard.
Some servers (for example, phpdaemon) are case-sensitive.

Signed-off-by: Pavel Borzenkov <pavel.borzenkov@auriga.com>
2011-04-12 09:47:50 +01:00
Andy Green
46c2ea0d6f pass ext pointer in ext callback
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-22 09:04:01 +00:00
Peter Hinz
bb45a90037 Re: Windows port of your libwebsocket
The latest code changed need some win32 fixes:

Signed-off-by: Peter Hinz <cerebusrc@gmail.com>
2011-03-10 18:14:01 +00:00
Andy Green
7627af52a3 try to cover AF_LOCAL in libwebsockets_get_peer_addresses
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-09 15:13:52 +00:00
Andy Green
f92def7eef use unsigned peer dotted quad
Reported-by: Pierre-Paul Lavoie <ppl@idios.org>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-09 15:02:20 +00:00
Patrick McManus
4bf91d7224 libwebsockets - gcc warnings
you have your makefiles set up to treat warnings as errors, and my gcc
4.4.5 (64 bit) compiler generates 3 warnings that need fixing:

(that sprintf() one is a real bug.. if ext_name contains formatting
characters you are looking at a potential segv).

Signed-off-by: Patrick McManus <mcmanus@ducksong.com>
2011-03-09 07:18:28 +00:00
Andy Green
6c9395529e disable nagle algorithm
Ago noticed that some Windows clients experience small packets
from the server being aggregated and set after a long delay
(200-300ms).

He found that TCP_NODELAY on the socket solved this, I tested it
and it didn't have any noticable bad effect, so I implemented it
for all sockets, client and server.

Thans Ago for debugging this and notifying the cause.

Reported-by: Ago Allikmaa <maxorator@gmail.com>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-08 08:56:57 +00:00
Andy Green
82c3d54c10 introduce libwebsocket_is_final_fragment
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 21:16:31 +00:00
Andy Green
2836c641cf expose SHA1 api
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 20:47:41 +00:00
Andy Green
9e4c2b6e35 add separate server writeable and change naming to match rest of callbacks
Notice that the naming is changed, the notification to a server that it can write to
the client is now called LWS_CALLBACK_SERVER_WRITEABLE, and the notification to a client
that it can write to a server is LWS_CALLBACK_CLIENT_WRITEABLE.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 20:47:39 +00:00
Andy Green
58eaa74fd0 remove bogus bytes on first line of websockets.c
Reported-by: Pierre-Paul Lavoie <ppl@idios.org>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 17:54:06 +00:00
Andy Green
c44159fb3a flush extensions when closing
Extensions might be caching stuff that we should spill before a controlled close.
It's not allowed to send anything on the wire after the close request, so we need
to make the extensions spill just before.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 07:08:18 +00:00
Andy Green
da527dfdee add extra state for waiting on close ack with timeout
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-07 07:08:12 +00:00
Andy Green
ce6a21dbda introduce deflate compression extension
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 13:32:53 +00:00
Andy Green
2366b1c997 instantiate extensions server accepted
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 13:15:31 +00:00
Andy Green
c6517fa2ad dynamically create client extensions offer from extensions list
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 13:15:29 +00:00
Andy Green
3b84c006c9 callback each active extension on packet tx pre send
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 13:14:42 +00:00
Andy Green
98a717c7ed callback each active extension on packet rx pre parse
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 13:14:15 +00:00
Andy Green
95a7b5d87d introduce lws_send_pipe_choked
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 10:29:39 +00:00
Andy Green
ef660a9c20 deallocate extension contexts on connection close
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 10:29:38 +00:00
Andy Green
c511482c78 create server extension response dynamically
This goes through the extentsions the client requested, selects the ones
that we support at the server, and then further calls back to the appropriate
protocol callback in user code to check it's OK to actually use that
extension in this context.  If it is (callback unhandled == it is) then
it's added to the list of extensions sent back to the client.

Accepted extensions are also added to the connection's active extension
list and the private "user" memory allocation for the extension context is
done and bound to the connection.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-06 10:29:35 +00:00
Andy Green
d6e09110bb introduce struct libwebsocket_extension
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-05 16:12:15 +00:00
Andy Green
2e24da08c4 fix openssl breakage from win32
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-05 16:12:04 +00:00
Peter Hinz
56885f3084 introduce win32 build capability
This adds win32 build compatability to libwebsockets.

The patch is from Peter Hinz, Andy Green has cleaned it up a bit and
possibly broken win32 compatability since I can't test it, so there
may be followup patches.  It compiles fine under Linux after this
patch anyway.

Much of the patch is changing a reserved keyword for Visual C compiler
"this" to "context", but there is no real C99 support in the MSFT
compiler even though it is 2011 so C99 style array declarations
have been mangled back into "ancient C" style.

Some windows-isms are also added like closesocket() but these are
quite localized.  Win32 random is just using C library random() call
at the moment vs Linux /dev/urandom.  canonical hostname detection is
broken in win32 at the moment.

Signed-off-by: Peter Hinz <cerebusrc@gmail.com>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-02 22:03:47 +00:00
Andy Green
385e7ad034 introduce LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER
This adds a callback to protocols[0] which happens when the
Client HTTP handshake packet is being composed.  After all the
headers for the websocket handshake to the server have been
added, the callback is called with a pointer to a char *
that allows extra headers to be added.  See the comments in
libwebsocket.h or the api documentation for example code.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-01 21:06:02 +00:00
Andy Green
eeaacb39c7 introduce 76 00 client support
This adds 76/00 client support to libwebsockets.  It's still shipped
by browsers and more importantly still the only version supported by
server stuff like socket.io.

Signed-off-by: Andy Green <andy@warmcat.com>
2011-03-01 20:44:24 +00:00
Andy Green
d4302734d7 fix null protocol dereference when closing session
Thanks to Christopher Baker for pointing out that when we close a session,
if the close is coming before a protocol was negotiated for the connection
or when the protocol was otherwise left at NULL, we'll blow a segfault.

This implements his proposed fix.

Reported-by: Christopher Baker <me@christopherbaker.net>
Signed-off-by: Andy Green <andy@warmcat.com>
2011-02-28 07:45:29 +00:00
Andy Green
4eaa86b291 only have nonce requirement and processing for exactly 04
Signed-off-by: Andy Green <andy@warmcat.com>
2011-02-26 11:17:48 +00:00
Andy Green
6da560c63c remove duplicated poll handling in hangup on client
Signed-off-by: Andy Green <andy@warmcat.com>
2011-02-26 11:06:27 +00:00
Andy Green
687b0188bc require close reason argument on close and free session
Signed-off-by: Andy Green <andy@warmcat.com>
2011-02-26 11:04:01 +00:00
Andy Green
08d33926eb make origin optional on client
Signed-off-by: Andy Green <andy@warmcat.com>
2011-02-26 10:22:49 +00:00