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

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

Issue 2852029: Revert "Streams send a Rst frame upon being closed by client. Some minor editorial fixes." (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Created 10 years, 5 months 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') | net/spdy/spdy_stream.h » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/linked_ptr.h" 8 #include "base/linked_ptr.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 return net::OK; 223 return net::OK;
224 224
225 state_ = CONNECTING; 225 state_ = CONNECTING;
226 226
227 static StatsCounter spdy_sessions("spdy.sessions"); 227 static StatsCounter spdy_sessions("spdy.sessions");
228 spdy_sessions.Increment(); 228 spdy_sessions.Increment();
229 229
230 int rv = connection_->Init(group_name, destination, priority, 230 int rv = connection_->Init(group_name, destination, priority,
231 &connect_callback_, session_->tcp_socket_pool(), 231 &connect_callback_, session_->tcp_socket_pool(),
232 net_log_); 232 net_log_);
233 DCHECK_LE(rv, 0); 233 DCHECK(rv <= 0);
234 234
235 // If the connect is pending, we still return ok. The APIs enqueue 235 // If the connect is pending, we still return ok. The APIs enqueue
236 // work until after the connect completes asynchronously later. 236 // work until after the connect completes asynchronously later.
237 if (rv == net::ERR_IO_PENDING) 237 if (rv == net::ERR_IO_PENDING)
238 return net::OK; 238 return net::OK;
239 OnTCPConnect(rv); 239 OnTCPConnect(rv);
240 return static_cast<net::Error>(rv); 240 return static_cast<net::Error>(rv);
241 } 241 }
242 242
243 int SpdySession::GetPushStream( 243 int SpdySession::GetPushStream(
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 LOG(INFO) << "Writing Stream Data for stream " << stream_id << " (" << len 361 LOG(INFO) << "Writing Stream Data for stream " << stream_id << " (" << len
362 << " bytes)"; 362 << " bytes)";
363 const int kMss = 1430; // This is somewhat arbitrary and not really fixed, 363 const int kMss = 1430; // This is somewhat arbitrary and not really fixed,
364 // but it will always work reasonably with ethernet. 364 // but it will always work reasonably with ethernet.
365 // Chop the world into 2-packet chunks. This is somewhat arbitrary, but 365 // Chop the world into 2-packet chunks. This is somewhat arbitrary, but
366 // is reasonably small and ensures that we elicit ACKs quickly from TCP 366 // is reasonably small and ensures that we elicit ACKs quickly from TCP
367 // (because TCP tries to only ACK every other packet). 367 // (because TCP tries to only ACK every other packet).
368 const int kMaxSpdyFrameChunkSize = (2 * kMss) - spdy::SpdyFrame::size(); 368 const int kMaxSpdyFrameChunkSize = (2 * kMss) - spdy::SpdyFrame::size();
369 369
370 // Find our stream 370 // Find our stream
371 ActiveStreamMap::const_iterator it = active_streams_.find(stream_id); 371 DCHECK(IsStreamActive(stream_id));
372 if (it == active_streams_.end()) { 372 scoped_refptr<SpdyStream> stream = active_streams_[stream_id];
373 LOG(DFATAL) << "Attempting to write to stream " << stream_id 373 CHECK_EQ(stream->stream_id(), stream_id);
374 << ", which does not exist!"; 374 if (!stream)
375 return ERR_INVALID_SPDY_STREAM; 375 return ERR_INVALID_SPDY_STREAM;
376 }
377
378 const scoped_refptr<SpdyStream>& stream = it->second;
379 if (!stream) {
380 LOG(DFATAL) << "Attempting to write to stream " << stream_id
381 << ", which does not exist!";
382 return ERR_INVALID_SPDY_STREAM;
383 }
384
385 CHECK_EQ(stream->stream_id(), stream_id);
386 376
387 // TODO(mbelshe): Setting of the FIN is assuming that the caller will pass 377 // TODO(mbelshe): Setting of the FIN is assuming that the caller will pass
388 // all data to write in a single chunk. Is this always true? 378 // all data to write in a single chunk. Is this always true?
389 379
390 // Set the flags on the upload. 380 // Set the flags on the upload.
391 spdy::SpdyDataFlags flags = spdy::DATA_FLAG_FIN; 381 spdy::SpdyDataFlags flags = spdy::DATA_FLAG_FIN;
392 if (len > kMaxSpdyFrameChunkSize) { 382 if (len > kMaxSpdyFrameChunkSize) {
393 len = kMaxSpdyFrameChunkSize; 383 len = kMaxSpdyFrameChunkSize;
394 flags = spdy::DATA_FLAG_NONE; 384 flags = spdy::DATA_FLAG_NONE;
395 } 385 }
396 386
397 // TODO(mbelshe): reduce memory copies here. 387 // TODO(mbelshe): reduce memory copies here.
398 scoped_ptr<spdy::SpdyDataFrame> frame( 388 scoped_ptr<spdy::SpdyDataFrame> frame(
399 spdy_framer_.CreateDataFrame(stream_id, data->data(), len, flags)); 389 spdy_framer_.CreateDataFrame(stream_id, data->data(), len, flags));
400 QueueFrame(frame.get(), stream->priority(), stream); 390 QueueFrame(frame.get(), stream->priority(), stream);
401 return ERR_IO_PENDING; 391 return ERR_IO_PENDING;
402 } 392 }
403 393
404 void SpdySession::CloseStreamAndSendRst(spdy::SpdyStreamId stream_id, 394 void SpdySession::CloseStream(spdy::SpdyStreamId stream_id, int status) {
405 int status) { 395 LOG(INFO) << "Closing stream " << stream_id << " with status " << status;
406 LOG(INFO) << "Closing stream " << stream_id << " with status " << status 396 // TODO(mbelshe): We should send a RST_STREAM control frame here
407 << " and sending RST_STREAM frame."; 397 // so that the server can cancel a large send.
408 398
409 DCHECK(IsStreamActive(stream_id)); 399 DeleteStream(stream_id, status);
410 const scoped_refptr<SpdyStream>& stream = active_streams_[stream_id];
411 // We send a RST_STREAM control frame here so that the server can cancel a
412 // large send.
413 scoped_ptr<spdy::SpdyRstStreamControlFrame> rst_frame(
414 spdy_framer_.CreateRstStream(stream_id, spdy::CANCEL));
415 QueueFrame(rst_frame.get(), stream->priority(), stream);
416
417 CloseStream(stream_id, status);
418 } 400 }
419 401
420 bool SpdySession::IsStreamActive(spdy::SpdyStreamId stream_id) const { 402 bool SpdySession::IsStreamActive(spdy::SpdyStreamId stream_id) const {
421 return ContainsKey(active_streams_, stream_id); 403 return ContainsKey(active_streams_, stream_id);
422 } 404 }
423 405
424 LoadState SpdySession::GetLoadState() const { 406 LoadState SpdySession::GetLoadState() const {
425 // NOTE: The application only queries the LoadState via the 407 // NOTE: The application only queries the LoadState via the
426 // SpdyNetworkTransaction, and details are only needed when 408 // SpdyNetworkTransaction, and details are only needed when
427 // we're in the process of connecting. 409 // we're in the process of connecting.
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 spdy_framer_.Reset(); 516 spdy_framer_.Reset();
535 } 517 }
536 518
537 if (state_ != CLOSED) 519 if (state_ != CLOSED)
538 ReadSocket(); 520 ReadSocket();
539 } 521 }
540 522
541 void SpdySession::OnWriteComplete(int result) { 523 void SpdySession::OnWriteComplete(int result) {
542 DCHECK(write_pending_); 524 DCHECK(write_pending_);
543 DCHECK(in_flight_write_.size()); 525 DCHECK(in_flight_write_.size());
526 DCHECK_NE(result, 0); // This shouldn't happen for write.
544 527
545 write_pending_ = false; 528 write_pending_ = false;
546 529
547 scoped_refptr<SpdyStream> stream = in_flight_write_.stream(); 530 scoped_refptr<SpdyStream> stream = in_flight_write_.stream();
548 531
549 LOG(INFO) << "Spdy write complete (result=" << result << ")" 532 LOG(INFO) << "Spdy write complete (result=" << result << ")"
550 << (stream ? std::string(" for stream ") + 533 << (stream ? std::string(" for stream ") +
551 IntToString(stream->stream_id()) : ""); 534 IntToString(stream->stream_id()) : "");
552 535
553 if (result >= 0) { 536 if (result >= 0) {
554 // It should not be possible to have written more bytes than our 537 // It should not be possible to have written more bytes than our
555 // in_flight_write_. 538 // in_flight_write_.
556 DCHECK_LE(result, in_flight_write_.buffer()->BytesRemaining()); 539 DCHECK_LE(result, in_flight_write_.buffer()->BytesRemaining());
557 540
558 in_flight_write_.buffer()->DidConsume(result); 541 in_flight_write_.buffer()->DidConsume(result);
559 542
560 // We only notify the stream when we've fully written the pending frame. 543 // We only notify the stream when we've fully written the pending frame.
561 if (!in_flight_write_.buffer()->BytesRemaining()) { 544 if (!in_flight_write_.buffer()->BytesRemaining()) {
562 if (stream) { 545 if (stream) {
563 // If we finished writing all the data from the buffer, it should not be
564 // the case that we wrote nothing.
565 DCHECK_NE(result, 0);
566
567 // Report the number of bytes written to the caller, but exclude the 546 // Report the number of bytes written to the caller, but exclude the
568 // frame size overhead. NOTE: if this frame was compressed the 547 // frame size overhead. NOTE: if this frame was compressed the
569 // reported bytes written is the compressed size, not the original 548 // reported bytes written is the compressed size, not the original
570 // size. 549 // size.
571 result = in_flight_write_.buffer()->size(); 550 if (result > 0) {
572 DCHECK_GT(result, static_cast<int>(spdy::SpdyFrame::size())); 551 result = in_flight_write_.buffer()->size();
573 result -= static_cast<int>(spdy::SpdyFrame::size()); 552 DCHECK_GT(result, static_cast<int>(spdy::SpdyFrame::size()));
553 result -= static_cast<int>(spdy::SpdyFrame::size());
554 }
574 555
575 // It is possible that the stream was cancelled while we were writing 556 // It is possible that the stream was cancelled while we were writing
576 // to the socket. 557 // to the socket.
577 if (!stream->cancelled()) 558 if (!stream->cancelled())
578 stream->OnWriteComplete(result); 559 stream->OnWriteComplete(result);
579 } 560 }
580 561
581 // Cleanup the write which just completed. 562 // Cleanup the write which just completed.
582 in_flight_write_.release(); 563 in_flight_write_.release();
583 } 564 }
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 streams_abandoned_count_ += pushed_streams_.size(); 703 streams_abandoned_count_ += pushed_streams_.size();
723 abandoned_push_streams.Add(pushed_streams_.size()); 704 abandoned_push_streams.Add(pushed_streams_.size());
724 } 705 }
725 706
726 while (!active_streams_.empty()) { 707 while (!active_streams_.empty()) {
727 ActiveStreamMap::iterator it = active_streams_.begin(); 708 ActiveStreamMap::iterator it = active_streams_.begin();
728 const scoped_refptr<SpdyStream>& stream = it->second; 709 const scoped_refptr<SpdyStream>& stream = it->second;
729 DCHECK(stream); 710 DCHECK(stream);
730 LOG(ERROR) << "ABANDONED (stream_id=" << stream->stream_id() 711 LOG(ERROR) << "ABANDONED (stream_id=" << stream->stream_id()
731 << "): " << stream->path(); 712 << "): " << stream->path();
732 CloseStream(stream->stream_id(), status); 713 DeleteStream(stream->stream_id(), status);
733 } 714 }
734 715
735 // TODO(erikchen): ideally stream->OnClose() is only ever called by 716 // TODO(erikchen): ideally stream->OnClose() is only ever called by
736 // CloseStream, but pending streams fall into their own category for now. 717 // DeleteStream, but pending streams fall into their own category for now.
737 PendingStreamMap::iterator it; 718 PendingStreamMap::iterator it;
738 for (it = pending_streams_.begin(); it != pending_streams_.end(); ++it) 719 for (it = pending_streams_.begin(); it != pending_streams_.end(); ++it)
739 { 720 {
740 const scoped_refptr<SpdyStream>& stream = it->second; 721 const scoped_refptr<SpdyStream>& stream = it->second;
741 if (stream) 722 if (stream)
742 stream->OnClose(ERR_ABORTED); 723 stream->OnClose(ERR_ABORTED);
743 } 724 }
744 pending_streams_.clear(); 725 pending_streams_.clear();
745 726
746 // We also need to drain the queue. 727 // We also need to drain the queue.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 } 768 }
788 } 769 }
789 770
790 void SpdySession::ActivateStream(SpdyStream* stream) { 771 void SpdySession::ActivateStream(SpdyStream* stream) {
791 const spdy::SpdyStreamId id = stream->stream_id(); 772 const spdy::SpdyStreamId id = stream->stream_id();
792 DCHECK(!IsStreamActive(id)); 773 DCHECK(!IsStreamActive(id));
793 774
794 active_streams_[id] = stream; 775 active_streams_[id] = stream;
795 } 776 }
796 777
797 void SpdySession::CloseStream(spdy::SpdyStreamId id, int status) { 778 void SpdySession::DeleteStream(spdy::SpdyStreamId id, int status) {
798 // Remove the stream from pushed_streams_ and active_streams_. 779 // Remove the stream from pushed_streams_ and active_streams_.
799 ActivePushedStreamList::iterator it; 780 ActivePushedStreamList::iterator it;
800 for (it = pushed_streams_.begin(); it != pushed_streams_.end(); ++it) { 781 for (it = pushed_streams_.begin(); it != pushed_streams_.end(); ++it) {
801 scoped_refptr<SpdyStream> curr = *it; 782 scoped_refptr<SpdyStream> curr = *it;
802 if (id == curr->stream_id()) { 783 if (id == curr->stream_id()) {
803 pushed_streams_.erase(it); 784 pushed_streams_.erase(it);
804 break; 785 break;
805 } 786 }
806 } 787 }
807 788
808 // The stream might have been deleted. 789 // The stream might have been deleted.
809 ActiveStreamMap::iterator it2 = active_streams_.find(id); 790 ActiveStreamMap::iterator it2 = active_streams_.find(id);
810 if (it2 == active_streams_.end()) 791 if (it2 == active_streams_.end())
811 return; 792 return;
812 793
813 // If this is an active stream, call the callback. 794 // If this is an active stream, call the callback.
814 const scoped_refptr<SpdyStream> stream(it2->second); 795 const scoped_refptr<SpdyStream> stream(it2->second);
815 active_streams_.erase(it2); 796 active_streams_.erase(it2);
816 if (stream) { 797 if (stream)
817 // This is the only place that should set the half_closed flag on the
818 // stream, and it should only be done once.
819 DCHECK(!stream->half_closed_client_side());
820 stream->HalfCloseClientSide();
821 stream->OnClose(status); 798 stream->OnClose(status);
822 }
823 } 799 }
824 800
825 void SpdySession::RemoveFromPool() { 801 void SpdySession::RemoveFromPool() {
826 if (in_session_pool_) { 802 if (in_session_pool_) {
827 session_->spdy_session_pool()->Remove(this); 803 session_->spdy_session_pool()->Remove(this);
828 in_session_pool_ = false; 804 in_session_pool_ = false;
829 } 805 }
830 } 806 }
831 807
832 scoped_refptr<SpdyStream> SpdySession::GetActivePushStream( 808 scoped_refptr<SpdyStream> SpdySession::GetActivePushStream(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 } 861 }
886 862
887 bool SpdySession::Respond(const spdy::SpdyHeaderBlock& headers, 863 bool SpdySession::Respond(const spdy::SpdyHeaderBlock& headers,
888 const scoped_refptr<SpdyStream> stream) { 864 const scoped_refptr<SpdyStream> stream) {
889 int rv = OK; 865 int rv = OK;
890 866
891 rv = stream->OnResponseReceived(headers); 867 rv = stream->OnResponseReceived(headers);
892 if (rv < 0) { 868 if (rv < 0) {
893 DCHECK_NE(rv, ERR_IO_PENDING); 869 DCHECK_NE(rv, ERR_IO_PENDING);
894 const spdy::SpdyStreamId stream_id = stream->stream_id(); 870 const spdy::SpdyStreamId stream_id = stream->stream_id();
895 CloseStream(stream_id, rv); 871 DeleteStream(stream_id, rv);
896 return false; 872 return false;
897 } 873 }
898 return true; 874 return true;
899 } 875 }
900 876
901 void SpdySession::OnSyn(const spdy::SpdySynStreamControlFrame& frame, 877 void SpdySession::OnSyn(const spdy::SpdySynStreamControlFrame& frame,
902 const linked_ptr<spdy::SpdyHeaderBlock>& headers) { 878 const linked_ptr<spdy::SpdyHeaderBlock>& headers) {
903 spdy::SpdyStreamId stream_id = frame.stream_id(); 879 spdy::SpdyStreamId stream_id = frame.stream_id();
904 880
905 LOG(INFO) << "Spdy SynStream for stream " << stream_id; 881 LOG(INFO) << "Spdy SynStream for stream " << stream_id;
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 1040
1065 switch (type) { 1041 switch (type) {
1066 case spdy::GOAWAY: 1042 case spdy::GOAWAY:
1067 OnGoAway(*reinterpret_cast<const spdy::SpdyGoAwayControlFrame*>(frame)); 1043 OnGoAway(*reinterpret_cast<const spdy::SpdyGoAwayControlFrame*>(frame));
1068 break; 1044 break;
1069 case spdy::SETTINGS: 1045 case spdy::SETTINGS:
1070 OnSettings( 1046 OnSettings(
1071 *reinterpret_cast<const spdy::SpdySettingsControlFrame*>(frame)); 1047 *reinterpret_cast<const spdy::SpdySettingsControlFrame*>(frame));
1072 break; 1048 break;
1073 case spdy::RST_STREAM: 1049 case spdy::RST_STREAM:
1074 OnRst(*reinterpret_cast<const spdy::SpdyRstStreamControlFrame*>(frame)); 1050 OnFin(*reinterpret_cast<const spdy::SpdyRstStreamControlFrame*>(frame));
1075 break; 1051 break;
1076 case spdy::SYN_STREAM: 1052 case spdy::SYN_STREAM:
1077 OnSyn(*reinterpret_cast<const spdy::SpdySynStreamControlFrame*>(frame), 1053 OnSyn(*reinterpret_cast<const spdy::SpdySynStreamControlFrame*>(frame),
1078 headers); 1054 headers);
1079 break; 1055 break;
1080 case spdy::SYN_REPLY: 1056 case spdy::SYN_REPLY:
1081 OnSynReply( 1057 OnSynReply(
1082 *reinterpret_cast<const spdy::SpdySynReplyControlFrame*>(frame), 1058 *reinterpret_cast<const spdy::SpdySynReplyControlFrame*>(frame),
1083 headers); 1059 headers);
1084 break; 1060 break;
1085 default: 1061 default:
1086 DCHECK(false); // Error! 1062 DCHECK(false); // Error!
1087 } 1063 }
1088 } 1064 }
1089 1065
1090 void SpdySession::OnRst(const spdy::SpdyRstStreamControlFrame& frame) { 1066 void SpdySession::OnFin(const spdy::SpdyRstStreamControlFrame& frame) {
1091 spdy::SpdyStreamId stream_id = frame.stream_id(); 1067 spdy::SpdyStreamId stream_id = frame.stream_id();
1092 LOG(INFO) << "Spdy Fin for stream " << stream_id; 1068 LOG(INFO) << "Spdy Fin for stream " << stream_id;
1093 1069
1094 bool valid_stream = IsStreamActive(stream_id); 1070 bool valid_stream = IsStreamActive(stream_id);
1095 if (!valid_stream) { 1071 if (!valid_stream) {
1096 // NOTE: it may just be that the stream was cancelled. 1072 // NOTE: it may just be that the stream was cancelled.
1097 LOG(WARNING) << "Received FIN for invalid stream" << stream_id; 1073 LOG(WARNING) << "Received FIN for invalid stream" << stream_id;
1098 return; 1074 return;
1099 } 1075 }
1100 scoped_refptr<SpdyStream> stream = active_streams_[stream_id]; 1076 scoped_refptr<SpdyStream> stream = active_streams_[stream_id];
1101 CHECK_EQ(stream->stream_id(), stream_id); 1077 CHECK_EQ(stream->stream_id(), stream_id);
1102 CHECK(!stream->cancelled()); 1078 CHECK(!stream->cancelled());
1103 1079
1104 const BoundNetLog& log = stream->net_log(); 1080 const BoundNetLog& log = stream->net_log();
1105 log.AddEvent( 1081 log.AddEvent(
1106 NetLog::TYPE_SPDY_STREAM_RST_STREAM, 1082 NetLog::TYPE_SPDY_STREAM_RST_STREAM,
1107 new NetLogIntegerParameter("status", frame.status())); 1083 new NetLogIntegerParameter("status", frame.status()));
1108 1084
1109 if (frame.status() == 0) { 1085 if (frame.status() == 0) {
1110 stream->OnDataReceived(NULL, 0); 1086 stream->OnDataReceived(NULL, 0);
1111 } else { 1087 } else {
1112 LOG(ERROR) << "Spdy stream closed: " << frame.status(); 1088 LOG(ERROR) << "Spdy stream closed: " << frame.status();
1113 // TODO(mbelshe): Map from Spdy-protocol errors to something sensical. 1089 // TODO(mbelshe): Map from Spdy-protocol errors to something sensical.
1114 // For now, it doesn't matter much - it is a protocol error. 1090 // For now, it doesn't matter much - it is a protocol error.
1115 CloseStream(stream_id, ERR_SPDY_PROTOCOL_ERROR); 1091 DeleteStream(stream_id, ERR_SPDY_PROTOCOL_ERROR);
1116 } 1092 }
1117 } 1093 }
1118 1094
1119 void SpdySession::OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) { 1095 void SpdySession::OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) {
1120 LOG(INFO) << "Spdy GOAWAY for session[" << this << "] for " << 1096 LOG(INFO) << "Spdy GOAWAY for session[" << this << "] for " <<
1121 host_port_pair().ToString(); 1097 host_port_pair().ToString();
1122 1098
1123 net_log_.AddEvent( 1099 net_log_.AddEvent(
1124 NetLog::TYPE_SPDY_SESSION_GOAWAY, 1100 NetLog::TYPE_SPDY_SESSION_GOAWAY,
1125 new NetLogIntegerParameter( 1101 new NetLogIntegerParameter(
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsRetransRate", 1188 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsRetransRate",
1213 setting.second, 1189 setting.second,
1214 1, 100, 50); 1190 1, 100, 50);
1215 break; 1191 break;
1216 } 1192 }
1217 } 1193 }
1218 } 1194 }
1219 } 1195 }
1220 1196
1221 } // namespace net 1197 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.h ('k') | net/spdy/spdy_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698