| 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/quic/quic_http_stream.h" | 5 #include "net/quic/quic_http_stream.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 namespace net { | 24 namespace net { |
| 25 | 25 |
| 26 static const size_t kHeaderBufInitialSize = 4096; | 26 static const size_t kHeaderBufInitialSize = 4096; |
| 27 | 27 |
| 28 QuicHttpStream::QuicHttpStream(const base::WeakPtr<QuicClientSession>& session) | 28 QuicHttpStream::QuicHttpStream(const base::WeakPtr<QuicClientSession>& session) |
| 29 : next_state_(STATE_NONE), | 29 : next_state_(STATE_NONE), |
| 30 session_(session), | 30 session_(session), |
| 31 session_error_(OK), | 31 session_error_(OK), |
| 32 was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()), | 32 was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()), |
| 33 stream_(NULL), | 33 stream_(nullptr), |
| 34 request_info_(NULL), | 34 request_info_(nullptr), |
| 35 request_body_stream_(NULL), | 35 request_body_stream_(nullptr), |
| 36 priority_(MINIMUM_PRIORITY), | 36 priority_(MINIMUM_PRIORITY), |
| 37 response_info_(NULL), | 37 response_info_(nullptr), |
| 38 response_status_(OK), | 38 response_status_(OK), |
| 39 response_headers_received_(false), | 39 response_headers_received_(false), |
| 40 read_buf_(new GrowableIOBuffer()), | 40 read_buf_(new GrowableIOBuffer()), |
| 41 closed_stream_received_bytes_(0), | 41 closed_stream_received_bytes_(0), |
| 42 user_buffer_len_(0), | 42 user_buffer_len_(0), |
| 43 weak_factory_(this) { | 43 weak_factory_(this) { |
| 44 DCHECK(session_); | 44 DCHECK(session_); |
| 45 session_->AddObserver(this); | 45 session_->AddObserver(this); |
| 46 } | 46 } |
| 47 | 47 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 if (!request_body_stream_) | 148 if (!request_body_stream_) |
| 149 return UploadProgress(); | 149 return UploadProgress(); |
| 150 | 150 |
| 151 return UploadProgress(request_body_stream_->position(), | 151 return UploadProgress(request_body_stream_->position(), |
| 152 request_body_stream_->size()); | 152 request_body_stream_->size()); |
| 153 } | 153 } |
| 154 | 154 |
| 155 int QuicHttpStream::ReadResponseHeaders(const CompletionCallback& callback) { | 155 int QuicHttpStream::ReadResponseHeaders(const CompletionCallback& callback) { |
| 156 CHECK(!callback.is_null()); | 156 CHECK(!callback.is_null()); |
| 157 | 157 |
| 158 if (stream_ == NULL) | 158 if (stream_ == nullptr) |
| 159 return response_status_; | 159 return response_status_; |
| 160 | 160 |
| 161 // Check if we already have the response headers. If so, return synchronously. | 161 // Check if we already have the response headers. If so, return synchronously. |
| 162 if (response_headers_received_) | 162 if (response_headers_received_) |
| 163 return OK; | 163 return OK; |
| 164 | 164 |
| 165 // Still waiting for the response, return IO_PENDING. | 165 // Still waiting for the response, return IO_PENDING. |
| 166 CHECK(callback_.is_null()); | 166 CHECK(callback_.is_null()); |
| 167 callback_ = callback; | 167 callback_ = callback; |
| 168 return ERR_IO_PENDING; | 168 return ERR_IO_PENDING; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 callback_ = callback; | 209 callback_ = callback; |
| 210 user_buffer_ = buf; | 210 user_buffer_ = buf; |
| 211 user_buffer_len_ = buf_len; | 211 user_buffer_len_ = buf_len; |
| 212 return ERR_IO_PENDING; | 212 return ERR_IO_PENDING; |
| 213 } | 213 } |
| 214 | 214 |
| 215 void QuicHttpStream::Close(bool not_reusable) { | 215 void QuicHttpStream::Close(bool not_reusable) { |
| 216 // Note: the not_reusable flag has no meaning for SPDY streams. | 216 // Note: the not_reusable flag has no meaning for SPDY streams. |
| 217 if (stream_) { | 217 if (stream_) { |
| 218 closed_stream_received_bytes_ = stream_->stream_bytes_read(); | 218 closed_stream_received_bytes_ = stream_->stream_bytes_read(); |
| 219 stream_->SetDelegate(NULL); | 219 stream_->SetDelegate(nullptr); |
| 220 stream_->Reset(QUIC_STREAM_CANCELLED); | 220 stream_->Reset(QUIC_STREAM_CANCELLED); |
| 221 stream_ = NULL; | 221 stream_ = nullptr; |
| 222 response_status_ = was_handshake_confirmed_ ? | 222 response_status_ = was_handshake_confirmed_ ? |
| 223 ERR_CONNECTION_CLOSED : ERR_QUIC_HANDSHAKE_FAILED; | 223 ERR_CONNECTION_CLOSED : ERR_QUIC_HANDSHAKE_FAILED; |
| 224 } | 224 } |
| 225 } | 225 } |
| 226 | 226 |
| 227 HttpStream* QuicHttpStream::RenewStreamForAuth() { | 227 HttpStream* QuicHttpStream::RenewStreamForAuth() { |
| 228 return NULL; | 228 return nullptr; |
| 229 } | 229 } |
| 230 | 230 |
| 231 bool QuicHttpStream::IsResponseBodyComplete() const { | 231 bool QuicHttpStream::IsResponseBodyComplete() const { |
| 232 return next_state_ == STATE_OPEN && !stream_; | 232 return next_state_ == STATE_OPEN && !stream_; |
| 233 } | 233 } |
| 234 | 234 |
| 235 bool QuicHttpStream::CanFindEndOfResponse() const { | 235 bool QuicHttpStream::CanFindEndOfResponse() const { |
| 236 return true; | 236 return true; |
| 237 } | 237 } |
| 238 | 238 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 | 314 |
| 315 if (length <= user_buffer_len_) { | 315 if (length <= user_buffer_len_) { |
| 316 memcpy(user_buffer_->data(), data, length); | 316 memcpy(user_buffer_->data(), data, length); |
| 317 } else { | 317 } else { |
| 318 memcpy(user_buffer_->data(), data, user_buffer_len_); | 318 memcpy(user_buffer_->data(), data, user_buffer_len_); |
| 319 int delta = length - user_buffer_len_; | 319 int delta = length - user_buffer_len_; |
| 320 BufferResponseBody(data + user_buffer_len_, delta); | 320 BufferResponseBody(data + user_buffer_len_, delta); |
| 321 length = user_buffer_len_; | 321 length = user_buffer_len_; |
| 322 } | 322 } |
| 323 | 323 |
| 324 user_buffer_ = NULL; | 324 user_buffer_ = nullptr; |
| 325 user_buffer_len_ = 0; | 325 user_buffer_len_ = 0; |
| 326 DoCallback(length); | 326 DoCallback(length); |
| 327 return OK; | 327 return OK; |
| 328 } | 328 } |
| 329 | 329 |
| 330 void QuicHttpStream::OnClose(QuicErrorCode error) { | 330 void QuicHttpStream::OnClose(QuicErrorCode error) { |
| 331 if (error != QUIC_NO_ERROR) { | 331 if (error != QUIC_NO_ERROR) { |
| 332 response_status_ = was_handshake_confirmed_ ? | 332 response_status_ = was_handshake_confirmed_ ? |
| 333 ERR_QUIC_PROTOCOL_ERROR : ERR_QUIC_HANDSHAKE_FAILED; | 333 ERR_QUIC_PROTOCOL_ERROR : ERR_QUIC_HANDSHAKE_FAILED; |
| 334 } else if (!response_headers_received_) { | 334 } else if (!response_headers_received_) { |
| 335 response_status_ = ERR_ABORTED; | 335 response_status_ = ERR_ABORTED; |
| 336 } | 336 } |
| 337 | 337 |
| 338 closed_stream_received_bytes_ = stream_->stream_bytes_read(); | 338 closed_stream_received_bytes_ = stream_->stream_bytes_read(); |
| 339 stream_ = NULL; | 339 stream_ = nullptr; |
| 340 if (!callback_.is_null()) | 340 if (!callback_.is_null()) |
| 341 DoCallback(response_status_); | 341 DoCallback(response_status_); |
| 342 } | 342 } |
| 343 | 343 |
| 344 void QuicHttpStream::OnError(int error) { | 344 void QuicHttpStream::OnError(int error) { |
| 345 stream_ = NULL; | 345 stream_ = nullptr; |
| 346 response_status_ = was_handshake_confirmed_ ? | 346 response_status_ = was_handshake_confirmed_ ? |
| 347 error : ERR_QUIC_HANDSHAKE_FAILED; | 347 error : ERR_QUIC_HANDSHAKE_FAILED; |
| 348 if (!callback_.is_null()) | 348 if (!callback_.is_null()) |
| 349 DoCallback(response_status_); | 349 DoCallback(response_status_); |
| 350 } | 350 } |
| 351 | 351 |
| 352 bool QuicHttpStream::HasSendHeadersComplete() { | 352 bool QuicHttpStream::HasSendHeadersComplete() { |
| 353 return next_state_ > STATE_SEND_HEADERS_COMPLETE; | 353 return next_state_ > STATE_SEND_HEADERS_COMPLETE; |
| 354 } | 354 } |
| 355 | 355 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 stream_net_log_.AddEvent( | 427 stream_net_log_.AddEvent( |
| 428 NetLog::TYPE_HTTP_TRANSACTION_QUIC_SEND_REQUEST_HEADERS, | 428 NetLog::TYPE_HTTP_TRANSACTION_QUIC_SEND_REQUEST_HEADERS, |
| 429 base::Bind(&QuicRequestNetLogCallback, stream_->id(), &request_headers_, | 429 base::Bind(&QuicRequestNetLogCallback, stream_->id(), &request_headers_, |
| 430 priority_)); | 430 priority_)); |
| 431 // Also log to the QuicSession's net log. | 431 // Also log to the QuicSession's net log. |
| 432 stream_->net_log().AddEvent( | 432 stream_->net_log().AddEvent( |
| 433 NetLog::TYPE_QUIC_HTTP_STREAM_SEND_REQUEST_HEADERS, | 433 NetLog::TYPE_QUIC_HTTP_STREAM_SEND_REQUEST_HEADERS, |
| 434 base::Bind(&QuicRequestNetLogCallback, stream_->id(), &request_headers_, | 434 base::Bind(&QuicRequestNetLogCallback, stream_->id(), &request_headers_, |
| 435 priority_)); | 435 priority_)); |
| 436 | 436 |
| 437 bool has_upload_data = request_body_stream_ != NULL; | 437 bool has_upload_data = request_body_stream_ != nullptr; |
| 438 | 438 |
| 439 next_state_ = STATE_SEND_HEADERS_COMPLETE; | 439 next_state_ = STATE_SEND_HEADERS_COMPLETE; |
| 440 int rv = stream_->WriteHeaders(request_headers_, !has_upload_data, NULL); | 440 int rv = stream_->WriteHeaders(request_headers_, !has_upload_data, nullptr); |
| 441 request_headers_.clear(); | 441 request_headers_.clear(); |
| 442 return rv; | 442 return rv; |
| 443 } | 443 } |
| 444 | 444 |
| 445 int QuicHttpStream::DoSendHeadersComplete(int rv) { | 445 int QuicHttpStream::DoSendHeadersComplete(int rv) { |
| 446 if (rv < 0) | 446 if (rv < 0) |
| 447 return rv; | 447 return rv; |
| 448 | 448 |
| 449 next_state_ = request_body_stream_ ? | 449 next_state_ = request_body_stream_ ? |
| 450 STATE_READ_REQUEST_BODY : STATE_OPEN; | 450 STATE_READ_REQUEST_BODY : STATE_OPEN; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 | 556 |
| 557 void QuicHttpStream::BufferResponseBody(const char* data, int length) { | 557 void QuicHttpStream::BufferResponseBody(const char* data, int length) { |
| 558 if (length == 0) | 558 if (length == 0) |
| 559 return; | 559 return; |
| 560 IOBufferWithSize* io_buffer = new IOBufferWithSize(length); | 560 IOBufferWithSize* io_buffer = new IOBufferWithSize(length); |
| 561 memcpy(io_buffer->data(), data, length); | 561 memcpy(io_buffer->data(), data, length); |
| 562 response_body_.push_back(make_scoped_refptr(io_buffer)); | 562 response_body_.push_back(make_scoped_refptr(io_buffer)); |
| 563 } | 563 } |
| 564 | 564 |
| 565 } // namespace net | 565 } // namespace net |
| OLD | NEW |