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/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 // Store the request body. | 82 // Store the request body. |
83 request_body_stream_ = request_info_->upload_data_stream; | 83 request_body_stream_ = request_info_->upload_data_stream; |
84 if (request_body_stream_ && (request_body_stream_->size() || | 84 if (request_body_stream_ && (request_body_stream_->size() || |
85 request_body_stream_->is_chunked())) { | 85 request_body_stream_->is_chunked())) { |
86 // Use kMaxPacketSize as the buffer size, since the request | 86 // Use kMaxPacketSize as the buffer size, since the request |
87 // body data is written with this size at a time. | 87 // body data is written with this size at a time. |
88 // TODO(rch): use a smarter value since we can't write an entire | 88 // TODO(rch): use a smarter value since we can't write an entire |
89 // packet due to overhead. | 89 // packet due to overhead. |
90 raw_request_body_buf_ = new IOBufferWithSize(kMaxPacketSize); | 90 raw_request_body_buf_ = new IOBufferWithSize(kMaxPacketSize); |
91 // The request body buffer is empty at first. | 91 // The request body buffer is empty at first. |
92 request_body_buf_ = new DrainableIOBuffer(raw_request_body_buf_, 0); | 92 request_body_buf_ = new DrainableIOBuffer(raw_request_body_buf_.get(), 0); |
93 } | 93 } |
94 | 94 |
95 // Store the response info. | 95 // Store the response info. |
96 response_info_ = response; | 96 response_info_ = response; |
97 | 97 |
98 next_state_ = STATE_SEND_HEADERS; | 98 next_state_ = STATE_SEND_HEADERS; |
99 int rv = DoLoop(OK); | 99 int rv = DoLoop(OK); |
100 if (rv == ERR_IO_PENDING) | 100 if (rv == ERR_IO_PENDING) |
101 callback_ = callback; | 101 callback_ = callback; |
102 | 102 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 159 } |
160 return bytes_read; | 160 return bytes_read; |
161 } | 161 } |
162 | 162 |
163 if (!stream_) { | 163 if (!stream_) { |
164 // If the stream is already closed, there is no body to read. | 164 // If the stream is already closed, there is no body to read. |
165 return response_status_; | 165 return response_status_; |
166 } | 166 } |
167 | 167 |
168 CHECK(callback_.is_null()); | 168 CHECK(callback_.is_null()); |
169 CHECK(!user_buffer_); | 169 CHECK(!user_buffer_.get()); |
170 CHECK_EQ(0, user_buffer_len_); | 170 CHECK_EQ(0, user_buffer_len_); |
171 | 171 |
172 callback_ = callback; | 172 callback_ = callback; |
173 user_buffer_ = buf; | 173 user_buffer_ = buf; |
174 user_buffer_len_ = buf_len; | 174 user_buffer_len_ = buf_len; |
175 return ERR_IO_PENDING; | 175 return ERR_IO_PENDING; |
176 } | 176 } |
177 | 177 |
178 void QuicHttpStream::Close(bool not_reusable) { | 178 void QuicHttpStream::Close(bool not_reusable) { |
179 // Note: the not_reusable flag has no meaning for SPDY streams. | 179 // Note: the not_reusable flag has no meaning for SPDY streams. |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 return rv; | 372 return rv; |
373 | 373 |
374 next_state_ = request_body_stream_ ? | 374 next_state_ = request_body_stream_ ? |
375 STATE_READ_REQUEST_BODY : STATE_OPEN; | 375 STATE_READ_REQUEST_BODY : STATE_OPEN; |
376 | 376 |
377 return OK; | 377 return OK; |
378 } | 378 } |
379 | 379 |
380 int QuicHttpStream::DoReadRequestBody() { | 380 int QuicHttpStream::DoReadRequestBody() { |
381 next_state_ = STATE_READ_REQUEST_BODY_COMPLETE; | 381 next_state_ = STATE_READ_REQUEST_BODY_COMPLETE; |
382 return request_body_stream_->Read(raw_request_body_buf_, | 382 return request_body_stream_->Read( |
383 raw_request_body_buf_->size(), | 383 raw_request_body_buf_.get(), |
384 base::Bind(&QuicHttpStream::OnIOComplete, | 384 raw_request_body_buf_->size(), |
385 weak_factory_.GetWeakPtr())); | 385 base::Bind(&QuicHttpStream::OnIOComplete, weak_factory_.GetWeakPtr())); |
386 } | 386 } |
387 | 387 |
388 int QuicHttpStream::DoReadRequestBodyComplete(int rv) { | 388 int QuicHttpStream::DoReadRequestBodyComplete(int rv) { |
389 // |rv| is the result of read from the request body from the last call to | 389 // |rv| is the result of read from the request body from the last call to |
390 // DoSendBody(). | 390 // DoSendBody(). |
391 if (rv < 0) | 391 if (rv < 0) |
392 return rv; | 392 return rv; |
393 | 393 |
394 request_body_buf_ = new DrainableIOBuffer(raw_request_body_buf_, rv); | 394 request_body_buf_ = new DrainableIOBuffer(raw_request_body_buf_.get(), rv); |
395 if (rv == 0) { // Reached the end. | 395 if (rv == 0) { // Reached the end. |
396 DCHECK(request_body_stream_->IsEOF()); | 396 DCHECK(request_body_stream_->IsEOF()); |
397 } | 397 } |
398 | 398 |
399 next_state_ = STATE_SEND_BODY; | 399 next_state_ = STATE_SEND_BODY; |
400 return OK; | 400 return OK; |
401 } | 401 } |
402 | 402 |
403 int QuicHttpStream::DoSendBody() { | 403 int QuicHttpStream::DoSendBody() { |
404 if (!stream_) | 404 if (!stream_) |
405 return ERR_UNEXPECTED; | 405 return ERR_UNEXPECTED; |
406 | 406 |
407 CHECK(request_body_stream_); | 407 CHECK(request_body_stream_); |
408 CHECK(request_body_buf_); | 408 CHECK(request_body_buf_.get()); |
409 const bool eof = request_body_stream_->IsEOF(); | 409 const bool eof = request_body_stream_->IsEOF(); |
410 int len = request_body_buf_->BytesRemaining(); | 410 int len = request_body_buf_->BytesRemaining(); |
411 if (len > 0 || eof) { | 411 if (len > 0 || eof) { |
412 base::StringPiece data(request_body_buf_->data(), len); | 412 base::StringPiece data(request_body_buf_->data(), len); |
413 QuicConsumedData rv = stream_->WriteData(data, eof); | 413 QuicConsumedData rv = stream_->WriteData(data, eof); |
414 request_body_buf_->DidConsume(rv.bytes_consumed); | 414 request_body_buf_->DidConsume(rv.bytes_consumed); |
415 if (eof) { | 415 if (eof) { |
416 next_state_ = STATE_OPEN; | 416 next_state_ = STATE_OPEN; |
417 return OK; | 417 return OK; |
418 } | 418 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 | 458 |
459 if (!SpdyHeadersToHttpResponse(headers, 3, response_info_)) { | 459 if (!SpdyHeadersToHttpResponse(headers, 3, response_info_)) { |
460 DLOG(WARNING) << "Invalid headers"; | 460 DLOG(WARNING) << "Invalid headers"; |
461 return ERR_QUIC_PROTOCOL_ERROR; | 461 return ERR_QUIC_PROTOCOL_ERROR; |
462 } | 462 } |
463 // Put the peer's IP address and port into the response. | 463 // Put the peer's IP address and port into the response. |
464 IPEndPoint address = stream_->GetPeerAddress(); | 464 IPEndPoint address = stream_->GetPeerAddress(); |
465 response_info_->socket_address = HostPortPair::FromIPEndPoint(address); | 465 response_info_->socket_address = HostPortPair::FromIPEndPoint(address); |
466 response_info_->connection_info = | 466 response_info_->connection_info = |
467 HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3; | 467 HttpResponseInfo::CONNECTION_INFO_QUIC1_SPDY3; |
468 response_info_->vary_data.Init(*request_info_, *response_info_->headers); | 468 response_info_->vary_data |
| 469 .Init(*request_info_, *response_info_->headers.get()); |
469 response_info_->was_npn_negotiated = true; | 470 response_info_->was_npn_negotiated = true; |
470 response_info_->npn_negotiated_protocol = "quic/1+spdy/3"; | 471 response_info_->npn_negotiated_protocol = "quic/1+spdy/3"; |
471 response_headers_received_ = true; | 472 response_headers_received_ = true; |
472 | 473 |
473 return OK; | 474 return OK; |
474 } | 475 } |
475 | 476 |
476 void QuicHttpStream::BufferResponseBody(const char* data, int length) { | 477 void QuicHttpStream::BufferResponseBody(const char* data, int length) { |
477 if (length == 0) | 478 if (length == 0) |
478 return; | 479 return; |
479 IOBufferWithSize* io_buffer = new IOBufferWithSize(length); | 480 IOBufferWithSize* io_buffer = new IOBufferWithSize(length); |
480 memcpy(io_buffer->data(), data, length); | 481 memcpy(io_buffer->data(), data, length); |
481 response_body_.push_back(make_scoped_refptr(io_buffer)); | 482 response_body_.push_back(make_scoped_refptr(io_buffer)); |
482 } | 483 } |
483 | 484 |
484 } // namespace net | 485 } // namespace net |
OLD | NEW |