• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
data()52   const std::string& data() { return data_; }
53 
54   // Returns whatever headers have been received for this stream.
headers()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