| OLD | NEW |
| 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 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 if (connection_->is_initialized()) { | 293 if (connection_->is_initialized()) { |
| 294 // With Spdy we can't recycle sockets. | 294 // With Spdy we can't recycle sockets. |
| 295 connection_->socket()->Disconnect(); | 295 connection_->socket()->Disconnect(); |
| 296 } | 296 } |
| 297 | 297 |
| 298 RecordHistograms(); | 298 RecordHistograms(); |
| 299 | 299 |
| 300 net_log_.EndEvent(NetLog::TYPE_SPDY_SESSION, NULL); | 300 net_log_.EndEvent(NetLog::TYPE_SPDY_SESSION, NULL); |
| 301 } | 301 } |
| 302 | 302 |
| 303 void SpdySession::InitializeWithSSLSocket(ClientSocketHandle* connection) { | 303 net::Error SpdySession::InitializeWithSSLSocket( |
| 304 ClientSocketHandle* connection) { |
| 304 static StatsCounter spdy_sessions("spdy.sessions"); | 305 static StatsCounter spdy_sessions("spdy.sessions"); |
| 305 spdy_sessions.Increment(); | 306 spdy_sessions.Increment(); |
| 306 | 307 |
| 307 AdjustSocketBufferSizes(connection->socket()); | 308 AdjustSocketBufferSizes(connection->socket()); |
| 308 | 309 |
| 309 state_ = CONNECTED; | 310 state_ = CONNECTED; |
| 310 connection_.reset(connection); | 311 connection_.reset(connection); |
| 311 is_secure_ = true; // |connection| contains an SSLClientSocket. | 312 is_secure_ = true; // |connection| contains an SSLClientSocket. |
| 312 | 313 |
| 313 // This is a newly initialized session that no client should have a handle to | 314 // This is a newly initialized session that no client should have a handle to |
| 314 // yet, so there's no need to start writing data as in OnTCPConnect(), but we | 315 // yet, so there's no need to start writing data as in OnTCPConnect(), but we |
| 315 // should start reading data. | 316 // should start reading data. |
| 316 ReadSocket(); | 317 net::Error error = ReadSocket(); |
| 318 if (error == ERR_IO_PENDING) |
| 319 return OK; |
| 320 return error; |
| 317 } | 321 } |
| 318 | 322 |
| 319 net::Error SpdySession::Connect(const std::string& group_name, | 323 net::Error SpdySession::Connect(const std::string& group_name, |
| 320 const TCPSocketParams& destination, | 324 const TCPSocketParams& destination, |
| 321 RequestPriority priority) { | 325 RequestPriority priority) { |
| 322 DCHECK(priority >= SPDY_PRIORITY_HIGHEST && priority <= SPDY_PRIORITY_LOWEST); | 326 DCHECK(priority >= SPDY_PRIORITY_HIGHEST && priority <= SPDY_PRIORITY_LOWEST); |
| 323 | 327 |
| 324 // If the connect process is started, let the caller continue. | 328 // If the connect process is started, let the caller continue. |
| 325 if (state_ > IDLE) | 329 if (state_ > IDLE) |
| 326 return net::OK; | 330 return net::OK; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 340 if (rv == net::ERR_IO_PENDING) | 344 if (rv == net::ERR_IO_PENDING) |
| 341 return net::OK; | 345 return net::OK; |
| 342 OnTCPConnect(rv); | 346 OnTCPConnect(rv); |
| 343 return static_cast<net::Error>(rv); | 347 return static_cast<net::Error>(rv); |
| 344 } | 348 } |
| 345 | 349 |
| 346 scoped_refptr<SpdyHttpStream> SpdySession::GetOrCreateStream( | 350 scoped_refptr<SpdyHttpStream> SpdySession::GetOrCreateStream( |
| 347 const HttpRequestInfo& request, | 351 const HttpRequestInfo& request, |
| 348 const UploadDataStream* upload_data, | 352 const UploadDataStream* upload_data, |
| 349 const BoundNetLog& stream_net_log) { | 353 const BoundNetLog& stream_net_log) { |
| 354 CHECK_NE(state_, CLOSED); |
| 350 const GURL& url = request.url; | 355 const GURL& url = request.url; |
| 351 const std::string& path = url.PathForRequest(); | 356 const std::string& path = url.PathForRequest(); |
| 352 | 357 |
| 353 scoped_refptr<SpdyHttpStream> stream; | 358 scoped_refptr<SpdyHttpStream> stream; |
| 354 | 359 |
| 355 // Check if we have a push stream for this path. | 360 // Check if we have a push stream for this path. |
| 356 if (request.method == "GET") { | 361 if (request.method == "GET") { |
| 357 // Only HTTP will push a stream. | 362 // Only HTTP will push a stream. |
| 358 scoped_refptr<SpdyHttpStream> stream = GetPushStream(path); | 363 scoped_refptr<SpdyHttpStream> stream = GetPushStream(path); |
| 359 if (stream) { | 364 if (stream) { |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 // message loop). | 664 // message loop). |
| 660 WriteSocketLater(); | 665 WriteSocketLater(); |
| 661 } else { | 666 } else { |
| 662 in_flight_write_.release(); | 667 in_flight_write_.release(); |
| 663 | 668 |
| 664 // The stream is now errored. Close it down. | 669 // The stream is now errored. Close it down. |
| 665 CloseSessionOnError(static_cast<net::Error>(result)); | 670 CloseSessionOnError(static_cast<net::Error>(result)); |
| 666 } | 671 } |
| 667 } | 672 } |
| 668 | 673 |
| 669 void SpdySession::ReadSocket() { | 674 net::Error SpdySession::ReadSocket() { |
| 670 if (read_pending_) | 675 if (read_pending_) |
| 671 return; | 676 return OK; |
| 672 | 677 |
| 673 if (state_ == CLOSED) { | 678 if (state_ == CLOSED) { |
| 674 NOTREACHED(); | 679 NOTREACHED(); |
| 675 return; | 680 return ERR_UNEXPECTED; |
| 676 } | 681 } |
| 677 | 682 |
| 678 CHECK(connection_.get()); | 683 CHECK(connection_.get()); |
| 679 CHECK(connection_->socket()); | 684 CHECK(connection_->socket()); |
| 680 int bytes_read = connection_->socket()->Read(read_buffer_.get(), | 685 int bytes_read = connection_->socket()->Read(read_buffer_.get(), |
| 681 kReadBufferSize, | 686 kReadBufferSize, |
| 682 &read_callback_); | 687 &read_callback_); |
| 683 switch (bytes_read) { | 688 switch (bytes_read) { |
| 684 case 0: | 689 case 0: |
| 685 // Socket is closed! | 690 // Socket is closed! |
| 686 CloseSessionOnError(ERR_CONNECTION_CLOSED); | 691 CloseSessionOnError(ERR_CONNECTION_CLOSED); |
| 687 return; | 692 return ERR_CONNECTION_CLOSED; |
| 688 case net::ERR_IO_PENDING: | 693 case net::ERR_IO_PENDING: |
| 689 // Waiting for data. Nothing to do now. | 694 // Waiting for data. Nothing to do now. |
| 690 read_pending_ = true; | 695 read_pending_ = true; |
| 691 return; | 696 return ERR_IO_PENDING; |
| 692 default: | 697 default: |
| 693 // Data was read, process it. | 698 // Data was read, process it. |
| 694 // Schedule the work through the message loop to avoid recursive | 699 // Schedule the work through the message loop to avoid recursive |
| 695 // callbacks. | 700 // callbacks. |
| 696 read_pending_ = true; | 701 read_pending_ = true; |
| 697 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 702 MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( |
| 698 this, &SpdySession::OnReadComplete, bytes_read)); | 703 this, &SpdySession::OnReadComplete, bytes_read)); |
| 699 break; | 704 break; |
| 700 } | 705 } |
| 706 return OK; |
| 701 } | 707 } |
| 702 | 708 |
| 703 void SpdySession::WriteSocketLater() { | 709 void SpdySession::WriteSocketLater() { |
| 704 if (delayed_write_pending_) | 710 if (delayed_write_pending_) |
| 705 return; | 711 return; |
| 706 | 712 |
| 707 if (state_ < CONNECTED) | 713 if (state_ < CONNECTED) |
| 708 return; | 714 return; |
| 709 | 715 |
| 710 delayed_write_pending_ = true; | 716 delayed_write_pending_ = true; |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsRetransRate", | 1303 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SpdySettingsRetransRate", |
| 1298 setting.second, | 1304 setting.second, |
| 1299 1, 100, 50); | 1305 1, 100, 50); |
| 1300 break; | 1306 break; |
| 1301 } | 1307 } |
| 1302 } | 1308 } |
| 1303 } | 1309 } |
| 1304 } | 1310 } |
| 1305 | 1311 |
| 1306 } // namespace net | 1312 } // namespace net |
| OLD | NEW |