| Index: net/spdy/spdy_stream.h
 | 
| diff --git a/net/spdy/spdy_stream.h b/net/spdy/spdy_stream.h
 | 
| index b9ecfe992623956bb7e2d1bd5d3b79f51e0e1f1c..5f14f87c49c7a3f760d6c4f1a0f1e7380bcfd019 100644
 | 
| --- a/net/spdy/spdy_stream.h
 | 
| +++ b/net/spdy/spdy_stream.h
 | 
| @@ -56,12 +56,12 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|     public:
 | 
|      Delegate() {}
 | 
|  
 | 
| -    // Called when SYN frame has been sent.
 | 
| -    // Returns true if no more data to be sent after SYN frame.
 | 
| +    // Called when SYN frame has been sent.  Must return whether
 | 
| +    // there's body data to send.
 | 
|      virtual SpdySendStatus OnSendHeadersComplete() = 0;
 | 
|  
 | 
|      // Called when the stream is ready to send body data.  The
 | 
| -    // delegate must call QueueStreamData() on the stream, either
 | 
| +    // delegate must call SendStreamData() on the stream, either
 | 
|      // immediately or asynchronously (e.g., if the data to be send has
 | 
|      // to be read asynchronously).
 | 
|      //
 | 
| @@ -69,10 +69,9 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|      // OnSendBodyComplete() returns MORE_DATA_TO_SEND.
 | 
|      virtual void OnSendBody() = 0;
 | 
|  
 | 
| -    // Called when body data has been sent. |bytes_sent| is the number
 | 
| -    // of bytes that has been sent (may be zero). Must return whether
 | 
| +    // Called when body data has been sent. Must return whether
 | 
|      // there's more body data to send.
 | 
| -    virtual SpdySendStatus OnSendBodyComplete(size_t bytes_sent) = 0;
 | 
| +    virtual SpdySendStatus OnSendBodyComplete() = 0;
 | 
|  
 | 
|      // Called when the SYN_STREAM, SYN_REPLY, or HEADERS frames are received.
 | 
|      // Normal streams will receive a SYN_REPLY and optional HEADERS frames.
 | 
| @@ -93,7 +92,7 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|      virtual int OnDataReceived(scoped_ptr<SpdyBuffer> buffer) = 0;
 | 
|  
 | 
|      // Called when data is sent.
 | 
| -    virtual void OnDataSent(size_t bytes_sent) = 0;
 | 
| +    virtual void OnDataSent() = 0;
 | 
|  
 | 
|      // Called when SpdyStream is closed. No other delegate functions
 | 
|      // will be called after this is called, and the delegate must not
 | 
| @@ -288,19 +287,28 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|    // this once crbug.com/113107 is addressed.
 | 
|    bool body_sent() const { return io_state_ > STATE_SEND_BODY_COMPLETE; }
 | 
|  
 | 
| -  // Interface for Spdy[Http|WebSocket]Stream to use.
 | 
| +  // Interface for the delegate to use.
 | 
| +  //
 | 
| +  // TODO(akalin): Mandate that only one send can be in flight at one
 | 
| +  // time.
 | 
|  
 | 
|    // Sends the request.
 | 
|    // For non push stream, it will send SYN_STREAM frame.
 | 
|    int SendRequest(bool has_upload_data);
 | 
|  
 | 
| -  // Queues a HEADERS frame to be sent.
 | 
| -  void QueueHeaders(scoped_ptr<SpdyHeaderBlock> headers);
 | 
| +  // Sends a HEADERS frame. The delegate will be notified via
 | 
| +  // OnHeadersSent() when the send is complete.
 | 
| +  void SendHeaders(scoped_ptr<SpdyHeaderBlock> headers);
 | 
|  
 | 
| -  // Queues a DATA frame to be sent. May not queue all the data that
 | 
| -  // is given (or even any of it) depending on flow control.
 | 
| -  void QueueStreamData(IOBuffer* data, int length,
 | 
| -                       SpdyDataFlags flags);
 | 
| +  // Sends a DATA frame. The delegate will be notified via
 | 
| +  // OnSendBodyComplete() (if the response hasn't been received yet)
 | 
| +  // or OnDataSent() (if the response has been received) when the send
 | 
| +  // is complete. Only one data send can be in flight at one time.
 | 
| +  //
 | 
| +  // |flags| must be DATA_FLAG_NONE except for the last piece of data
 | 
| +  // for a request in a request/response stream, where it should be
 | 
| +  // DATA_FLAG_FIN.
 | 
| +  void SendStreamData(IOBuffer* data, int length, SpdyDataFlags flags);
 | 
|  
 | 
|    // Fills SSL info in |ssl_info| and returns true when SSL is in use.
 | 
|    bool GetSSLInfo(SSLInfo* ssl_info,
 | 
| @@ -390,6 +398,11 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|    scoped_ptr<SpdyFrame> ProduceHeaderFrame(
 | 
|        scoped_ptr<SpdyHeaderBlock> header_block);
 | 
|  
 | 
| +  // Queues the send for next frame of the remaining data in
 | 
| +  // |pending_send_data_|. Must be called only when
 | 
| +  // |pending_send_data_| and |pending_send_flags_| are set.
 | 
| +  void QueueNextDataFrame();
 | 
| +
 | 
|    base::WeakPtrFactory<SpdyStream> weak_ptr_factory_;
 | 
|  
 | 
|    // Sentinel variable used to make sure we don't get destroyed by a
 | 
| @@ -424,6 +437,10 @@ class NET_EXPORT_PRIVATE SpdyStream {
 | 
|    // The request to send.
 | 
|    scoped_ptr<SpdyHeaderBlock> request_;
 | 
|  
 | 
| +  // The data waiting to be sent.
 | 
| +  scoped_refptr<DrainableIOBuffer> pending_send_data_;
 | 
| +  SpdyDataFlags pending_send_flags_;
 | 
| +
 | 
|    // The time at which the request was made that resulted in this response.
 | 
|    // For cached responses, this time could be "far" in the past.
 | 
|    base::Time request_time_;
 | 
| 
 |