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/basictypes.h" 12#include "base/strings/string_piece.h" 13#include "net/base/io_buffer.h" 14#include "net/quic/quic_data_stream.h" 15#include "net/quic/quic_protocol.h" 16#include "net/tools/balsa/balsa_frame.h" 17#include "net/tools/balsa/balsa_headers.h" 18 19namespace net { 20 21namespace tools { 22 23class QuicClientSession; 24 25// All this does right now is send an SPDY request, and aggregate the 26// SPDY response. 27class QuicSpdyClientStream : public QuicDataStream { 28 public: 29 QuicSpdyClientStream(QuicStreamId id, QuicClientSession* session); 30 virtual ~QuicSpdyClientStream(); 31 32 // Override the base class to close the write side as soon as we get a 33 // response. 34 // SPDY/HTTP does not support bidirectional streaming. 35 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE; 36 37 // Override the base class to store the size of the headers. 38 virtual void OnStreamHeadersComplete(bool fin, size_t frame_len) OVERRIDE; 39 40 // ReliableQuicStream implementation called by the session when there's 41 // data for us. 42 virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE; 43 44 virtual void OnFinRead() OVERRIDE; 45 46 // Serializes the headers and body, sends it to the server, and 47 // returns the number of bytes sent. 48 ssize_t SendRequest(const BalsaHeaders& headers, 49 base::StringPiece body, 50 bool fin); 51 52 // Sends body data to the server, or buffers if it can't be sent immediately. 53 void SendBody(const std::string& data, bool fin); 54 55 // Returns the response data. 56 const std::string& data() { return data_; } 57 58 // Returns whatever headers have been received for this stream. 59 const BalsaHeaders& headers() { return headers_; } 60 61 size_t header_bytes_read() const { return header_bytes_read_; } 62 63 size_t header_bytes_written() const { return header_bytes_written_; } 64 65 // While the server's set_priority shouldn't be called externally, the creator 66 // of client-side streams should be able to set the priority. 67 using QuicDataStream::set_priority; 68 69 private: 70 int ParseResponseHeaders(); 71 72 BalsaHeaders headers_; 73 std::string data_; 74 75 scoped_refptr<GrowableIOBuffer> read_buf_; 76 bool response_headers_received_; 77 size_t header_bytes_read_; 78 size_t header_bytes_written_; 79 80 DISALLOW_COPY_AND_ASSIGN(QuicSpdyClientStream); 81}; 82 83} // namespace tools 84} // namespace net 85 86#endif // NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_ 87