Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: net/spdy/spdy_session.cc

Issue 2346383003: Deprecated: Server Push Cancellation: add a interface PushPromiseHelper
Patch Set: Implemente PushPromiseHelper::Cancel() Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_session.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/spdy_session.h" 5 #include "net/spdy/spdy_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <map> 9 #include <map>
10 #include <utility> 10 #include <utility>
(...skipping 27 matching lines...) Expand all
38 #include "net/http/http_util.h" 38 #include "net/http/http_util.h"
39 #include "net/http/transport_security_state.h" 39 #include "net/http/transport_security_state.h"
40 #include "net/log/net_log.h" 40 #include "net/log/net_log.h"
41 #include "net/log/net_log_capture_mode.h" 41 #include "net/log/net_log_capture_mode.h"
42 #include "net/log/net_log_event_type.h" 42 #include "net/log/net_log_event_type.h"
43 #include "net/log/net_log_source.h" 43 #include "net/log/net_log_source.h"
44 #include "net/log/net_log_source_type.h" 44 #include "net/log/net_log_source_type.h"
45 #include "net/log/net_log_with_source.h" 45 #include "net/log/net_log_with_source.h"
46 #include "net/proxy/proxy_server.h" 46 #include "net/proxy/proxy_server.h"
47 #include "net/socket/ssl_client_socket.h" 47 #include "net/socket/ssl_client_socket.h"
48 #include "net/spdy/push_promise_helper.h"
48 #include "net/spdy/spdy_buffer_producer.h" 49 #include "net/spdy/spdy_buffer_producer.h"
49 #include "net/spdy/spdy_frame_builder.h" 50 #include "net/spdy/spdy_frame_builder.h"
50 #include "net/spdy/spdy_http_utils.h" 51 #include "net/spdy/spdy_http_utils.h"
51 #include "net/spdy/spdy_protocol.h" 52 #include "net/spdy/spdy_protocol.h"
52 #include "net/spdy/spdy_session_pool.h" 53 #include "net/spdy/spdy_session_pool.h"
53 #include "net/spdy/spdy_stream.h" 54 #include "net/spdy/spdy_stream.h"
54 #include "net/ssl/channel_id_service.h" 55 #include "net/ssl/channel_id_service.h"
55 #include "net/ssl/ssl_cipher_suite_names.h" 56 #include "net/ssl/ssl_cipher_suite_names.h"
56 #include "net/ssl/ssl_connection_status_flags.h" 57 #include "net/ssl/ssl_connection_status_flags.h"
57 58
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 } 289 }
289 290
290 private: 291 private:
291 const base::WeakPtr<SpdyStreamRequest> request_; 292 const base::WeakPtr<SpdyStreamRequest> request_;
292 }; 293 };
293 294
294 // The maximum number of concurrent streams we will ever create. Even if 295 // The maximum number of concurrent streams we will ever create. Even if
295 // the server permits more, we will never exceed this limit. 296 // the server permits more, we will never exceed this limit.
296 const size_t kMaxConcurrentStreamLimit = 256; 297 const size_t kMaxConcurrentStreamLimit = 256;
297 298
299 class SpdyPushPromiseHelper : public PushPromiseHelper {
300 public:
301 explicit SpdyPushPromiseHelper(base::WeakPtr<SpdySession> session,
302 const GURL& url)
303 : session_(session), request_url_(url) {}
304
305 void Cancel() override {
306 if (session_) {
307 session_->CancelPush(request_url_);
308 }
309 }
310
311 const GURL& GetURL() override { return request_url_; }
312
313 private:
314 base::WeakPtr<SpdySession> session_;
315 const GURL request_url_;
316 };
317
298 } // namespace 318 } // namespace
299 319
300 SpdyProtocolErrorDetails MapFramerErrorToProtocolError( 320 SpdyProtocolErrorDetails MapFramerErrorToProtocolError(
301 SpdyFramer::SpdyError err) { 321 SpdyFramer::SpdyError err) {
302 switch (err) { 322 switch (err) {
303 case SpdyFramer::SPDY_NO_ERROR: 323 case SpdyFramer::SPDY_NO_ERROR:
304 return SPDY_ERROR_NO_ERROR; 324 return SPDY_ERROR_NO_ERROR;
305 case SpdyFramer::SPDY_INVALID_STREAM_ID: 325 case SpdyFramer::SPDY_INVALID_STREAM_ID:
306 return SPDY_ERROR_INVALID_STREAM_ID; 326 return SPDY_ERROR_INVALID_STREAM_ID;
307 case SpdyFramer::SPDY_INVALID_CONTROL_FRAME: 327 case SpdyFramer::SPDY_INVALID_CONTROL_FRAME:
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 return ERR_CONNECTION_CLOSED; 793 return ERR_CONNECTION_CLOSED;
774 794
775 *stream = GetActivePushStream(url); 795 *stream = GetActivePushStream(url);
776 if (*stream) { 796 if (*stream) {
777 DCHECK_LT(streams_pushed_and_claimed_count_, streams_pushed_count_); 797 DCHECK_LT(streams_pushed_and_claimed_count_, streams_pushed_count_);
778 streams_pushed_and_claimed_count_++; 798 streams_pushed_and_claimed_count_++;
779 } 799 }
780 return OK; 800 return OK;
781 } 801 }
782 802
803 void SpdySession::CancelPush(const GURL& url) {
804 UnclaimedPushedStreamContainer::const_iterator unclaimed_it =
805 unclaimed_pushed_streams_.find(url);
806 if (unclaimed_it == unclaimed_pushed_streams_.end())
807 return;
808
809 SpdyStreamId stream_id = unclaimed_it->second.stream_id;
810
811 if (active_streams_.find(stream_id) == active_streams_.end()) {
812 ResetStream(stream_id, RST_STREAM_CANCEL,
813 "Cancelled push stream with url: " + url.spec());
814 }
815 unclaimed_pushed_streams_.erase(unclaimed_it);
816 }
817
783 // {,Try}CreateStream() can be called with |in_io_loop_| set if a stream is 818 // {,Try}CreateStream() can be called with |in_io_loop_| set if a stream is
784 // being created in response to another being closed due to received data. 819 // being created in response to another being closed due to received data.
785 820
786 int SpdySession::TryCreateStream( 821 int SpdySession::TryCreateStream(
787 const base::WeakPtr<SpdyStreamRequest>& request, 822 const base::WeakPtr<SpdyStreamRequest>& request,
788 base::WeakPtr<SpdyStream>* stream) { 823 base::WeakPtr<SpdyStream>* stream) {
789 DCHECK(request); 824 DCHECK(request);
790 825
791 if (availability_state_ == STATE_GOING_AWAY) 826 if (availability_state_ == STATE_GOING_AWAY)
792 return ERR_FAILED; 827 return ERR_FAILED;
(...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after
2630 NOTREACHED(); 2665 NOTREACHED();
2631 return false; 2666 return false;
2632 } 2667 }
2633 2668
2634 active_it->second.stream->OnPushPromiseHeadersReceived(std::move(headers)); 2669 active_it->second.stream->OnPushPromiseHeadersReceived(std::move(headers));
2635 DCHECK(active_it->second.stream->IsReservedRemote()); 2670 DCHECK(active_it->second.stream->IsReservedRemote());
2636 num_pushed_streams_++; 2671 num_pushed_streams_++;
2637 return true; 2672 return true;
2638 } 2673 }
2639 2674
2640 void SpdySession::CancelPush(const GURL& url) {
2641 UnclaimedPushedStreamContainer::const_iterator unclaimed_it =
2642 unclaimed_pushed_streams_.find(url);
2643 if (unclaimed_it == unclaimed_pushed_streams_.end())
2644 return;
2645
2646 SpdyStreamId stream_id = unclaimed_it->second.stream_id;
2647
2648 if (active_streams_.find(stream_id) == active_streams_.end()) {
2649 ResetStream(stream_id, RST_STREAM_CANCEL,
2650 "Cancelled push stream with url: " + url.spec());
2651 }
2652 unclaimed_pushed_streams_.erase(unclaimed_it);
2653 }
2654
2655 void SpdySession::OnPushPromise(SpdyStreamId stream_id, 2675 void SpdySession::OnPushPromise(SpdyStreamId stream_id,
2656 SpdyStreamId promised_stream_id, 2676 SpdyStreamId promised_stream_id,
2657 SpdyHeaderBlock headers) { 2677 SpdyHeaderBlock headers) {
2658 CHECK(in_io_loop_); 2678 CHECK(in_io_loop_);
2659 2679
2660 if (net_log_.IsCapturing()) { 2680 if (net_log_.IsCapturing()) {
2661 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_PUSH_PROMISE, 2681 net_log_.AddEvent(NetLogEventType::HTTP2_SESSION_RECV_PUSH_PROMISE,
2662 base::Bind(&NetLogSpdyPushPromiseReceivedCallback, 2682 base::Bind(&NetLogSpdyPushPromiseReceivedCallback,
2663 &headers, stream_id, promised_stream_id)); 2683 &headers, stream_id, promised_stream_id));
2664 } 2684 }
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
3131 if (!queue->empty()) { 3151 if (!queue->empty()) {
3132 SpdyStreamId stream_id = queue->front(); 3152 SpdyStreamId stream_id = queue->front();
3133 queue->pop_front(); 3153 queue->pop_front();
3134 return stream_id; 3154 return stream_id;
3135 } 3155 }
3136 } 3156 }
3137 return 0; 3157 return 0;
3138 } 3158 }
3139 3159
3140 } // namespace net 3160 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698