OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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_network_transaction.h" | 5 #include "net/spdy/spdy_network_transaction.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
10 #include "base/stats_counters.h" | 10 #include "base/stats_counters.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 const HttpResponseInfo* SpdyNetworkTransaction::GetResponseInfo() const { | 105 const HttpResponseInfo* SpdyNetworkTransaction::GetResponseInfo() const { |
106 return (response_.headers || response_.ssl_info.cert) ? &response_ : NULL; | 106 return (response_.headers || response_.ssl_info.cert) ? &response_ : NULL; |
107 } | 107 } |
108 | 108 |
109 LoadState SpdyNetworkTransaction::GetLoadState() const { | 109 LoadState SpdyNetworkTransaction::GetLoadState() const { |
110 switch (next_state_) { | 110 switch (next_state_) { |
111 case STATE_INIT_CONNECTION_COMPLETE: | 111 case STATE_INIT_CONNECTION_COMPLETE: |
112 if (spdy_.get()) | 112 if (spdy_.get()) |
113 return spdy_->GetLoadState(); | 113 return spdy_->GetLoadState(); |
114 return LOAD_STATE_CONNECTING; | 114 return LOAD_STATE_CONNECTING; |
| 115 case STATE_GET_STREAM_COMPLETE: |
115 case STATE_SEND_REQUEST_COMPLETE: | 116 case STATE_SEND_REQUEST_COMPLETE: |
116 return LOAD_STATE_SENDING_REQUEST; | 117 return LOAD_STATE_SENDING_REQUEST; |
117 case STATE_READ_HEADERS_COMPLETE: | 118 case STATE_READ_HEADERS_COMPLETE: |
118 return LOAD_STATE_WAITING_FOR_RESPONSE; | 119 return LOAD_STATE_WAITING_FOR_RESPONSE; |
119 case STATE_READ_BODY_COMPLETE: | 120 case STATE_READ_BODY_COMPLETE: |
120 return LOAD_STATE_READING_RESPONSE; | 121 return LOAD_STATE_READING_RESPONSE; |
121 default: | 122 default: |
122 return LOAD_STATE_IDLE; | 123 return LOAD_STATE_IDLE; |
123 } | 124 } |
124 } | 125 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 case STATE_INIT_CONNECTION: | 162 case STATE_INIT_CONNECTION: |
162 DCHECK_EQ(OK, rv); | 163 DCHECK_EQ(OK, rv); |
163 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_INIT_CONNECTION, | 164 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_INIT_CONNECTION, |
164 NULL); | 165 NULL); |
165 rv = DoInitConnection(); | 166 rv = DoInitConnection(); |
166 break; | 167 break; |
167 case STATE_INIT_CONNECTION_COMPLETE: | 168 case STATE_INIT_CONNECTION_COMPLETE: |
168 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_INIT_CONNECTION, NULL); | 169 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_INIT_CONNECTION, NULL); |
169 rv = DoInitConnectionComplete(rv); | 170 rv = DoInitConnectionComplete(rv); |
170 break; | 171 break; |
| 172 case STATE_GET_STREAM: |
| 173 DCHECK_EQ(OK, rv); |
| 174 rv = DoGetStream(); |
| 175 break; |
| 176 case STATE_GET_STREAM_COMPLETE: |
| 177 rv = DoGetStreamComplete(rv); |
171 case STATE_SEND_REQUEST: | 178 case STATE_SEND_REQUEST: |
172 DCHECK_EQ(OK, rv); | 179 DCHECK_EQ(OK, rv); |
173 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST, NULL); | 180 net_log_.BeginEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST, NULL); |
174 rv = DoSendRequest(); | 181 rv = DoSendRequest(); |
175 break; | 182 break; |
176 case STATE_SEND_REQUEST_COMPLETE: | 183 case STATE_SEND_REQUEST_COMPLETE: |
177 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST, NULL); | 184 net_log_.EndEvent(NetLog::TYPE_SPDY_TRANSACTION_SEND_REQUEST, NULL); |
178 rv = DoSendRequestComplete(rv); | 185 rv = DoSendRequestComplete(rv); |
179 break; | 186 break; |
180 case STATE_READ_HEADERS: | 187 case STATE_READ_HEADERS: |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 DCHECK(spdy_); | 243 DCHECK(spdy_); |
237 | 244 |
238 return spdy_->Connect( | 245 return spdy_->Connect( |
239 connection_group, tcp_params, request_->priority); | 246 connection_group, tcp_params, request_->priority); |
240 } | 247 } |
241 | 248 |
242 int SpdyNetworkTransaction::DoInitConnectionComplete(int result) { | 249 int SpdyNetworkTransaction::DoInitConnectionComplete(int result) { |
243 if (result < 0) | 250 if (result < 0) |
244 return result; | 251 return result; |
245 | 252 |
| 253 next_state_ = STATE_GET_STREAM; |
| 254 return OK; |
| 255 } |
| 256 |
| 257 int SpdyNetworkTransaction::DoGetStream() { |
| 258 next_state_ = STATE_GET_STREAM_COMPLETE; |
| 259 |
| 260 // It is possible that the spdy session was shut down while it was |
| 261 // asynchronously waiting to connect. |
| 262 if (spdy_->IsClosed()) |
| 263 return ERR_CONNECTION_CLOSED; |
| 264 |
| 265 CHECK(!stream_.get()); |
| 266 |
| 267 stream_.reset(new SpdyHttpStream()); |
| 268 return stream_->InitializeStream(spdy_, *request_, |
| 269 net_log_, &io_callback_); |
| 270 } |
| 271 |
| 272 int SpdyNetworkTransaction::DoGetStreamComplete(int result) { |
| 273 if (result < 0) { |
| 274 return result; |
| 275 } |
| 276 |
246 next_state_ = STATE_SEND_REQUEST; | 277 next_state_ = STATE_SEND_REQUEST; |
247 return OK; | 278 return OK; |
248 } | 279 } |
249 | 280 |
250 int SpdyNetworkTransaction::DoSendRequest() { | 281 int SpdyNetworkTransaction::DoSendRequest() { |
251 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 282 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
252 CHECK(!stream_.get()); | |
253 | 283 |
254 // It is possible that the spdy session was shut down while it was | 284 UploadDataStream* upload_data_stream = NULL; |
255 // asynchronously waiting to connect. | |
256 if(spdy_->IsClosed()) | |
257 return ERR_CONNECTION_CLOSED; | |
258 | |
259 UploadDataStream* upload_data = NULL; | |
260 if (request_->upload_data) { | 285 if (request_->upload_data) { |
261 int error_code; | 286 int error_code; |
262 upload_data = UploadDataStream::Create(request_->upload_data, &error_code); | 287 upload_data_stream = UploadDataStream::Create(request_->upload_data, |
263 if (!upload_data) | 288 &error_code); |
| 289 if (!upload_data_stream) |
264 return error_code; | 290 return error_code; |
265 } | 291 } |
266 scoped_refptr<SpdyStream> spdy_stream; | 292 stream_->InitializeRequest(base::Time::Now(), upload_data_stream); |
267 if (request_->method == "GET") { | |
268 int error = spdy_->GetPushStream(request_->url, &spdy_stream, net_log_); | |
269 if (error != OK) | |
270 return error; | |
271 } | |
272 if (spdy_stream.get()) { | |
273 DCHECK(spdy_stream->pushed()); | |
274 CHECK(spdy_stream->GetDelegate() == NULL); | |
275 stream_.reset(new SpdyHttpStream(spdy_stream)); | |
276 stream_->InitializeRequest(*request_, base::Time::Now(), NULL); | |
277 // "vary" field? | |
278 } else { | |
279 int error = spdy_->CreateStream(request_->url, | |
280 request_->priority, | |
281 &spdy_stream, | |
282 net_log_); | |
283 if (error != OK) | |
284 return error; | |
285 DCHECK(!spdy_stream->pushed()); | |
286 CHECK(spdy_stream->GetDelegate() == NULL); | |
287 stream_.reset(new SpdyHttpStream(spdy_stream)); | |
288 stream_->InitializeRequest(*request_, base::Time::Now(), upload_data); | |
289 } | |
290 spdy_ = NULL; | 293 spdy_ = NULL; |
| 294 |
291 return stream_->SendRequest(&response_, &io_callback_); | 295 return stream_->SendRequest(&response_, &io_callback_); |
292 } | 296 } |
293 | 297 |
294 int SpdyNetworkTransaction::DoSendRequestComplete(int result) { | 298 int SpdyNetworkTransaction::DoSendRequestComplete(int result) { |
295 if (result < 0) { | 299 if (result < 0) { |
296 stream_.reset() ; | 300 stream_.reset(); |
297 return result; | 301 return result; |
298 } | 302 } |
299 | 303 |
300 next_state_ = STATE_READ_HEADERS; | 304 next_state_ = STATE_READ_HEADERS; |
301 return OK; | 305 return OK; |
302 } | 306 } |
303 | 307 |
304 int SpdyNetworkTransaction::DoReadHeaders() { | 308 int SpdyNetworkTransaction::DoReadHeaders() { |
305 next_state_ = STATE_READ_HEADERS_COMPLETE; | 309 next_state_ = STATE_READ_HEADERS_COMPLETE; |
306 return stream_->ReadResponseHeaders(&io_callback_); | 310 return stream_->ReadResponseHeaders(&io_callback_); |
(...skipping 15 matching lines...) Expand all Loading... |
322 user_buffer_ = NULL; | 326 user_buffer_ = NULL; |
323 user_buffer_len_ = 0; | 327 user_buffer_len_ = 0; |
324 | 328 |
325 if (result <= 0) | 329 if (result <= 0) |
326 stream_.reset(); | 330 stream_.reset(); |
327 | 331 |
328 return result; | 332 return result; |
329 } | 333 } |
330 | 334 |
331 } // namespace net | 335 } // namespace net |
OLD | NEW |