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