15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_SPDY_SPDY_WEBSOCKET_STREAM_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_SPDY_SPDY_WEBSOCKET_STREAM_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/request_priority.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_framer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_header_block.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/spdy/spdy_session.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_stream.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The SpdyWebSocketStream is a WebSocket-specific type of stream known to a 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SpdySession. WebSocket's opening handshake is converted to SPDY's 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SYN_STREAM/SYN_REPLY. WebSocket frames are encapsulated as SPDY data frames. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE SpdyWebSocketStream 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public SpdyStream::Delegate { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate handles asynchronous events. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class NET_EXPORT_PRIVATE Delegate { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when InitializeStream() finishes asynchronously. This delegate is 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called if InitializeStream() returns ERR_IO_PENDING. |status| indicates 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network error. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCreatedSpdyStream(int status) = 0; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called on corresponding to OnSendHeadersComplete() or SPDY's SYN frame 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has been sent. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSentSpdyHeaders() = 0; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Called on corresponding to OnResponseHeadersUpdated() or 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // SPDY's SYN_STREAM, SYN_REPLY, or HEADERS frames are 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // received. This callback may be called multiple times as SPDY's 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // delegate does. 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnSpdyResponseHeadersUpdated( 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SpdyHeaderBlock& response_headers) = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when data is sent. 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSentSpdyData(size_t bytes_sent) = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when data is received. 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnReceivedSpdyData(scoped_ptr<SpdyBuffer> buffer) = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when SpdyStream is closed. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCloseSpdyStream() = 0; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SpdyWebSocketStream(const base::WeakPtr<SpdySession>& spdy_session, 62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Delegate* delegate); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SpdyWebSocketStream(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes SPDY stream for the WebSocket. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It might create SPDY stream asynchronously. In this case, this method 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns ERR_IO_PENDING and call OnCreatedSpdyStream delegate with result 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after completion. In other cases, delegate does not be called. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int InitializeStream(const GURL& url, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestPriority request_priority, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& stream_net_log); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int SendRequest(scoped_ptr<SpdyHeaderBlock> headers); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int SendData(const char* data, int length); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SpdyStream::Delegate 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnRequestHeadersSent() OVERRIDE; 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual SpdyResponseHeadersStatus OnResponseHeadersUpdated( 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SpdyHeaderBlock& response_headers) OVERRIDE; 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnDataReceived(scoped_ptr<SpdyBuffer> buffer) OVERRIDE; 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void OnDataSent() OVERRIDE; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose(int status) OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch friend class SpdyWebSocketStreamTest; 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(SpdyWebSocketStreamTest, Basic); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSpdyStreamCreated(int status); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamRequest stream_request_; 92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::WeakPtr<SpdyStream> stream_; 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::WeakPtr<SpdySession> spdy_session_; 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t pending_send_data_length_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::WeakPtrFactory<SpdyWebSocketStream> weak_ptr_factory_; 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SpdyWebSocketStream); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_SPDY_SPDY_WEBSOCKET_STREAM_H_ 105