| Index: net/quic/quic_client_session_base.cc
|
| diff --git a/net/quic/quic_client_session_base.cc b/net/quic/quic_client_session_base.cc
|
| deleted file mode 100644
|
| index 7875c67cd8979deecd766b145ff7d4472f4f7c7b..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_client_session_base.cc
|
| +++ /dev/null
|
| @@ -1,205 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/quic/quic_client_session_base.h"
|
| -
|
| -#include "net/quic/quic_client_promised_info.h"
|
| -#include "net/quic/quic_flags.h"
|
| -#include "net/quic/spdy_utils.h"
|
| -
|
| -using base::StringPiece;
|
| -using std::string;
|
| -
|
| -namespace net {
|
| -
|
| -QuicClientSessionBase::QuicClientSessionBase(
|
| - QuicConnection* connection,
|
| - QuicClientPushPromiseIndex* push_promise_index,
|
| - const QuicConfig& config)
|
| - : QuicSpdySession(connection, config),
|
| - push_promise_index_(push_promise_index),
|
| - largest_promised_stream_id_(kInvalidStreamId) {}
|
| -
|
| -QuicClientSessionBase::~QuicClientSessionBase() {
|
| - // all promised streams for this session
|
| - for (auto& it : promised_by_id_) {
|
| - DVLOG(1) << "erase stream " << it.first << " url " << it.second->url();
|
| - push_promise_index_->promised_by_url()->erase(it.second->url());
|
| - }
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnConfigNegotiated() {
|
| - QuicSpdySession::OnConfigNegotiated();
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
|
| - QuicSession::OnCryptoHandshakeEvent(event);
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnPromiseHeaders(QuicStreamId stream_id,
|
| - StringPiece headers_data) {
|
| - QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
|
| - if (!stream) {
|
| - // It's quite possible to receive headers after a stream has been reset.
|
| - return;
|
| - }
|
| - stream->OnPromiseHeaders(headers_data);
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnInitialHeadersComplete(
|
| - QuicStreamId stream_id,
|
| - const SpdyHeaderBlock& response_headers) {
|
| - // Note that the strong ordering of the headers stream means that
|
| - // QuicSpdyClientStream::OnPromiseHeadersComplete must have already
|
| - // been called (on the associated stream) if this is a promised
|
| - // stream. However, this stream may not have existed at this time,
|
| - // hence the need to query the session.
|
| - QuicClientPromisedInfo* promised = GetPromisedById(stream_id);
|
| - if (!promised)
|
| - return;
|
| -
|
| - promised->OnResponseHeaders(response_headers);
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnPromiseHeadersComplete(
|
| - QuicStreamId stream_id,
|
| - QuicStreamId promised_stream_id,
|
| - size_t frame_len) {
|
| - if (promised_stream_id != kInvalidStreamId &&
|
| - promised_stream_id <= largest_promised_stream_id_) {
|
| - connection()->CloseConnection(
|
| - QUIC_INVALID_STREAM_ID,
|
| - "Received push stream id lesser or equal to the"
|
| - " last accepted before",
|
| - ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
|
| - return;
|
| - }
|
| - largest_promised_stream_id_ = promised_stream_id;
|
| -
|
| - QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
|
| - if (!stream) {
|
| - // It's quite possible to receive headers after a stream has been reset.
|
| - return;
|
| - }
|
| - stream->OnPromiseHeadersComplete(promised_stream_id, frame_len);
|
| -}
|
| -
|
| -void QuicClientSessionBase::OnPromiseHeaderList(
|
| - QuicStreamId stream_id,
|
| - QuicStreamId promised_stream_id,
|
| - size_t frame_len,
|
| - const QuicHeaderList& header_list) {
|
| - if (promised_stream_id != kInvalidStreamId &&
|
| - promised_stream_id <= largest_promised_stream_id_) {
|
| - connection()->CloseConnection(
|
| - QUIC_INVALID_STREAM_ID,
|
| - "Received push stream id lesser or equal to the"
|
| - " last accepted before",
|
| - ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
|
| - return;
|
| - }
|
| - largest_promised_stream_id_ = promised_stream_id;
|
| -
|
| - QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
|
| - if (!stream) {
|
| - // It's quite possible to receive headers after a stream has been reset.
|
| - return;
|
| - }
|
| - stream->OnPromiseHeaderList(promised_stream_id, frame_len, header_list);
|
| -}
|
| -
|
| -void QuicClientSessionBase::HandlePromised(QuicStreamId /* associated_id */,
|
| - QuicStreamId id,
|
| - const SpdyHeaderBlock& headers) {
|
| - // Due to pathalogical packet re-ordering, it is possible that
|
| - // frames for the promised stream have already arrived, and the
|
| - // promised stream could be active or closed.
|
| - if (IsClosedStream(id)) {
|
| - // There was a RST on the data stream already, perhaps
|
| - // QUIC_REFUSED_STREAM?
|
| - DVLOG(1) << "Promise ignored for stream " << id
|
| - << " that is already closed";
|
| - return;
|
| - }
|
| -
|
| - if (push_promise_index_->promised_by_url()->size() >= get_max_promises()) {
|
| - DVLOG(1) << "Too many promises, rejecting promise for stream " << id;
|
| - ResetPromised(id, QUIC_REFUSED_STREAM);
|
| - return;
|
| - }
|
| -
|
| - const string url = SpdyUtils::GetUrlFromHeaderBlock(headers);
|
| - QuicClientPromisedInfo* old_promised = GetPromisedByUrl(url);
|
| - if (old_promised) {
|
| - DVLOG(1) << "Promise for stream " << id << " is duplicate URL " << url
|
| - << " of previous promise for stream " << old_promised->id();
|
| - ResetPromised(id, QUIC_DUPLICATE_PROMISE_URL);
|
| - return;
|
| - }
|
| -
|
| - if (GetPromisedById(id)) {
|
| - // OnPromiseHeadersComplete() would have closed the connection if
|
| - // promised id is a duplicate.
|
| - QUIC_BUG << "Duplicate promise for id " << id;
|
| - return;
|
| - }
|
| -
|
| - QuicClientPromisedInfo* promised = new QuicClientPromisedInfo(this, id, url);
|
| - std::unique_ptr<QuicClientPromisedInfo> promised_owner(promised);
|
| - promised->Init();
|
| - DVLOG(1) << "stream " << id << " emplace url " << url;
|
| - (*push_promise_index_->promised_by_url())[url] = promised;
|
| - promised_by_id_[id] = std::move(promised_owner);
|
| - promised->OnPromiseHeaders(headers);
|
| -}
|
| -
|
| -QuicClientPromisedInfo* QuicClientSessionBase::GetPromisedByUrl(
|
| - const string& url) {
|
| - QuicPromisedByUrlMap::iterator it =
|
| - push_promise_index_->promised_by_url()->find(url);
|
| - if (it != push_promise_index_->promised_by_url()->end()) {
|
| - return it->second;
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -QuicClientPromisedInfo* QuicClientSessionBase::GetPromisedById(
|
| - const QuicStreamId id) {
|
| - QuicPromisedByIdMap::iterator it = promised_by_id_.find(id);
|
| - if (it != promised_by_id_.end()) {
|
| - return it->second.get();
|
| - }
|
| - return nullptr;
|
| -}
|
| -
|
| -QuicSpdyStream* QuicClientSessionBase::GetPromisedStream(
|
| - const QuicStreamId id) {
|
| - if (IsClosedStream(id)) {
|
| - return nullptr;
|
| - }
|
| - DynamicStreamMap::iterator it = dynamic_streams().find(id);
|
| - if (it != dynamic_streams().end()) {
|
| - return static_cast<QuicSpdyStream*>(it->second);
|
| - }
|
| - QUIC_BUG << "Open promised stream " << id << " is missing!";
|
| - return nullptr;
|
| -}
|
| -
|
| -void QuicClientSessionBase::DeletePromised(QuicClientPromisedInfo* promised) {
|
| - push_promise_index_->promised_by_url()->erase(promised->url());
|
| - // Since promised_by_id_ contains the unique_ptr, this will destroy
|
| - // promised.
|
| - promised_by_id_.erase(promised->id());
|
| -}
|
| -
|
| -void QuicClientSessionBase::ResetPromised(QuicStreamId id,
|
| - QuicRstStreamErrorCode error_code) {
|
| - SendRstStream(id, error_code, 0);
|
| - if (!IsOpenStream(id)) {
|
| - MaybeIncreaseLargestPeerStreamId(id);
|
| - InsertLocallyClosedStreamsHighestOffset(id, 0);
|
| - }
|
| -}
|
| -
|
| -} // namespace net
|
|
|