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)#include "net/tools/quic/quic_client_session.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/crypto_protocol.h"
9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/quic/quic_server_id.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_spdy_client_stream.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using std::string;
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17116680a4aac90f2aa7413d9095a592090648e557Ben MurdochQuicClientSession::QuicClientSession(const QuicConfig& config,
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     QuicConnection* connection)
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : QuicClientSessionBase(connection, config) {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicClientSession::~QuicClientSession() {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid QuicClientSession::InitializeSession(
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const QuicServerId& server_id,
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    QuicCryptoClientConfig* crypto_config) {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  QuicClientSessionBase::InitializeSession();
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  crypto_stream_.reset(
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new QuicCryptoClientStream(server_id, this, NULL, crypto_config));
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid QuicClientSession::OnProofValid(
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const QuicCryptoClientConfig::CachedState& /*cached*/) {
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid QuicClientSession::OnProofVerifyDetailsAvailable(
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const ProofVerifyDetails& /*verify_details*/) {
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicSpdyClientStream* QuicClientSession::CreateOutgoingDataStream() {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!crypto_stream_->encryption_established()) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "Encryption not active so no outgoing stream created.";
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (GetNumOpenStreams() >= get_max_open_streams()) {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "Failed to create a new outgoing stream. "
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             << "Already " << GetNumOpenStreams() << " open.";
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (goaway_received()) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "Failed to create a new outgoing stream. "
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             << "Already received goaway.";
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicSpdyClientStream* stream
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      = new QuicSpdyClientStream(GetNextStreamId(), this);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ActivateStream(stream);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return stream;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicCryptoClientStream* QuicClientSession::GetCryptoStream() {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return crypto_stream_.get();
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool QuicClientSession::CryptoConnect() {
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(flow_controller());
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return crypto_stream_->CryptoConnect();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int QuicClientSession::GetNumSentClientHellos() const {
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return crypto_stream_->num_sent_client_hellos();
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicDataStream* QuicClientSession::CreateIncomingDataStream(
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicStreamId id) {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DLOG(ERROR) << "Server push not supported";
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return NULL;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
83