1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/types.h>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/io_buffer.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_data_stream.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_protocol.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/tools/balsa/balsa_frame.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/tools/balsa/balsa_headers.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicClientSession;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// All this does right now is send an SPDY request, and aggregate the
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// SPDY response.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuicSpdyClientStream : public QuicDataStream {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicSpdyClientStream(QuicStreamId id, QuicClientSession* session);
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~QuicSpdyClientStream();
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Override the base class to close the write side as soon as we get a
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // response.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SPDY/HTTP does not support bidirectional streaming.
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Override the base class to store the size of the headers.
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnStreamHeadersComplete(bool fin, size_t frame_len) OVERRIDE;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ReliableQuicStream implementation called by the session when there's
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // data for us.
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE;
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnFinRead() OVERRIDE;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Serializes the headers and body, sends it to the server, and
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // returns the number of bytes sent.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ssize_t SendRequest(const BalsaHeaders& headers,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::StringPiece body,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      bool fin);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Sends body data to the server, or buffers if it can't be sent immediately.
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SendBody(const std::string& data, bool fin);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns the response data.
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& data() { return data_; }
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns whatever headers have been received for this stream.
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const BalsaHeaders& headers() { return headers_; }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t header_bytes_read() const { return header_bytes_read_; }
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t header_bytes_written() const { return header_bytes_written_; }
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // While the server's set_priority shouldn't be called externally, the creator
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // of client-side streams should be able to set the priority.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  using QuicDataStream::set_priority;
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int ParseResponseHeaders();
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  BalsaHeaders headers_;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string data_;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<GrowableIOBuffer> read_buf_;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool response_headers_received_;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t header_bytes_read_;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t header_bytes_written_;
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(QuicSpdyClientStream);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // NET_TOOLS_QUIC_QUIC_SPDY_CLIENT_STREAM_H_
87