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