OLD | NEW |
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 | 11 |
11 #include "base/bind.h" | 12 #include "base/bind.h" |
12 #include "base/compiler_specific.h" | 13 #include "base/compiler_specific.h" |
13 #include "base/location.h" | 14 #include "base/location.h" |
14 #include "base/logging.h" | 15 #include "base/logging.h" |
15 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
16 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
17 #include "base/metrics/sparse_histogram.h" | 18 #include "base/metrics/sparse_histogram.h" |
18 #include "base/profiler/scoped_tracker.h" | 19 #include "base/profiler/scoped_tracker.h" |
19 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 const SpdyHeaderBlock& headers, | 72 const SpdyHeaderBlock& headers, |
72 NetLogCaptureMode capture_mode) { | 73 NetLogCaptureMode capture_mode) { |
73 scoped_ptr<base::ListValue> headers_list(new base::ListValue()); | 74 scoped_ptr<base::ListValue> headers_list(new base::ListValue()); |
74 for (SpdyHeaderBlock::const_iterator it = headers.begin(); | 75 for (SpdyHeaderBlock::const_iterator it = headers.begin(); |
75 it != headers.end(); ++it) { | 76 it != headers.end(); ++it) { |
76 headers_list->AppendString( | 77 headers_list->AppendString( |
77 it->first.as_string() + ": " + | 78 it->first.as_string() + ": " + |
78 ElideHeaderValueForNetLog(capture_mode, it->first.as_string(), | 79 ElideHeaderValueForNetLog(capture_mode, it->first.as_string(), |
79 it->second.as_string())); | 80 it->second.as_string())); |
80 } | 81 } |
81 return headers_list.Pass(); | 82 return headers_list; |
82 } | 83 } |
83 | 84 |
84 scoped_ptr<base::Value> NetLogSpdySynStreamSentCallback( | 85 scoped_ptr<base::Value> NetLogSpdySynStreamSentCallback( |
85 const SpdyHeaderBlock* headers, | 86 const SpdyHeaderBlock* headers, |
86 bool fin, | 87 bool fin, |
87 bool unidirectional, | 88 bool unidirectional, |
88 SpdyPriority spdy_priority, | 89 SpdyPriority spdy_priority, |
89 SpdyStreamId stream_id, | 90 SpdyStreamId stream_id, |
90 NetLogCaptureMode capture_mode) { | 91 NetLogCaptureMode capture_mode) { |
91 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 92 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
92 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); | 93 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); |
93 dict->SetBoolean("fin", fin); | 94 dict->SetBoolean("fin", fin); |
94 dict->SetBoolean("unidirectional", unidirectional); | 95 dict->SetBoolean("unidirectional", unidirectional); |
95 dict->SetInteger("priority", static_cast<int>(spdy_priority)); | 96 dict->SetInteger("priority", static_cast<int>(spdy_priority)); |
96 dict->SetInteger("stream_id", stream_id); | 97 dict->SetInteger("stream_id", stream_id); |
97 return dict.Pass(); | 98 return std::move(dict); |
98 } | 99 } |
99 | 100 |
100 scoped_ptr<base::Value> NetLogSpdySynStreamReceivedCallback( | 101 scoped_ptr<base::Value> NetLogSpdySynStreamReceivedCallback( |
101 const SpdyHeaderBlock* headers, | 102 const SpdyHeaderBlock* headers, |
102 bool fin, | 103 bool fin, |
103 bool unidirectional, | 104 bool unidirectional, |
104 SpdyPriority spdy_priority, | 105 SpdyPriority spdy_priority, |
105 SpdyStreamId stream_id, | 106 SpdyStreamId stream_id, |
106 SpdyStreamId associated_stream, | 107 SpdyStreamId associated_stream, |
107 NetLogCaptureMode capture_mode) { | 108 NetLogCaptureMode capture_mode) { |
108 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 109 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
109 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); | 110 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); |
110 dict->SetBoolean("fin", fin); | 111 dict->SetBoolean("fin", fin); |
111 dict->SetBoolean("unidirectional", unidirectional); | 112 dict->SetBoolean("unidirectional", unidirectional); |
112 dict->SetInteger("priority", static_cast<int>(spdy_priority)); | 113 dict->SetInteger("priority", static_cast<int>(spdy_priority)); |
113 dict->SetInteger("stream_id", stream_id); | 114 dict->SetInteger("stream_id", stream_id); |
114 dict->SetInteger("associated_stream", associated_stream); | 115 dict->SetInteger("associated_stream", associated_stream); |
115 return dict.Pass(); | 116 return std::move(dict); |
116 } | 117 } |
117 | 118 |
118 scoped_ptr<base::Value> NetLogSpdySynReplyOrHeadersReceivedCallback( | 119 scoped_ptr<base::Value> NetLogSpdySynReplyOrHeadersReceivedCallback( |
119 const SpdyHeaderBlock* headers, | 120 const SpdyHeaderBlock* headers, |
120 bool fin, | 121 bool fin, |
121 SpdyStreamId stream_id, | 122 SpdyStreamId stream_id, |
122 NetLogCaptureMode capture_mode) { | 123 NetLogCaptureMode capture_mode) { |
123 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 124 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
124 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); | 125 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); |
125 dict->SetBoolean("fin", fin); | 126 dict->SetBoolean("fin", fin); |
126 dict->SetInteger("stream_id", stream_id); | 127 dict->SetInteger("stream_id", stream_id); |
127 return dict.Pass(); | 128 return std::move(dict); |
128 } | 129 } |
129 | 130 |
130 scoped_ptr<base::Value> NetLogSpdySessionCloseCallback( | 131 scoped_ptr<base::Value> NetLogSpdySessionCloseCallback( |
131 int net_error, | 132 int net_error, |
132 const std::string* description, | 133 const std::string* description, |
133 NetLogCaptureMode /* capture_mode */) { | 134 NetLogCaptureMode /* capture_mode */) { |
134 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 135 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
135 dict->SetInteger("net_error", net_error); | 136 dict->SetInteger("net_error", net_error); |
136 dict->SetString("description", *description); | 137 dict->SetString("description", *description); |
137 return dict.Pass(); | 138 return std::move(dict); |
138 } | 139 } |
139 | 140 |
140 scoped_ptr<base::Value> NetLogSpdySessionCallback( | 141 scoped_ptr<base::Value> NetLogSpdySessionCallback( |
141 const HostPortProxyPair* host_pair, | 142 const HostPortProxyPair* host_pair, |
142 NetLogCaptureMode /* capture_mode */) { | 143 NetLogCaptureMode /* capture_mode */) { |
143 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 144 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
144 dict->SetString("host", host_pair->first.ToString()); | 145 dict->SetString("host", host_pair->first.ToString()); |
145 dict->SetString("proxy", host_pair->second.ToPacString()); | 146 dict->SetString("proxy", host_pair->second.ToPacString()); |
146 return dict.Pass(); | 147 return std::move(dict); |
147 } | 148 } |
148 | 149 |
149 scoped_ptr<base::Value> NetLogSpdyInitializedCallback( | 150 scoped_ptr<base::Value> NetLogSpdyInitializedCallback( |
150 NetLog::Source source, | 151 NetLog::Source source, |
151 const NextProto protocol_version, | 152 const NextProto protocol_version, |
152 NetLogCaptureMode /* capture_mode */) { | 153 NetLogCaptureMode /* capture_mode */) { |
153 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 154 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
154 if (source.IsValid()) { | 155 if (source.IsValid()) { |
155 source.AddToEventParameters(dict.get()); | 156 source.AddToEventParameters(dict.get()); |
156 } | 157 } |
157 dict->SetString("protocol", | 158 dict->SetString("protocol", |
158 SSLClientSocket::NextProtoToString(protocol_version)); | 159 SSLClientSocket::NextProtoToString(protocol_version)); |
159 return dict.Pass(); | 160 return std::move(dict); |
160 } | 161 } |
161 | 162 |
162 scoped_ptr<base::Value> NetLogSpdySettingsCallback( | 163 scoped_ptr<base::Value> NetLogSpdySettingsCallback( |
163 const HostPortPair& host_port_pair, | 164 const HostPortPair& host_port_pair, |
164 bool clear_persisted, | 165 bool clear_persisted, |
165 NetLogCaptureMode /* capture_mode */) { | 166 NetLogCaptureMode /* capture_mode */) { |
166 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 167 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
167 dict->SetString("host", host_port_pair.ToString()); | 168 dict->SetString("host", host_port_pair.ToString()); |
168 dict->SetBoolean("clear_persisted", clear_persisted); | 169 dict->SetBoolean("clear_persisted", clear_persisted); |
169 return dict.Pass(); | 170 return std::move(dict); |
170 } | 171 } |
171 | 172 |
172 scoped_ptr<base::Value> NetLogSpdySettingCallback( | 173 scoped_ptr<base::Value> NetLogSpdySettingCallback( |
173 SpdySettingsIds id, | 174 SpdySettingsIds id, |
174 const SpdyMajorVersion protocol_version, | 175 const SpdyMajorVersion protocol_version, |
175 SpdySettingsFlags flags, | 176 SpdySettingsFlags flags, |
176 uint32_t value, | 177 uint32_t value, |
177 NetLogCaptureMode /* capture_mode */) { | 178 NetLogCaptureMode /* capture_mode */) { |
178 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 179 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
179 dict->SetInteger("id", | 180 dict->SetInteger("id", |
180 SpdyConstants::SerializeSettingId(protocol_version, id)); | 181 SpdyConstants::SerializeSettingId(protocol_version, id)); |
181 dict->SetInteger("flags", flags); | 182 dict->SetInteger("flags", flags); |
182 dict->SetInteger("value", value); | 183 dict->SetInteger("value", value); |
183 return dict.Pass(); | 184 return std::move(dict); |
184 } | 185 } |
185 | 186 |
186 scoped_ptr<base::Value> NetLogSpdySendSettingsCallback( | 187 scoped_ptr<base::Value> NetLogSpdySendSettingsCallback( |
187 const SettingsMap* settings, | 188 const SettingsMap* settings, |
188 const SpdyMajorVersion protocol_version, | 189 const SpdyMajorVersion protocol_version, |
189 NetLogCaptureMode /* capture_mode */) { | 190 NetLogCaptureMode /* capture_mode */) { |
190 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 191 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
191 scoped_ptr<base::ListValue> settings_list(new base::ListValue()); | 192 scoped_ptr<base::ListValue> settings_list(new base::ListValue()); |
192 for (SettingsMap::const_iterator it = settings->begin(); | 193 for (SettingsMap::const_iterator it = settings->begin(); |
193 it != settings->end(); ++it) { | 194 it != settings->end(); ++it) { |
194 const SpdySettingsIds id = it->first; | 195 const SpdySettingsIds id = it->first; |
195 const SpdySettingsFlags flags = it->second.first; | 196 const SpdySettingsFlags flags = it->second.first; |
196 const uint32_t value = it->second.second; | 197 const uint32_t value = it->second.second; |
197 settings_list->Append(new base::StringValue(base::StringPrintf( | 198 settings_list->Append(new base::StringValue(base::StringPrintf( |
198 "[id:%u flags:%u value:%u]", | 199 "[id:%u flags:%u value:%u]", |
199 SpdyConstants::SerializeSettingId(protocol_version, id), | 200 SpdyConstants::SerializeSettingId(protocol_version, id), |
200 flags, | 201 flags, |
201 value))); | 202 value))); |
202 } | 203 } |
203 dict->Set("settings", settings_list.Pass()); | 204 dict->Set("settings", std::move(settings_list)); |
204 return dict.Pass(); | 205 return std::move(dict); |
205 } | 206 } |
206 | 207 |
207 scoped_ptr<base::Value> NetLogSpdyWindowUpdateFrameCallback( | 208 scoped_ptr<base::Value> NetLogSpdyWindowUpdateFrameCallback( |
208 SpdyStreamId stream_id, | 209 SpdyStreamId stream_id, |
209 uint32_t delta, | 210 uint32_t delta, |
210 NetLogCaptureMode /* capture_mode */) { | 211 NetLogCaptureMode /* capture_mode */) { |
211 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 212 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
212 dict->SetInteger("stream_id", static_cast<int>(stream_id)); | 213 dict->SetInteger("stream_id", static_cast<int>(stream_id)); |
213 dict->SetInteger("delta", delta); | 214 dict->SetInteger("delta", delta); |
214 return dict.Pass(); | 215 return std::move(dict); |
215 } | 216 } |
216 | 217 |
217 scoped_ptr<base::Value> NetLogSpdySessionWindowUpdateCallback( | 218 scoped_ptr<base::Value> NetLogSpdySessionWindowUpdateCallback( |
218 int32_t delta, | 219 int32_t delta, |
219 int32_t window_size, | 220 int32_t window_size, |
220 NetLogCaptureMode /* capture_mode */) { | 221 NetLogCaptureMode /* capture_mode */) { |
221 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 222 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
222 dict->SetInteger("delta", delta); | 223 dict->SetInteger("delta", delta); |
223 dict->SetInteger("window_size", window_size); | 224 dict->SetInteger("window_size", window_size); |
224 return dict.Pass(); | 225 return std::move(dict); |
225 } | 226 } |
226 | 227 |
227 scoped_ptr<base::Value> NetLogSpdyDataCallback( | 228 scoped_ptr<base::Value> NetLogSpdyDataCallback( |
228 SpdyStreamId stream_id, | 229 SpdyStreamId stream_id, |
229 int size, | 230 int size, |
230 bool fin, | 231 bool fin, |
231 NetLogCaptureMode /* capture_mode */) { | 232 NetLogCaptureMode /* capture_mode */) { |
232 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 233 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
233 dict->SetInteger("stream_id", static_cast<int>(stream_id)); | 234 dict->SetInteger("stream_id", static_cast<int>(stream_id)); |
234 dict->SetInteger("size", size); | 235 dict->SetInteger("size", size); |
235 dict->SetBoolean("fin", fin); | 236 dict->SetBoolean("fin", fin); |
236 return dict.Pass(); | 237 return std::move(dict); |
237 } | 238 } |
238 | 239 |
239 scoped_ptr<base::Value> NetLogSpdyRstCallback( | 240 scoped_ptr<base::Value> NetLogSpdyRstCallback( |
240 SpdyStreamId stream_id, | 241 SpdyStreamId stream_id, |
241 int status, | 242 int status, |
242 const std::string* description, | 243 const std::string* description, |
243 NetLogCaptureMode /* capture_mode */) { | 244 NetLogCaptureMode /* capture_mode */) { |
244 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 245 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
245 dict->SetInteger("stream_id", static_cast<int>(stream_id)); | 246 dict->SetInteger("stream_id", static_cast<int>(stream_id)); |
246 dict->SetInteger("status", status); | 247 dict->SetInteger("status", status); |
247 dict->SetString("description", *description); | 248 dict->SetString("description", *description); |
248 return dict.Pass(); | 249 return std::move(dict); |
249 } | 250 } |
250 | 251 |
251 scoped_ptr<base::Value> NetLogSpdyPingCallback( | 252 scoped_ptr<base::Value> NetLogSpdyPingCallback( |
252 SpdyPingId unique_id, | 253 SpdyPingId unique_id, |
253 bool is_ack, | 254 bool is_ack, |
254 const char* type, | 255 const char* type, |
255 NetLogCaptureMode /* capture_mode */) { | 256 NetLogCaptureMode /* capture_mode */) { |
256 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 257 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
257 dict->SetInteger("unique_id", static_cast<int>(unique_id)); | 258 dict->SetInteger("unique_id", static_cast<int>(unique_id)); |
258 dict->SetString("type", type); | 259 dict->SetString("type", type); |
259 dict->SetBoolean("is_ack", is_ack); | 260 dict->SetBoolean("is_ack", is_ack); |
260 return dict.Pass(); | 261 return std::move(dict); |
261 } | 262 } |
262 | 263 |
263 scoped_ptr<base::Value> NetLogSpdyGoAwayCallback( | 264 scoped_ptr<base::Value> NetLogSpdyGoAwayCallback( |
264 SpdyStreamId last_stream_id, | 265 SpdyStreamId last_stream_id, |
265 int active_streams, | 266 int active_streams, |
266 int unclaimed_streams, | 267 int unclaimed_streams, |
267 SpdyGoAwayStatus status, | 268 SpdyGoAwayStatus status, |
268 StringPiece debug_data, | 269 StringPiece debug_data, |
269 NetLogCaptureMode capture_mode) { | 270 NetLogCaptureMode capture_mode) { |
270 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 271 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
271 dict->SetInteger("last_accepted_stream_id", | 272 dict->SetInteger("last_accepted_stream_id", |
272 static_cast<int>(last_stream_id)); | 273 static_cast<int>(last_stream_id)); |
273 dict->SetInteger("active_streams", active_streams); | 274 dict->SetInteger("active_streams", active_streams); |
274 dict->SetInteger("unclaimed_streams", unclaimed_streams); | 275 dict->SetInteger("unclaimed_streams", unclaimed_streams); |
275 dict->SetInteger("status", static_cast<int>(status)); | 276 dict->SetInteger("status", static_cast<int>(status)); |
276 dict->SetString("debug_data", | 277 dict->SetString("debug_data", |
277 ElideGoAwayDebugDataForNetLog(capture_mode, debug_data)); | 278 ElideGoAwayDebugDataForNetLog(capture_mode, debug_data)); |
278 return dict.Pass(); | 279 return std::move(dict); |
279 } | 280 } |
280 | 281 |
281 scoped_ptr<base::Value> NetLogSpdyPushPromiseReceivedCallback( | 282 scoped_ptr<base::Value> NetLogSpdyPushPromiseReceivedCallback( |
282 const SpdyHeaderBlock* headers, | 283 const SpdyHeaderBlock* headers, |
283 SpdyStreamId stream_id, | 284 SpdyStreamId stream_id, |
284 SpdyStreamId promised_stream_id, | 285 SpdyStreamId promised_stream_id, |
285 NetLogCaptureMode capture_mode) { | 286 NetLogCaptureMode capture_mode) { |
286 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 287 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
287 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); | 288 dict->Set("headers", SpdyHeaderBlockToListValue(*headers, capture_mode)); |
288 dict->SetInteger("id", stream_id); | 289 dict->SetInteger("id", stream_id); |
289 dict->SetInteger("promised_stream_id", promised_stream_id); | 290 dict->SetInteger("promised_stream_id", promised_stream_id); |
290 return dict.Pass(); | 291 return std::move(dict); |
291 } | 292 } |
292 | 293 |
293 scoped_ptr<base::Value> NetLogSpdyAdoptedPushStreamCallback( | 294 scoped_ptr<base::Value> NetLogSpdyAdoptedPushStreamCallback( |
294 SpdyStreamId stream_id, | 295 SpdyStreamId stream_id, |
295 const GURL* url, | 296 const GURL* url, |
296 NetLogCaptureMode capture_mode) { | 297 NetLogCaptureMode capture_mode) { |
297 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 298 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
298 dict->SetInteger("stream_id", stream_id); | 299 dict->SetInteger("stream_id", stream_id); |
299 dict->SetString("url", url->spec()); | 300 dict->SetString("url", url->spec()); |
300 return dict.Pass(); | 301 return std::move(dict); |
301 } | 302 } |
302 | 303 |
303 // Helper function to return the total size of an array of objects | 304 // Helper function to return the total size of an array of objects |
304 // with .size() member functions. | 305 // with .size() member functions. |
305 template <typename T, size_t N> size_t GetTotalSize(const T (&arr)[N]) { | 306 template <typename T, size_t N> size_t GetTotalSize(const T (&arr)[N]) { |
306 size_t total_size = 0; | 307 size_t total_size = 0; |
307 for (size_t i = 0; i < N; ++i) { | 308 for (size_t i = 0; i < N; ++i) { |
308 total_size += arr[i].size(); | 309 total_size += arr[i].size(); |
309 } | 310 } |
310 return total_size; | 311 return total_size; |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 DCHECK_EQ(read_state_, READ_STATE_DO_READ); | 740 DCHECK_EQ(read_state_, READ_STATE_DO_READ); |
740 DCHECK_EQ(write_state_, WRITE_STATE_IDLE); | 741 DCHECK_EQ(write_state_, WRITE_STATE_IDLE); |
741 DCHECK(!connection_); | 742 DCHECK(!connection_); |
742 | 743 |
743 DCHECK(certificate_error_code == OK || | 744 DCHECK(certificate_error_code == OK || |
744 certificate_error_code < ERR_IO_PENDING); | 745 certificate_error_code < ERR_IO_PENDING); |
745 // TODO(akalin): Check connection->is_initialized() instead. This | 746 // TODO(akalin): Check connection->is_initialized() instead. This |
746 // requires re-working CreateFakeSpdySession(), though. | 747 // requires re-working CreateFakeSpdySession(), though. |
747 DCHECK(connection->socket()); | 748 DCHECK(connection->socket()); |
748 | 749 |
749 connection_ = connection.Pass(); | 750 connection_ = std::move(connection); |
750 is_secure_ = is_secure; | 751 is_secure_ = is_secure; |
751 certificate_error_code_ = certificate_error_code; | 752 certificate_error_code_ = certificate_error_code; |
752 | 753 |
753 NextProto protocol_negotiated = | 754 NextProto protocol_negotiated = |
754 connection_->socket()->GetNegotiatedProtocol(); | 755 connection_->socket()->GetNegotiatedProtocol(); |
755 if (protocol_negotiated != kProtoUnknown) { | 756 if (protocol_negotiated != kProtoUnknown) { |
756 protocol_ = protocol_negotiated; | 757 protocol_ = protocol_negotiated; |
757 stream_initial_send_window_size_ = GetDefaultInitialWindowSize(protocol_); | 758 stream_initial_send_window_size_ = GetDefaultInitialWindowSize(protocol_); |
758 } | 759 } |
759 DCHECK_GE(protocol_, kProtoSPDYMinimumVersion); | 760 DCHECK_GE(protocol_, kProtoSPDYMinimumVersion); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 ERR_CONNECTION_CLOSED, | 915 ERR_CONNECTION_CLOSED, |
915 "Tried to create SPDY stream for a closed socket connection."); | 916 "Tried to create SPDY stream for a closed socket connection."); |
916 return ERR_CONNECTION_CLOSED; | 917 return ERR_CONNECTION_CLOSED; |
917 } | 918 } |
918 | 919 |
919 scoped_ptr<SpdyStream> new_stream( | 920 scoped_ptr<SpdyStream> new_stream( |
920 new SpdyStream(request.type(), GetWeakPtr(), request.url(), | 921 new SpdyStream(request.type(), GetWeakPtr(), request.url(), |
921 request.priority(), stream_initial_send_window_size_, | 922 request.priority(), stream_initial_send_window_size_, |
922 stream_max_recv_window_size_, request.net_log())); | 923 stream_max_recv_window_size_, request.net_log())); |
923 *stream = new_stream->GetWeakPtr(); | 924 *stream = new_stream->GetWeakPtr(); |
924 InsertCreatedStream(new_stream.Pass()); | 925 InsertCreatedStream(std::move(new_stream)); |
925 | 926 |
926 UMA_HISTOGRAM_CUSTOM_COUNTS( | 927 UMA_HISTOGRAM_CUSTOM_COUNTS( |
927 "Net.SpdyPriorityCount", | 928 "Net.SpdyPriorityCount", |
928 static_cast<int>(request.priority()), 0, 10, 11); | 929 static_cast<int>(request.priority()), 0, 10, 11); |
929 | 930 |
930 return OK; | 931 return OK; |
931 } | 932 } |
932 | 933 |
933 void SpdySession::CancelStreamRequest( | 934 void SpdySession::CancelStreamRequest( |
934 const base::WeakPtr<SpdyStreamRequest>& request) { | 935 const base::WeakPtr<SpdyStreamRequest>& request) { |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 priority_dependency_enabled_default = enable; | 1062 priority_dependency_enabled_default = enable; |
1062 } | 1063 } |
1063 | 1064 |
1064 void SpdySession::EnqueueStreamWrite( | 1065 void SpdySession::EnqueueStreamWrite( |
1065 const base::WeakPtr<SpdyStream>& stream, | 1066 const base::WeakPtr<SpdyStream>& stream, |
1066 SpdyFrameType frame_type, | 1067 SpdyFrameType frame_type, |
1067 scoped_ptr<SpdyBufferProducer> producer) { | 1068 scoped_ptr<SpdyBufferProducer> producer) { |
1068 DCHECK(frame_type == HEADERS || | 1069 DCHECK(frame_type == HEADERS || |
1069 frame_type == DATA || | 1070 frame_type == DATA || |
1070 frame_type == SYN_STREAM); | 1071 frame_type == SYN_STREAM); |
1071 EnqueueWrite(stream->priority(), frame_type, producer.Pass(), stream); | 1072 EnqueueWrite(stream->priority(), frame_type, std::move(producer), stream); |
1072 } | 1073 } |
1073 | 1074 |
1074 scoped_ptr<SpdyFrame> SpdySession::CreateSynStream( | 1075 scoped_ptr<SpdyFrame> SpdySession::CreateSynStream( |
1075 SpdyStreamId stream_id, | 1076 SpdyStreamId stream_id, |
1076 RequestPriority priority, | 1077 RequestPriority priority, |
1077 SpdyControlFlags flags, | 1078 SpdyControlFlags flags, |
1078 const SpdyHeaderBlock& block) { | 1079 const SpdyHeaderBlock& block) { |
1079 ActiveStreamMap::const_iterator it = active_streams_.find(stream_id); | 1080 ActiveStreamMap::const_iterator it = active_streams_.find(stream_id); |
1080 CHECK(it != active_streams_.end()); | 1081 CHECK(it != active_streams_.end()); |
1081 CHECK_EQ(it->second.stream->stream_id(), stream_id); | 1082 CHECK_EQ(it->second.stream->stream_id(), stream_id); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 (GetProtocolVersion() <= SPDY3) | 1148 (GetProtocolVersion() <= SPDY3) |
1148 ? NetLog::TYPE_HTTP2_SESSION_SYN_STREAM | 1149 ? NetLog::TYPE_HTTP2_SESSION_SYN_STREAM |
1149 : NetLog::TYPE_HTTP2_SESSION_SEND_HEADERS; | 1150 : NetLog::TYPE_HTTP2_SESSION_SEND_HEADERS; |
1150 net_log().AddEvent(type, | 1151 net_log().AddEvent(type, |
1151 base::Bind(&NetLogSpdySynStreamSentCallback, &block, | 1152 base::Bind(&NetLogSpdySynStreamSentCallback, &block, |
1152 (flags & CONTROL_FLAG_FIN) != 0, | 1153 (flags & CONTROL_FLAG_FIN) != 0, |
1153 (flags & CONTROL_FLAG_UNIDIRECTIONAL) != 0, | 1154 (flags & CONTROL_FLAG_UNIDIRECTIONAL) != 0, |
1154 spdy_priority, stream_id)); | 1155 spdy_priority, stream_id)); |
1155 } | 1156 } |
1156 | 1157 |
1157 return syn_frame.Pass(); | 1158 return syn_frame; |
1158 } | 1159 } |
1159 | 1160 |
1160 scoped_ptr<SpdyBuffer> SpdySession::CreateDataBuffer(SpdyStreamId stream_id, | 1161 scoped_ptr<SpdyBuffer> SpdySession::CreateDataBuffer(SpdyStreamId stream_id, |
1161 IOBuffer* data, | 1162 IOBuffer* data, |
1162 int len, | 1163 int len, |
1163 SpdyDataFlags flags) { | 1164 SpdyDataFlags flags) { |
1164 if (availability_state_ == STATE_DRAINING) { | 1165 if (availability_state_ == STATE_DRAINING) { |
1165 return scoped_ptr<SpdyBuffer>(); | 1166 return scoped_ptr<SpdyBuffer>(); |
1166 } | 1167 } |
1167 | 1168 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1260 | 1261 |
1261 // Send PrefacePing for DATA_FRAMEs with nonzero payload size. | 1262 // Send PrefacePing for DATA_FRAMEs with nonzero payload size. |
1262 if (effective_len > 0) | 1263 if (effective_len > 0) |
1263 SendPrefacePingIfNoneInFlight(); | 1264 SendPrefacePingIfNoneInFlight(); |
1264 | 1265 |
1265 // TODO(mbelshe): reduce memory copies here. | 1266 // TODO(mbelshe): reduce memory copies here. |
1266 DCHECK(buffered_spdy_framer_.get()); | 1267 DCHECK(buffered_spdy_framer_.get()); |
1267 scoped_ptr<SpdyFrame> frame(buffered_spdy_framer_->CreateDataFrame( | 1268 scoped_ptr<SpdyFrame> frame(buffered_spdy_framer_->CreateDataFrame( |
1268 stream_id, data->data(), static_cast<uint32_t>(effective_len), flags)); | 1269 stream_id, data->data(), static_cast<uint32_t>(effective_len), flags)); |
1269 | 1270 |
1270 scoped_ptr<SpdyBuffer> data_buffer(new SpdyBuffer(frame.Pass())); | 1271 scoped_ptr<SpdyBuffer> data_buffer(new SpdyBuffer(std::move(frame))); |
1271 | 1272 |
1272 // Send window size is based on payload size, so nothing to do if this is | 1273 // Send window size is based on payload size, so nothing to do if this is |
1273 // just a FIN with no payload. | 1274 // just a FIN with no payload. |
1274 if (flow_control_state_ == FLOW_CONTROL_STREAM_AND_SESSION && | 1275 if (flow_control_state_ == FLOW_CONTROL_STREAM_AND_SESSION && |
1275 effective_len != 0) { | 1276 effective_len != 0) { |
1276 DecreaseSendWindowSize(static_cast<int32_t>(effective_len)); | 1277 DecreaseSendWindowSize(static_cast<int32_t>(effective_len)); |
1277 data_buffer->AddConsumeCallback( | 1278 data_buffer->AddConsumeCallback( |
1278 base::Bind(&SpdySession::OnWriteBufferConsumed, | 1279 base::Bind(&SpdySession::OnWriteBufferConsumed, |
1279 weak_factory_.GetWeakPtr(), | 1280 weak_factory_.GetWeakPtr(), |
1280 static_cast<size_t>(effective_len))); | 1281 static_cast<size_t>(effective_len))); |
1281 } | 1282 } |
1282 | 1283 |
1283 return data_buffer.Pass(); | 1284 return data_buffer; |
1284 } | 1285 } |
1285 | 1286 |
1286 void SpdySession::CloseActiveStream(SpdyStreamId stream_id, int status) { | 1287 void SpdySession::CloseActiveStream(SpdyStreamId stream_id, int status) { |
1287 DCHECK_NE(stream_id, 0u); | 1288 DCHECK_NE(stream_id, 0u); |
1288 | 1289 |
1289 ActiveStreamMap::iterator it = active_streams_.find(stream_id); | 1290 ActiveStreamMap::iterator it = active_streams_.find(stream_id); |
1290 if (it == active_streams_.end()) { | 1291 if (it == active_streams_.end()) { |
1291 NOTREACHED(); | 1292 NOTREACHED(); |
1292 return; | 1293 return; |
1293 } | 1294 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1349 // probably something that we still want to support, although server | 1350 // probably something that we still want to support, although server |
1350 // push is hardly used. Write tests for this and fix this. (See | 1351 // push is hardly used. Write tests for this and fix this. (See |
1351 // http://crbug.com/261712 .) | 1352 // http://crbug.com/261712 .) |
1352 if (owned_stream->type() == SPDY_PUSH_STREAM) { | 1353 if (owned_stream->type() == SPDY_PUSH_STREAM) { |
1353 unclaimed_pushed_streams_.erase(owned_stream->url()); | 1354 unclaimed_pushed_streams_.erase(owned_stream->url()); |
1354 num_pushed_streams_--; | 1355 num_pushed_streams_--; |
1355 if (!owned_stream->IsReservedRemote()) | 1356 if (!owned_stream->IsReservedRemote()) |
1356 num_active_pushed_streams_--; | 1357 num_active_pushed_streams_--; |
1357 } | 1358 } |
1358 | 1359 |
1359 DeleteStream(owned_stream.Pass(), status); | 1360 DeleteStream(std::move(owned_stream), status); |
1360 | 1361 |
1361 // If there are no active streams and the socket pool is stalled, close the | 1362 // If there are no active streams and the socket pool is stalled, close the |
1362 // session to free up a socket slot. | 1363 // session to free up a socket slot. |
1363 if (active_streams_.empty() && created_streams_.empty() && | 1364 if (active_streams_.empty() && created_streams_.empty() && |
1364 connection_->IsPoolStalled()) { | 1365 connection_->IsPoolStalled()) { |
1365 DoDrainSession(ERR_CONNECTION_CLOSED, "Closing idle connection."); | 1366 DoDrainSession(ERR_CONNECTION_CLOSED, "Closing idle connection."); |
1366 } | 1367 } |
1367 } | 1368 } |
1368 | 1369 |
1369 void SpdySession::CloseCreatedStreamIterator(CreatedStreamSet::iterator it, | 1370 void SpdySession::CloseCreatedStreamIterator(CreatedStreamSet::iterator it, |
1370 int status) { | 1371 int status) { |
1371 scoped_ptr<SpdyStream> owned_stream(*it); | 1372 scoped_ptr<SpdyStream> owned_stream(*it); |
1372 created_streams_.erase(it); | 1373 created_streams_.erase(it); |
1373 DeleteStream(owned_stream.Pass(), status); | 1374 DeleteStream(std::move(owned_stream), status); |
1374 } | 1375 } |
1375 | 1376 |
1376 void SpdySession::ResetStreamIterator(ActiveStreamMap::iterator it, | 1377 void SpdySession::ResetStreamIterator(ActiveStreamMap::iterator it, |
1377 SpdyRstStreamStatus status, | 1378 SpdyRstStreamStatus status, |
1378 const std::string& description) { | 1379 const std::string& description) { |
1379 // Send the RST_STREAM frame first as CloseActiveStreamIterator() | 1380 // Send the RST_STREAM frame first as CloseActiveStreamIterator() |
1380 // may close us. | 1381 // may close us. |
1381 SpdyStreamId stream_id = it->first; | 1382 SpdyStreamId stream_id = it->first; |
1382 RequestPriority priority = it->second.stream->priority(); | 1383 RequestPriority priority = it->second.stream->priority(); |
1383 EnqueueResetStreamFrame(stream_id, priority, status, description); | 1384 EnqueueResetStreamFrame(stream_id, priority, status, description); |
(...skipping 10 matching lines...) Expand all Loading... |
1394 DCHECK_NE(stream_id, 0u); | 1395 DCHECK_NE(stream_id, 0u); |
1395 | 1396 |
1396 net_log().AddEvent( | 1397 net_log().AddEvent( |
1397 NetLog::TYPE_HTTP2_SESSION_SEND_RST_STREAM, | 1398 NetLog::TYPE_HTTP2_SESSION_SEND_RST_STREAM, |
1398 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description)); | 1399 base::Bind(&NetLogSpdyRstCallback, stream_id, status, &description)); |
1399 | 1400 |
1400 DCHECK(buffered_spdy_framer_.get()); | 1401 DCHECK(buffered_spdy_framer_.get()); |
1401 scoped_ptr<SpdyFrame> rst_frame( | 1402 scoped_ptr<SpdyFrame> rst_frame( |
1402 buffered_spdy_framer_->CreateRstStream(stream_id, status)); | 1403 buffered_spdy_framer_->CreateRstStream(stream_id, status)); |
1403 | 1404 |
1404 EnqueueSessionWrite(priority, RST_STREAM, rst_frame.Pass()); | 1405 EnqueueSessionWrite(priority, RST_STREAM, std::move(rst_frame)); |
1405 RecordProtocolErrorHistogram(MapRstStreamStatusToProtocolError(status)); | 1406 RecordProtocolErrorHistogram(MapRstStreamStatusToProtocolError(status)); |
1406 } | 1407 } |
1407 | 1408 |
1408 void SpdySession::PumpReadLoop(ReadState expected_read_state, int result) { | 1409 void SpdySession::PumpReadLoop(ReadState expected_read_state, int result) { |
1409 // TODO(bnc): Remove ScopedTracker below once crbug.com/462774 is fixed. | 1410 // TODO(bnc): Remove ScopedTracker below once crbug.com/462774 is fixed. |
1410 tracked_objects::ScopedTracker tracking_profile( | 1411 tracked_objects::ScopedTracker tracking_profile( |
1411 FROM_HERE_WITH_EXPLICIT_FUNCTION("462774 SpdySession::PumpReadLoop")); | 1412 FROM_HERE_WITH_EXPLICIT_FUNCTION("462774 SpdySession::PumpReadLoop")); |
1412 | 1413 |
1413 CHECK(!in_io_loop_); | 1414 CHECK(!in_io_loop_); |
1414 if (availability_state_ == STATE_DRAINING) { | 1415 if (availability_state_ == STATE_DRAINING) { |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1596 if (stream.get()) | 1597 if (stream.get()) |
1597 CHECK(!stream->IsClosed()); | 1598 CHECK(!stream->IsClosed()); |
1598 | 1599 |
1599 // Activate the stream only when sending the SYN_STREAM frame to | 1600 // Activate the stream only when sending the SYN_STREAM frame to |
1600 // guarantee monotonically-increasing stream IDs. | 1601 // guarantee monotonically-increasing stream IDs. |
1601 if (frame_type == SYN_STREAM) { | 1602 if (frame_type == SYN_STREAM) { |
1602 CHECK(stream.get()); | 1603 CHECK(stream.get()); |
1603 CHECK_EQ(stream->stream_id(), 0u); | 1604 CHECK_EQ(stream->stream_id(), 0u); |
1604 scoped_ptr<SpdyStream> owned_stream = | 1605 scoped_ptr<SpdyStream> owned_stream = |
1605 ActivateCreatedStream(stream.get()); | 1606 ActivateCreatedStream(stream.get()); |
1606 InsertActivatedStream(owned_stream.Pass()); | 1607 InsertActivatedStream(std::move(owned_stream)); |
1607 | 1608 |
1608 if (stream_hi_water_mark_ > kLastStreamId) { | 1609 if (stream_hi_water_mark_ > kLastStreamId) { |
1609 CHECK_EQ(stream->stream_id(), kLastStreamId); | 1610 CHECK_EQ(stream->stream_id(), kLastStreamId); |
1610 // We've exhausted the stream ID space, and no new streams may be | 1611 // We've exhausted the stream ID space, and no new streams may be |
1611 // created after this one. | 1612 // created after this one. |
1612 MakeUnavailable(); | 1613 MakeUnavailable(); |
1613 StartGoingAway(kLastStreamId, ERR_ABORTED); | 1614 StartGoingAway(kLastStreamId, ERR_ABORTED); |
1614 } | 1615 } |
1615 } | 1616 } |
1616 | 1617 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 1869 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
1869 | 1870 |
1870 dict->SetInteger("source_id", net_log_.source().id); | 1871 dict->SetInteger("source_id", net_log_.source().id); |
1871 | 1872 |
1872 dict->SetString("host_port_pair", host_port_pair().ToString()); | 1873 dict->SetString("host_port_pair", host_port_pair().ToString()); |
1873 if (!pooled_aliases_.empty()) { | 1874 if (!pooled_aliases_.empty()) { |
1874 scoped_ptr<base::ListValue> alias_list(new base::ListValue()); | 1875 scoped_ptr<base::ListValue> alias_list(new base::ListValue()); |
1875 for (const auto& alias : pooled_aliases_) { | 1876 for (const auto& alias : pooled_aliases_) { |
1876 alias_list->AppendString(alias.host_port_pair().ToString()); | 1877 alias_list->AppendString(alias.host_port_pair().ToString()); |
1877 } | 1878 } |
1878 dict->Set("aliases", alias_list.Pass()); | 1879 dict->Set("aliases", std::move(alias_list)); |
1879 } | 1880 } |
1880 dict->SetString("proxy", host_port_proxy_pair().second.ToURI()); | 1881 dict->SetString("proxy", host_port_proxy_pair().second.ToURI()); |
1881 | 1882 |
1882 dict->SetInteger("active_streams", active_streams_.size()); | 1883 dict->SetInteger("active_streams", active_streams_.size()); |
1883 | 1884 |
1884 dict->SetInteger("unclaimed_pushed_streams", | 1885 dict->SetInteger("unclaimed_pushed_streams", |
1885 unclaimed_pushed_streams_.size()); | 1886 unclaimed_pushed_streams_.size()); |
1886 | 1887 |
1887 dict->SetBoolean("is_secure", is_secure_); | 1888 dict->SetBoolean("is_secure", is_secure_); |
1888 | 1889 |
(...skipping 12 matching lines...) Expand all Loading... |
1901 DCHECK(buffered_spdy_framer_.get()); | 1902 DCHECK(buffered_spdy_framer_.get()); |
1902 dict->SetInteger("frames_received", buffered_spdy_framer_->frames_received()); | 1903 dict->SetInteger("frames_received", buffered_spdy_framer_->frames_received()); |
1903 | 1904 |
1904 dict->SetBoolean("sent_settings", sent_settings_); | 1905 dict->SetBoolean("sent_settings", sent_settings_); |
1905 dict->SetBoolean("received_settings", received_settings_); | 1906 dict->SetBoolean("received_settings", received_settings_); |
1906 | 1907 |
1907 dict->SetInteger("send_window_size", session_send_window_size_); | 1908 dict->SetInteger("send_window_size", session_send_window_size_); |
1908 dict->SetInteger("recv_window_size", session_recv_window_size_); | 1909 dict->SetInteger("recv_window_size", session_recv_window_size_); |
1909 dict->SetInteger("unacked_recv_window_bytes", | 1910 dict->SetInteger("unacked_recv_window_bytes", |
1910 session_unacked_recv_window_bytes_); | 1911 session_unacked_recv_window_bytes_); |
1911 return dict.Pass(); | 1912 return std::move(dict); |
1912 } | 1913 } |
1913 | 1914 |
1914 bool SpdySession::IsReused() const { | 1915 bool SpdySession::IsReused() const { |
1915 return buffered_spdy_framer_->frames_received() > 0 || | 1916 return buffered_spdy_framer_->frames_received() > 0 || |
1916 connection_->reuse_type() == ClientSocketHandle::UNUSED_IDLE; | 1917 connection_->reuse_type() == ClientSocketHandle::UNUSED_IDLE; |
1917 } | 1918 } |
1918 | 1919 |
1919 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id, | 1920 bool SpdySession::GetLoadTimingInfo(SpdyStreamId stream_id, |
1920 LoadTimingInfo* load_timing_info) const { | 1921 LoadTimingInfo* load_timing_info) const { |
1921 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId, | 1922 return connection_->GetLoadTimingInfo(stream_id != kFirstStreamId, |
(...skipping 23 matching lines...) Expand all Loading... |
1945 | 1946 |
1946 return rv; | 1947 return rv; |
1947 } | 1948 } |
1948 | 1949 |
1949 void SpdySession::EnqueueSessionWrite(RequestPriority priority, | 1950 void SpdySession::EnqueueSessionWrite(RequestPriority priority, |
1950 SpdyFrameType frame_type, | 1951 SpdyFrameType frame_type, |
1951 scoped_ptr<SpdyFrame> frame) { | 1952 scoped_ptr<SpdyFrame> frame) { |
1952 DCHECK(frame_type == RST_STREAM || frame_type == SETTINGS || | 1953 DCHECK(frame_type == RST_STREAM || frame_type == SETTINGS || |
1953 frame_type == WINDOW_UPDATE || frame_type == PING || | 1954 frame_type == WINDOW_UPDATE || frame_type == PING || |
1954 frame_type == GOAWAY); | 1955 frame_type == GOAWAY); |
1955 EnqueueWrite( | 1956 EnqueueWrite(priority, frame_type, |
1956 priority, frame_type, | 1957 scoped_ptr<SpdyBufferProducer>(new SimpleBufferProducer( |
1957 scoped_ptr<SpdyBufferProducer>( | 1958 scoped_ptr<SpdyBuffer>(new SpdyBuffer(std::move(frame))))), |
1958 new SimpleBufferProducer( | 1959 base::WeakPtr<SpdyStream>()); |
1959 scoped_ptr<SpdyBuffer>(new SpdyBuffer(frame.Pass())))), | |
1960 base::WeakPtr<SpdyStream>()); | |
1961 } | 1960 } |
1962 | 1961 |
1963 void SpdySession::EnqueueWrite(RequestPriority priority, | 1962 void SpdySession::EnqueueWrite(RequestPriority priority, |
1964 SpdyFrameType frame_type, | 1963 SpdyFrameType frame_type, |
1965 scoped_ptr<SpdyBufferProducer> producer, | 1964 scoped_ptr<SpdyBufferProducer> producer, |
1966 const base::WeakPtr<SpdyStream>& stream) { | 1965 const base::WeakPtr<SpdyStream>& stream) { |
1967 if (availability_state_ == STATE_DRAINING) | 1966 if (availability_state_ == STATE_DRAINING) |
1968 return; | 1967 return; |
1969 | 1968 |
1970 write_queue_.Enqueue(priority, frame_type, producer.Pass(), stream); | 1969 write_queue_.Enqueue(priority, frame_type, std::move(producer), stream); |
1971 MaybePostWriteLoop(); | 1970 MaybePostWriteLoop(); |
1972 } | 1971 } |
1973 | 1972 |
1974 void SpdySession::MaybePostWriteLoop() { | 1973 void SpdySession::MaybePostWriteLoop() { |
1975 if (write_state_ == WRITE_STATE_IDLE) { | 1974 if (write_state_ == WRITE_STATE_IDLE) { |
1976 CHECK(!in_flight_write_); | 1975 CHECK(!in_flight_write_); |
1977 write_state_ = WRITE_STATE_DO_WRITE; | 1976 write_state_ = WRITE_STATE_DO_WRITE; |
1978 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1977 base::ThreadTaskRunnerHandle::Get()->PostTask( |
1979 FROM_HERE, | 1978 FROM_HERE, |
1980 base::Bind(&SpdySession::PumpWriteLoop, weak_factory_.GetWeakPtr(), | 1979 base::Bind(&SpdySession::PumpWriteLoop, weak_factory_.GetWeakPtr(), |
1981 WRITE_STATE_DO_WRITE, OK)); | 1980 WRITE_STATE_DO_WRITE, OK)); |
1982 } | 1981 } |
1983 } | 1982 } |
1984 | 1983 |
1985 void SpdySession::InsertCreatedStream(scoped_ptr<SpdyStream> stream) { | 1984 void SpdySession::InsertCreatedStream(scoped_ptr<SpdyStream> stream) { |
1986 CHECK_EQ(stream->stream_id(), 0u); | 1985 CHECK_EQ(stream->stream_id(), 0u); |
1987 CHECK(created_streams_.find(stream.get()) == created_streams_.end()); | 1986 CHECK(created_streams_.find(stream.get()) == created_streams_.end()); |
1988 created_streams_.insert(stream.release()); | 1987 created_streams_.insert(stream.release()); |
1989 } | 1988 } |
1990 | 1989 |
1991 scoped_ptr<SpdyStream> SpdySession::ActivateCreatedStream(SpdyStream* stream) { | 1990 scoped_ptr<SpdyStream> SpdySession::ActivateCreatedStream(SpdyStream* stream) { |
1992 CHECK_EQ(stream->stream_id(), 0u); | 1991 CHECK_EQ(stream->stream_id(), 0u); |
1993 CHECK(created_streams_.find(stream) != created_streams_.end()); | 1992 CHECK(created_streams_.find(stream) != created_streams_.end()); |
1994 stream->set_stream_id(GetNewStreamId()); | 1993 stream->set_stream_id(GetNewStreamId()); |
1995 scoped_ptr<SpdyStream> owned_stream(stream); | 1994 scoped_ptr<SpdyStream> owned_stream(stream); |
1996 created_streams_.erase(stream); | 1995 created_streams_.erase(stream); |
1997 return owned_stream.Pass(); | 1996 return owned_stream; |
1998 } | 1997 } |
1999 | 1998 |
2000 void SpdySession::InsertActivatedStream(scoped_ptr<SpdyStream> stream) { | 1999 void SpdySession::InsertActivatedStream(scoped_ptr<SpdyStream> stream) { |
2001 SpdyStreamId stream_id = stream->stream_id(); | 2000 SpdyStreamId stream_id = stream->stream_id(); |
2002 CHECK_NE(stream_id, 0u); | 2001 CHECK_NE(stream_id, 0u); |
2003 std::pair<ActiveStreamMap::iterator, bool> result = | 2002 std::pair<ActiveStreamMap::iterator, bool> result = |
2004 active_streams_.insert( | 2003 active_streams_.insert( |
2005 std::make_pair(stream_id, ActiveStreamInfo(stream.get()))); | 2004 std::make_pair(stream_id, ActiveStreamInfo(stream.get()))); |
2006 active_streams_by_priority_[stream->priority()].insert( | 2005 active_streams_by_priority_[stream->priority()].insert( |
2007 std::make_pair(stream_id, stream.get())); | 2006 std::make_pair(stream_id, stream.get())); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2144 | 2143 |
2145 stream->AddRawReceivedBytes(len); | 2144 stream->AddRawReceivedBytes(len); |
2146 | 2145 |
2147 if (it->second.waiting_for_syn_reply) { | 2146 if (it->second.waiting_for_syn_reply) { |
2148 const std::string& error = "Data received before SYN_REPLY."; | 2147 const std::string& error = "Data received before SYN_REPLY."; |
2149 stream->LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error); | 2148 stream->LogStreamError(ERR_SPDY_PROTOCOL_ERROR, error); |
2150 ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error); | 2149 ResetStreamIterator(it, RST_STREAM_PROTOCOL_ERROR, error); |
2151 return; | 2150 return; |
2152 } | 2151 } |
2153 | 2152 |
2154 stream->OnDataReceived(buffer.Pass()); | 2153 stream->OnDataReceived(std::move(buffer)); |
2155 } | 2154 } |
2156 | 2155 |
2157 void SpdySession::OnStreamPadding(SpdyStreamId stream_id, size_t len) { | 2156 void SpdySession::OnStreamPadding(SpdyStreamId stream_id, size_t len) { |
2158 CHECK(in_io_loop_); | 2157 CHECK(in_io_loop_); |
2159 | 2158 |
2160 if (flow_control_state_ != FLOW_CONTROL_STREAM_AND_SESSION) | 2159 if (flow_control_state_ != FLOW_CONTROL_STREAM_AND_SESSION) |
2161 return; | 2160 return; |
2162 | 2161 |
2163 // Decrease window size because padding bytes are received. | 2162 // Decrease window size because padding bytes are received. |
2164 // Increase window size because padding bytes are consumed (by discarding). | 2163 // Increase window size because padding bytes are consumed (by discarding). |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2775 | 2774 |
2776 last_compressed_frame_len_ = 0; | 2775 last_compressed_frame_len_ = 0; |
2777 | 2776 |
2778 PushedStreamMap::iterator inserted_pushed_it = | 2777 PushedStreamMap::iterator inserted_pushed_it = |
2779 unclaimed_pushed_streams_.insert( | 2778 unclaimed_pushed_streams_.insert( |
2780 pushed_it, | 2779 pushed_it, |
2781 std::make_pair(gurl, PushedStreamInfo(stream_id, time_func_()))); | 2780 std::make_pair(gurl, PushedStreamInfo(stream_id, time_func_()))); |
2782 DCHECK(inserted_pushed_it != pushed_it); | 2781 DCHECK(inserted_pushed_it != pushed_it); |
2783 DeleteExpiredPushedStreams(); | 2782 DeleteExpiredPushedStreams(); |
2784 | 2783 |
2785 InsertActivatedStream(stream.Pass()); | 2784 InsertActivatedStream(std::move(stream)); |
2786 | 2785 |
2787 ActiveStreamMap::iterator active_it = active_streams_.find(stream_id); | 2786 ActiveStreamMap::iterator active_it = active_streams_.find(stream_id); |
2788 if (active_it == active_streams_.end()) { | 2787 if (active_it == active_streams_.end()) { |
2789 NOTREACHED(); | 2788 NOTREACHED(); |
2790 return false; | 2789 return false; |
2791 } | 2790 } |
2792 | 2791 |
2793 active_it->second.stream->OnPushPromiseHeadersReceived(headers); | 2792 active_it->second.stream->OnPushPromiseHeadersReceived(headers); |
2794 DCHECK(active_it->second.stream->IsReservedRemote()); | 2793 DCHECK(active_it->second.stream->IsReservedRemote()); |
2795 num_pushed_streams_++; | 2794 num_pushed_streams_++; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2827 DCHECK(enable_sending_initial_data_); | 2826 DCHECK(enable_sending_initial_data_); |
2828 | 2827 |
2829 if (send_connection_header_prefix_) { | 2828 if (send_connection_header_prefix_) { |
2830 DCHECK_EQ(protocol_, kProtoHTTP2); | 2829 DCHECK_EQ(protocol_, kProtoHTTP2); |
2831 scoped_ptr<SpdyFrame> connection_header_prefix_frame( | 2830 scoped_ptr<SpdyFrame> connection_header_prefix_frame( |
2832 new SpdyFrame(const_cast<char*>(kHttp2ConnectionHeaderPrefix), | 2831 new SpdyFrame(const_cast<char*>(kHttp2ConnectionHeaderPrefix), |
2833 kHttp2ConnectionHeaderPrefixSize, | 2832 kHttp2ConnectionHeaderPrefixSize, |
2834 false /* take_ownership */)); | 2833 false /* take_ownership */)); |
2835 // Count the prefix as part of the subsequent SETTINGS frame. | 2834 // Count the prefix as part of the subsequent SETTINGS frame. |
2836 EnqueueSessionWrite(HIGHEST, SETTINGS, | 2835 EnqueueSessionWrite(HIGHEST, SETTINGS, |
2837 connection_header_prefix_frame.Pass()); | 2836 std::move(connection_header_prefix_frame)); |
2838 } | 2837 } |
2839 | 2838 |
2840 // First, notify the server about the settings they should use when | 2839 // First, notify the server about the settings they should use when |
2841 // communicating with us. | 2840 // communicating with us. |
2842 SettingsMap settings_map; | 2841 SettingsMap settings_map; |
2843 // Create a new settings frame notifying the server of our | 2842 // Create a new settings frame notifying the server of our |
2844 // max concurrent streams and initial window size. | 2843 // max concurrent streams and initial window size. |
2845 settings_map[SETTINGS_MAX_CONCURRENT_STREAMS] = | 2844 settings_map[SETTINGS_MAX_CONCURRENT_STREAMS] = |
2846 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); | 2845 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
2847 if (flow_control_state_ >= FLOW_CONTROL_STREAM && | 2846 if (flow_control_state_ >= FLOW_CONTROL_STREAM && |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2895 void SpdySession::SendSettings(const SettingsMap& settings) { | 2894 void SpdySession::SendSettings(const SettingsMap& settings) { |
2896 const SpdyMajorVersion protocol_version = GetProtocolVersion(); | 2895 const SpdyMajorVersion protocol_version = GetProtocolVersion(); |
2897 net_log_.AddEvent( | 2896 net_log_.AddEvent( |
2898 NetLog::TYPE_HTTP2_SESSION_SEND_SETTINGS, | 2897 NetLog::TYPE_HTTP2_SESSION_SEND_SETTINGS, |
2899 base::Bind(&NetLogSpdySendSettingsCallback, &settings, protocol_version)); | 2898 base::Bind(&NetLogSpdySendSettingsCallback, &settings, protocol_version)); |
2900 // Create the SETTINGS frame and send it. | 2899 // Create the SETTINGS frame and send it. |
2901 DCHECK(buffered_spdy_framer_.get()); | 2900 DCHECK(buffered_spdy_framer_.get()); |
2902 scoped_ptr<SpdyFrame> settings_frame( | 2901 scoped_ptr<SpdyFrame> settings_frame( |
2903 buffered_spdy_framer_->CreateSettings(settings)); | 2902 buffered_spdy_framer_->CreateSettings(settings)); |
2904 sent_settings_ = true; | 2903 sent_settings_ = true; |
2905 EnqueueSessionWrite(HIGHEST, SETTINGS, settings_frame.Pass()); | 2904 EnqueueSessionWrite(HIGHEST, SETTINGS, std::move(settings_frame)); |
2906 } | 2905 } |
2907 | 2906 |
2908 void SpdySession::HandleSetting(uint32_t id, uint32_t value) { | 2907 void SpdySession::HandleSetting(uint32_t id, uint32_t value) { |
2909 switch (id) { | 2908 switch (id) { |
2910 case SETTINGS_MAX_CONCURRENT_STREAMS: | 2909 case SETTINGS_MAX_CONCURRENT_STREAMS: |
2911 max_concurrent_streams_ = std::min(static_cast<size_t>(value), | 2910 max_concurrent_streams_ = std::min(static_cast<size_t>(value), |
2912 kMaxConcurrentStreamLimit); | 2911 kMaxConcurrentStreamLimit); |
2913 ProcessPendingStreamRequests(); | 2912 ProcessPendingStreamRequests(); |
2914 break; | 2913 break; |
2915 case SETTINGS_INITIAL_WINDOW_SIZE: { | 2914 case SETTINGS_INITIAL_WINDOW_SIZE: { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2978 CHECK_EQ(stream_id, kSessionFlowControlStreamId); | 2977 CHECK_EQ(stream_id, kSessionFlowControlStreamId); |
2979 } | 2978 } |
2980 | 2979 |
2981 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_SENT_WINDOW_UPDATE_FRAME, | 2980 net_log_.AddEvent(NetLog::TYPE_HTTP2_SESSION_SENT_WINDOW_UPDATE_FRAME, |
2982 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id, | 2981 base::Bind(&NetLogSpdyWindowUpdateFrameCallback, stream_id, |
2983 delta_window_size)); | 2982 delta_window_size)); |
2984 | 2983 |
2985 DCHECK(buffered_spdy_framer_.get()); | 2984 DCHECK(buffered_spdy_framer_.get()); |
2986 scoped_ptr<SpdyFrame> window_update_frame( | 2985 scoped_ptr<SpdyFrame> window_update_frame( |
2987 buffered_spdy_framer_->CreateWindowUpdate(stream_id, delta_window_size)); | 2986 buffered_spdy_framer_->CreateWindowUpdate(stream_id, delta_window_size)); |
2988 EnqueueSessionWrite(priority, WINDOW_UPDATE, window_update_frame.Pass()); | 2987 EnqueueSessionWrite(priority, WINDOW_UPDATE, std::move(window_update_frame)); |
2989 } | 2988 } |
2990 | 2989 |
2991 void SpdySession::WritePingFrame(SpdyPingId unique_id, bool is_ack) { | 2990 void SpdySession::WritePingFrame(SpdyPingId unique_id, bool is_ack) { |
2992 DCHECK(buffered_spdy_framer_.get()); | 2991 DCHECK(buffered_spdy_framer_.get()); |
2993 scoped_ptr<SpdyFrame> ping_frame( | 2992 scoped_ptr<SpdyFrame> ping_frame( |
2994 buffered_spdy_framer_->CreatePingFrame(unique_id, is_ack)); | 2993 buffered_spdy_framer_->CreatePingFrame(unique_id, is_ack)); |
2995 EnqueueSessionWrite(HIGHEST, PING, ping_frame.Pass()); | 2994 EnqueueSessionWrite(HIGHEST, PING, std::move(ping_frame)); |
2996 | 2995 |
2997 if (net_log().IsCapturing()) { | 2996 if (net_log().IsCapturing()) { |
2998 net_log().AddEvent( | 2997 net_log().AddEvent( |
2999 NetLog::TYPE_HTTP2_SESSION_PING, | 2998 NetLog::TYPE_HTTP2_SESSION_PING, |
3000 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "sent")); | 2999 base::Bind(&NetLogSpdyPingCallback, unique_id, is_ack, "sent")); |
3001 } | 3000 } |
3002 if (!is_ack) { | 3001 if (!is_ack) { |
3003 next_ping_id_ += 2; | 3002 next_ping_id_ += 2; |
3004 ++pings_in_flight_; | 3003 ++pings_in_flight_; |
3005 PlanToCheckPingStatus(); | 3004 PlanToCheckPingStatus(); |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3331 if (!queue->empty()) { | 3330 if (!queue->empty()) { |
3332 SpdyStreamId stream_id = queue->front(); | 3331 SpdyStreamId stream_id = queue->front(); |
3333 queue->pop_front(); | 3332 queue->pop_front(); |
3334 return stream_id; | 3333 return stream_id; |
3335 } | 3334 } |
3336 } | 3335 } |
3337 return 0; | 3336 return 0; |
3338 } | 3337 } |
3339 | 3338 |
3340 } // namespace net | 3339 } // namespace net |
OLD | NEW |