Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
      6 #define NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
      7 
      8 #include <sys/types.h>
      9 #include <string>
     10 
     11 #include "base/strings/string_piece.h"
     12 #include "net/base/io_buffer.h"
     13 #include "net/quic/quic_data_stream.h"
     14 #include "net/quic/quic_protocol.h"
     15 #include "net/tools/balsa/balsa_frame.h"
     16 #include "net/tools/balsa/balsa_headers.h"
     17 
     18 namespace net {
     19 
     20 namespace tools {
     21 
     22 class QuicClientSession;
     23 
     24 // All this does right now is send an SPDY request, and aggregate the
     25 // SPDY response.
     26 class QuicSpdyClientStream : public QuicDataStream {
     27  public:
     28   QuicSpdyClientStream(QuicStreamId id, QuicClientSession* session);
     29   virtual ~QuicSpdyClientStream();
     30 
     31   // Override the base class to close the write side as soon as we get a
     32   // response.
     33   // SPDY/HTTP does not support bidirectional streaming.
     34   virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE;
     35 
     36   // ReliableQuicStream implementation called by the session when there's
     37   // data for us.
     38   virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE;
     39 
     40   virtual void OnFinRead() OVERRIDE;
     41 
     42   // Serializes the headers and body, sends it to the server, and
     43   // returns the number of bytes sent.
     44   ssize_t SendRequest(const BalsaHeaders& headers,
     45                       base::StringPiece body,
     46                       bool fin);
     47 
     48   // Sends body data to the server, or buffers if it can't be sent immediately.
     49   void SendBody(const std::string& data, bool fin);
     50 
     51   // Returns the response data.
     52   const std::string& data() { return data_; }
     53 
     54   // Returns whatever headers have been received for this stream.
     55   const BalsaHeaders& headers() { return headers_; }
     56 
     57   // While the server's set_priority shouldn't be called externally, the creator
     58   // of client-side streams should be able to set the priority.
     59   using QuicDataStream::set_priority;
     60 
     61  private:
     62   int ParseResponseHeaders();
     63 
     64   BalsaHeaders headers_;
     65   std::string data_;
     66 
     67   scoped_refptr<GrowableIOBuffer> read_buf_;
     68   bool response_headers_received_;
     69 };
     70 
     71 }  // namespace tools
     72 }  // namespace net
     73 
     74 #endif  // NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
     75