Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Unified Diff: net/spdy/spdy_websocket_stream.cc

Issue 3020068: WebSocket over SPDY. (Closed)
Patch Set: fix unittests Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_websocket_stream.h ('k') | net/spdy/spdy_websocket_stream_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_websocket_stream.cc
diff --git a/net/spdy/spdy_websocket_stream.cc b/net/spdy/spdy_websocket_stream.cc
new file mode 100644
index 0000000000000000000000000000000000000000..44c6b6a05ea29aa9953049b780b0b3a304d23939
--- /dev/null
+++ b/net/spdy/spdy_websocket_stream.cc
@@ -0,0 +1,141 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/spdy/spdy_websocket_stream.h"
+
+#include "googleurl/src/gurl.h"
+#include "net/base/net_errors.h"
+#include "net/base/io_buffer.h"
+#include "net/spdy/spdy_framer.h"
+#include "net/spdy/spdy_protocol.h"
+#include "net/spdy/spdy_session.h"
+#include "net/spdy/spdy_stream.h"
+
+namespace net {
+
+SpdyWebSocketStream::SpdyWebSocketStream(
+ SpdySession* spdy_session,
+ SpdyWebSocketStreamDelegate* delegate)
+ : stream_(NULL),
+ spdy_session_(spdy_session),
+ delegate_(delegate),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ io_callback_(this, &SpdyWebSocketStream::OnIOCompleted)) {
+}
+
+SpdyWebSocketStream::~SpdyWebSocketStream() {
+ if (stream_)
+ stream_->DetachDelegate();
+}
+
+int SpdyWebSocketStream::InitializeStream(
+ const GURL& url,
+ RequestPriority request_priority,
+ const BoundNetLog& net_log) {
+ if (spdy_session_->IsClosed())
+ return ERR_CONNECTION_CLOSED;
+
+ int result = spdy_session_->CreateStream(url,
+ request_priority,
+ &stream_,
+ net_log,
+ &io_callback_);
+ if (result != ERR_IO_PENDING)
+ OnSpdyStreamCreated(result);
+ return result;
+}
+
+void SpdyWebSocketStream::SendRequest(
+ linked_ptr<spdy::SpdyHeaderBlock> headers) {
+ if (!stream_)
+ return;
+ stream_->set_spdy_headers(headers);
+ int result = stream_->SendRequest(true);
+ if (result < OK && result != ERR_IO_PENDING)
+ Close();
+}
+
+void SpdyWebSocketStream::SendData(const char* data, int length) {
+ if (!stream_)
+ return;
+ IOBuffer* buf(new IOBuffer(length));
+ memcpy(buf->data(), data, length);
+ int result = stream_->WriteStreamData(buf, length, spdy::DATA_FLAG_NONE);
+ if (result < OK && result != ERR_IO_PENDING)
+ Close();
+}
+
+void SpdyWebSocketStream::Close() {
+ if (spdy_session_)
+ spdy_session_->CancelPendingCreateStreams(&stream_);
+ if (stream_)
+ stream_->Close();
+}
+
+bool SpdyWebSocketStream::OnSendHeadersComplete(int status) {
+ if (delegate_)
+ delegate_->OnSentSpdyHeaders(this);
+ return true;
+}
+
+int SpdyWebSocketStream::OnSendBody() {
+ NOTREACHED();
+ return ERR_UNEXPECTED;
+}
+
+bool SpdyWebSocketStream::OnSendBodyComplete(int status) {
+ NOTREACHED();
+ return true;
+}
+
+bool SpdyWebSocketStream::IsFinishedSendingBody() {
+ NOTREACHED();
+ return true;
+}
+
+int SpdyWebSocketStream::OnResponseReceived(
+ const spdy::SpdyHeaderBlock& response,
+ base::Time response_time, int status) {
+ if (!delegate_)
+ return ERR_ABORTED;
+ return delegate_->OnReceivedSpdyResponseHeader(this, response, status);
+}
+
+void SpdyWebSocketStream::OnDataReceived(const char* data, int length) {
+ if (!delegate_)
+ return;
+ delegate_->OnReceivedSpdyData(this, data, length);
+}
+
+void SpdyWebSocketStream::OnDataSent(int length) {
+ if (!delegate_)
+ return;
+ delegate_->OnSentSpdyData(this, length);
+}
+
+void SpdyWebSocketStream::OnClose(int status) {
+ if (!delegate_)
+ return;
+ SpdyWebSocketStreamDelegate* delegate = delegate_;
+ delegate_ = NULL;
+ stream_ = NULL;
+ if (delegate)
+ delegate->OnCloseSpdyStream(this);
+}
+
+void SpdyWebSocketStream::OnIOCompleted(int result) {
+ OnSpdyStreamCreated(result);
+}
+
+void SpdyWebSocketStream::OnSpdyStreamCreated(int result) {
+ DCHECK_NE(ERR_IO_PENDING, result);
+ if (stream_)
+ stream_->SetDelegate(this);
+ if (delegate_) {
+ delegate_->OnCreatedSpdyStream(this, result);
+ }
+}
+
+
+} // namespace net
« no previous file with comments | « net/spdy/spdy_websocket_stream.h ('k') | net/spdy/spdy_websocket_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698