| 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_stream.h" | 5 #include "net/spdy/spdy_stream.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 delegate_(NULL), | 83 delegate_(NULL), |
| 84 request_time_(base::Time::Now()), | 84 request_time_(base::Time::Now()), |
| 85 response_(new spdy::SpdyHeaderBlock), | 85 response_(new spdy::SpdyHeaderBlock), |
| 86 io_state_(STATE_NONE), | 86 io_state_(STATE_NONE), |
| 87 response_status_(OK), | 87 response_status_(OK), |
| 88 cancelled_(false), | 88 cancelled_(false), |
| 89 has_upload_data_(false), | 89 has_upload_data_(false), |
| 90 net_log_(net_log), | 90 net_log_(net_log), |
| 91 send_bytes_(0), | 91 send_bytes_(0), |
| 92 recv_bytes_(0), | 92 recv_bytes_(0), |
| 93 ob_cert_type_(CLIENT_CERT_INVALID_TYPE) { | 93 domain_bound_cert_type_(CLIENT_CERT_INVALID_TYPE) { |
| 94 } | 94 } |
| 95 | 95 |
| 96 SpdyStream::~SpdyStream() { | 96 SpdyStream::~SpdyStream() { |
| 97 UpdateHistograms(); | 97 UpdateHistograms(); |
| 98 } | 98 } |
| 99 | 99 |
| 100 void SpdyStream::SetDelegate(Delegate* delegate) { | 100 void SpdyStream::SetDelegate(Delegate* delegate) { |
| 101 CHECK(delegate); | 101 CHECK(delegate); |
| 102 delegate_ = delegate; | 102 delegate_ = delegate; |
| 103 | 103 |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 // STATE_DONE. However, we still want to return IO_PENDING to mimic non-push | 479 // STATE_DONE. However, we still want to return IO_PENDING to mimic non-push |
| 480 // behavior. | 480 // behavior. |
| 481 has_upload_data_ = has_upload_data; | 481 has_upload_data_ = has_upload_data; |
| 482 if (pushed_) { | 482 if (pushed_) { |
| 483 send_time_ = base::TimeTicks::Now(); | 483 send_time_ = base::TimeTicks::Now(); |
| 484 DCHECK(!has_upload_data_); | 484 DCHECK(!has_upload_data_); |
| 485 DCHECK(response_received()); | 485 DCHECK(response_received()); |
| 486 return ERR_IO_PENDING; | 486 return ERR_IO_PENDING; |
| 487 } | 487 } |
| 488 CHECK_EQ(STATE_NONE, io_state_); | 488 CHECK_EQ(STATE_NONE, io_state_); |
| 489 io_state_ = STATE_GET_ORIGIN_BOUND_CERT; | 489 io_state_ = STATE_GET_DOMAIN_BOUND_CERT; |
| 490 return DoLoop(OK); | 490 return DoLoop(OK); |
| 491 } | 491 } |
| 492 | 492 |
| 493 int SpdyStream::WriteStreamData(IOBuffer* data, int length, | 493 int SpdyStream::WriteStreamData(IOBuffer* data, int length, |
| 494 spdy::SpdyDataFlags flags) { | 494 spdy::SpdyDataFlags flags) { |
| 495 return session_->WriteStreamData(stream_id_, data, length, flags); | 495 return session_->WriteStreamData(stream_id_, data, length, flags); |
| 496 } | 496 } |
| 497 | 497 |
| 498 bool SpdyStream::GetSSLInfo(SSLInfo* ssl_info, | 498 bool SpdyStream::GetSSLInfo(SSLInfo* ssl_info, |
| 499 bool* was_npn_negotiated, | 499 bool* was_npn_negotiated, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 it = request_->find("host"); | 536 it = request_->find("host"); |
| 537 if (it != (*request_).end()) | 537 if (it != (*request_).end()) |
| 538 host_port = it->second; | 538 host_port = it->second; |
| 539 it = request_->find("path"); | 539 it = request_->find("path"); |
| 540 if (it != (*request_).end()) | 540 if (it != (*request_).end()) |
| 541 path = it->second; | 541 path = it->second; |
| 542 std::string url = scheme + "://" + host_port + path; | 542 std::string url = scheme + "://" + host_port + path; |
| 543 return GURL(url); | 543 return GURL(url); |
| 544 } | 544 } |
| 545 | 545 |
| 546 void SpdyStream::OnGetOriginBoundCertComplete(int result) { | 546 void SpdyStream::OnGetDomainBoundCertComplete(int result) { |
| 547 DCHECK_EQ(STATE_GET_ORIGIN_BOUND_CERT_COMPLETE, io_state_); | 547 DCHECK_EQ(STATE_GET_DOMAIN_BOUND_CERT_COMPLETE, io_state_); |
| 548 DoLoop(result); | 548 DoLoop(result); |
| 549 } | 549 } |
| 550 | 550 |
| 551 int SpdyStream::DoLoop(int result) { | 551 int SpdyStream::DoLoop(int result) { |
| 552 do { | 552 do { |
| 553 State state = io_state_; | 553 State state = io_state_; |
| 554 io_state_ = STATE_NONE; | 554 io_state_ = STATE_NONE; |
| 555 switch (state) { | 555 switch (state) { |
| 556 // State machine 1: Send headers and body. | 556 // State machine 1: Send headers and body. |
| 557 case STATE_GET_ORIGIN_BOUND_CERT: | 557 case STATE_GET_DOMAIN_BOUND_CERT: |
| 558 CHECK_EQ(OK, result); | 558 CHECK_EQ(OK, result); |
| 559 result = DoGetOriginBoundCert(); | 559 result = DoGetDomainBoundCert(); |
| 560 break; | 560 break; |
| 561 case STATE_GET_ORIGIN_BOUND_CERT_COMPLETE: | 561 case STATE_GET_DOMAIN_BOUND_CERT_COMPLETE: |
| 562 result = DoGetOriginBoundCertComplete(result); | 562 result = DoGetDomainBoundCertComplete(result); |
| 563 break; | 563 break; |
| 564 case STATE_SEND_ORIGIN_BOUND_CERT: | 564 case STATE_SEND_DOMAIN_BOUND_CERT: |
| 565 CHECK_EQ(OK, result); | 565 CHECK_EQ(OK, result); |
| 566 result = DoSendOriginBoundCert(); | 566 result = DoSendDomainBoundCert(); |
| 567 break; | 567 break; |
| 568 case STATE_SEND_ORIGIN_BOUND_CERT_COMPLETE: | 568 case STATE_SEND_DOMAIN_BOUND_CERT_COMPLETE: |
| 569 result = DoSendOriginBoundCertComplete(result); | 569 result = DoSendDomainBoundCertComplete(result); |
| 570 break; | 570 break; |
| 571 case STATE_SEND_HEADERS: | 571 case STATE_SEND_HEADERS: |
| 572 CHECK_EQ(OK, result); | 572 CHECK_EQ(OK, result); |
| 573 result = DoSendHeaders(); | 573 result = DoSendHeaders(); |
| 574 break; | 574 break; |
| 575 case STATE_SEND_HEADERS_COMPLETE: | 575 case STATE_SEND_HEADERS_COMPLETE: |
| 576 result = DoSendHeadersComplete(result); | 576 result = DoSendHeadersComplete(result); |
| 577 break; | 577 break; |
| 578 case STATE_SEND_BODY: | 578 case STATE_SEND_BODY: |
| 579 CHECK_EQ(OK, result); | 579 CHECK_EQ(OK, result); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 default: | 612 default: |
| 613 NOTREACHED() << io_state_; | 613 NOTREACHED() << io_state_; |
| 614 break; | 614 break; |
| 615 } | 615 } |
| 616 } while (result != ERR_IO_PENDING && io_state_ != STATE_NONE && | 616 } while (result != ERR_IO_PENDING && io_state_ != STATE_NONE && |
| 617 io_state_ != STATE_OPEN); | 617 io_state_ != STATE_OPEN); |
| 618 | 618 |
| 619 return result; | 619 return result; |
| 620 } | 620 } |
| 621 | 621 |
| 622 int SpdyStream::DoGetOriginBoundCert() { | 622 int SpdyStream::DoGetDomainBoundCert() { |
| 623 CHECK(request_.get()); | 623 CHECK(request_.get()); |
| 624 HostPortPair origin(HostPortPair::FromURL(GetUrl())); | 624 HostPortPair origin(HostPortPair::FromURL(GetUrl())); |
| 625 if (!session_->NeedsCredentials(origin)) { | 625 if (!session_->NeedsCredentials(origin)) { |
| 626 // Proceed directly to sending headers | 626 // Proceed directly to sending headers |
| 627 io_state_ = STATE_SEND_HEADERS; | 627 io_state_ = STATE_SEND_HEADERS; |
| 628 return OK; | 628 return OK; |
| 629 } | 629 } |
| 630 | 630 |
| 631 io_state_ = STATE_GET_ORIGIN_BOUND_CERT_COMPLETE; | 631 io_state_ = STATE_GET_DOMAIN_BOUND_CERT_COMPLETE; |
| 632 OriginBoundCertService* obc_service = session_->GetOriginBoundCertService(); | 632 ServerBoundCertService* sbc_service = session_->GetServerBoundCertService(); |
| 633 DCHECK(obc_service != NULL); | 633 DCHECK(sbc_service != NULL); |
| 634 std::vector<uint8> requested_cert_types; | 634 std::vector<uint8> requested_cert_types; |
| 635 requested_cert_types.push_back(session_->GetOriginBoundCertType()); | 635 requested_cert_types.push_back(session_->GetDomainBoundCertType()); |
| 636 int rv = obc_service->GetOriginBoundCert( | 636 int rv = sbc_service->GetDomainBoundCert( |
| 637 GetUrl().GetOrigin().spec(), requested_cert_types, &ob_cert_type_, | 637 GetUrl().GetOrigin().spec(), requested_cert_types, |
| 638 &ob_private_key_, &ob_cert_, | 638 &domain_bound_cert_type_, &domain_bound_private_key_, &domain_bound_cert_, |
| 639 base::Bind(&SpdyStream::OnGetOriginBoundCertComplete, | 639 base::Bind(&SpdyStream::OnGetDomainBoundCertComplete, |
| 640 base::Unretained(this)), | 640 base::Unretained(this)), |
| 641 &ob_cert_request_handle_); | 641 &domain_bound_cert_request_handle_); |
| 642 return rv; | 642 return rv; |
| 643 } | 643 } |
| 644 | 644 |
| 645 int SpdyStream::DoGetOriginBoundCertComplete(int result) { | 645 int SpdyStream::DoGetDomainBoundCertComplete(int result) { |
| 646 if (result != OK) | 646 if (result != OK) |
| 647 return result; | 647 return result; |
| 648 | 648 |
| 649 io_state_ = STATE_SEND_ORIGIN_BOUND_CERT; | 649 io_state_ = STATE_SEND_DOMAIN_BOUND_CERT; |
| 650 return OK; | 650 return OK; |
| 651 } | 651 } |
| 652 | 652 |
| 653 int SpdyStream::DoSendOriginBoundCert() { | 653 int SpdyStream::DoSendDomainBoundCert() { |
| 654 io_state_ = STATE_SEND_ORIGIN_BOUND_CERT_COMPLETE; | 654 io_state_ = STATE_SEND_DOMAIN_BOUND_CERT_COMPLETE; |
| 655 CHECK(request_.get()); | 655 CHECK(request_.get()); |
| 656 std::string origin = GetUrl().GetOrigin().spec(); | 656 std::string origin = GetUrl().GetOrigin().spec(); |
| 657 origin.erase(origin.length() - 1); // trim trailing slash | 657 origin.erase(origin.length() - 1); // trim trailing slash |
| 658 int rv = session_->WriteCredentialFrame( | 658 int rv = session_->WriteCredentialFrame( |
| 659 origin, ob_cert_type_, ob_private_key_, ob_cert_, | 659 origin, domain_bound_cert_type_, domain_bound_private_key_, |
| 660 static_cast<RequestPriority>(priority_)); | 660 domain_bound_cert_, static_cast<RequestPriority>(priority_)); |
| 661 if (rv != ERR_IO_PENDING) | 661 if (rv != ERR_IO_PENDING) |
| 662 return rv; | 662 return rv; |
| 663 return OK; | 663 return OK; |
| 664 } | 664 } |
| 665 | 665 |
| 666 int SpdyStream::DoSendOriginBoundCertComplete(int result) { | 666 int SpdyStream::DoSendDomainBoundCertComplete(int result) { |
| 667 if (result < 0) | 667 if (result < 0) |
| 668 return result; | 668 return result; |
| 669 | 669 |
| 670 io_state_ = STATE_SEND_HEADERS; | 670 io_state_ = STATE_SEND_HEADERS; |
| 671 return OK; | 671 return OK; |
| 672 } | 672 } |
| 673 | 673 |
| 674 int SpdyStream::DoSendHeaders() { | 674 int SpdyStream::DoSendHeaders() { |
| 675 CHECK(!cancelled_); | 675 CHECK(!cancelled_); |
| 676 | 676 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", | 758 UMA_HISTOGRAM_TIMES("Net.SpdyStreamDownloadTime", |
| 759 recv_last_byte_time_ - recv_first_byte_time_); | 759 recv_last_byte_time_ - recv_first_byte_time_); |
| 760 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", | 760 UMA_HISTOGRAM_TIMES("Net.SpdyStreamTime", |
| 761 recv_last_byte_time_ - send_time_); | 761 recv_last_byte_time_ - send_time_); |
| 762 | 762 |
| 763 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); | 763 UMA_HISTOGRAM_COUNTS("Net.SpdySendBytes", send_bytes_); |
| 764 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); | 764 UMA_HISTOGRAM_COUNTS("Net.SpdyRecvBytes", recv_bytes_); |
| 765 } | 765 } |
| 766 | 766 |
| 767 } // namespace net | 767 } // namespace net |
| OLD | NEW |