Index: net/spdy/spdy_session.h |
=================================================================== |
--- net/spdy/spdy_session.h (revision 105257) |
+++ net/spdy/spdy_session.h (working copy) |
@@ -104,7 +104,8 @@ |
// NOTE: This function can have false negatives on some platforms. |
bool VerifyDomainAuthentication(const std::string& domain); |
- // Send the SYN frame for |stream_id|. |
+ // Send the SYN frame for |stream_id|. This also sends PING message to check |
+ // the status of the connection. |
int WriteSynStream( |
spdy::SpdyStreamId stream_id, |
RequestPriority priority, |
@@ -271,12 +272,14 @@ |
const linked_ptr<spdy::SpdyHeaderBlock>& headers); |
void OnRst(const spdy::SpdyRstStreamControlFrame& frame); |
void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame); |
+ void OnPing(const spdy::SpdyPingControlFrame& frame); |
void OnSettings(const spdy::SpdySettingsControlFrame& frame); |
void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame); |
// IO Callbacks |
void OnReadComplete(int result); |
void OnWriteComplete(int result); |
+ void OnWriteCompleteInternal(int result, bool ping_frame); |
// Send relevant SETTINGS. This is generally called on connection setup. |
void SendSettings(); |
@@ -285,6 +288,24 @@ |
// SETTINGS ontrol frame, update our SpdySession accordingly. |
void HandleSettings(const spdy::SpdySettings& settings); |
+ // Send the PING (pre-PING and post-PING) frames for |stream_id|. |
+ int SendPing(spdy::SpdyStreamId stream_id); |
+ |
+ // Send PING if there are no PINGs in flight and we haven't heard from server. |
+ int SendPrePing(spdy::SpdyStreamId stream_id); |
+ |
+ // Send a delayed PING if there is no |follower_ping_pending_|. This PING |
+ // makes sure the request has been received by the server. |
+ int SendPostPing(spdy::SpdyStreamId stream_id); |
+ |
+ // Send the PING frame for |stream_id|. |
+ int WritePingFrame(spdy::SpdyStreamId stream_id); |
+ |
+ // Check the status of the connection. It does |DeleteStream| if we haven't |
+ // received any data in |kHungInterval|. |
+ void CheckStatus(spdy::SpdyStreamId stream_id, |
+ base::TimeTicks last_check_time); |
+ |
// Start reading from the socket. |
// Returns OK on success, or an error on failure. |
net::Error ReadSocket(); |
@@ -431,6 +452,18 @@ |
// frame. |
int stalled_streams_; // Count of streams that were ever stalled. |
+ // This list keeps track of all pings (unique_ids) that are in flight. |
+ int64 pings_in_flight_; |
+ |
+ // This is the next unique_id to be sent in PING frame. |
+ uint32 unique_id_counter_; |
+ |
+ // This is the last time we had received data. |
+ base::TimeTicks received_data_time_; |
+ |
+ // Flag if we have a pending follower ping. |
+ bool follower_ping_pending_; |
+ |
// Initial send window size for the session; can be changed by an |
// arriving SETTINGS frame; newly created streams use this value for the |
// initial send window size. |