diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp')
-rw-r--r-- | src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp b/src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp index 145cd340eb..be388b42f4 100644 --- a/src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp +++ b/src/3rdparty/webkit/WebCore/websockets/WebSocketChannel.cpp @@ -71,6 +71,7 @@ void WebSocketChannel::connect() LOG(Network, "WebSocketChannel %p connect", this); ASSERT(!m_handle.get()); m_handshake.reset(); + ref(); m_handle = SocketStreamHandle::create(m_handshake.url(), this); } @@ -103,6 +104,14 @@ void WebSocketChannel::close() m_handle->close(); // will call didClose() } +void WebSocketChannel::disconnect() +{ + LOG(Network, "WebSocketChannel %p disconnect", this); + m_client = 0; + if (m_handle.get()) + m_handle->close(); +} + void WebSocketChannel::willOpenStream(SocketStreamHandle*, const KURL&) { } @@ -126,13 +135,15 @@ void WebSocketChannel::didClose(SocketStreamHandle* handle) { LOG(Network, "WebSocketChannel %p didClose", this); ASSERT(handle == m_handle.get() || !m_handle.get()); - if (!m_handle.get()) - return; - m_unhandledBufferSize = handle->bufferedAmount(); - WebSocketChannelClient* client = m_client; - m_client = 0; - m_handle = 0; - client->didClose(); + if (m_handle.get()) { + m_unhandledBufferSize = handle->bufferedAmount(); + WebSocketChannelClient* client = m_client; + m_client = 0; + m_handle = 0; + if (client) + client->didClose(); + } + deref(); } void WebSocketChannel::didReceiveData(SocketStreamHandle* handle, const char* data, int len) @@ -143,6 +154,10 @@ void WebSocketChannel::didReceiveData(SocketStreamHandle* handle, const char* da handle->close(); return; } + if (!m_client) { + handle->close(); + return; + } if (m_handshake.mode() != WebSocketHandshake::Connected) { int headerLength = m_handshake.readServerHandshake(m_buffer, m_bufferSize); if (headerLength <= 0) @@ -184,7 +199,7 @@ void WebSocketChannel::didReceiveData(SocketStreamHandle* handle, const char* da handle->close(); return; } - length = length * 128 + *p & 0x7f; + length = length * 128 + (*p & 0x7f); ++p; } if (p + length < end) { |