OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/loader/intercepting_resource_handler.h" | 5 #include "content/browser/loader/intercepting_resource_handler.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 // Otherwise, switch handlers. First, inform the original ResourceHandler | 87 // Otherwise, switch handlers. First, inform the original ResourceHandler |
88 // that this will be handled entirely by the new ResourceHandler. | 88 // that this will be handled entirely by the new ResourceHandler. |
89 HoldController(std::move(controller)); | 89 HoldController(std::move(controller)); |
90 state_ = State::SWAPPING_HANDLERS; | 90 state_ = State::SWAPPING_HANDLERS; |
91 | 91 |
92 DoLoop(); | 92 DoLoop(); |
93 } | 93 } |
94 | 94 |
95 bool InterceptingResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, | 95 bool InterceptingResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
96 int* buf_size, | 96 int* buf_size) { |
97 int min_size) { | |
98 if (state_ == State::PASS_THROUGH) | 97 if (state_ == State::PASS_THROUGH) |
99 return next_handler_->OnWillRead(buf, buf_size, min_size); | 98 return next_handler_->OnWillRead(buf, buf_size); |
100 | 99 |
101 DCHECK_EQ(State::STARTING, state_); | 100 DCHECK_EQ(State::STARTING, state_); |
102 DCHECK_EQ(-1, min_size); | |
103 | 101 |
104 if (!next_handler_->OnWillRead(buf, buf_size, min_size)) | 102 if (!next_handler_->OnWillRead(buf, buf_size)) |
105 return false; | 103 return false; |
106 | 104 |
107 first_read_buffer_ = *buf; | 105 first_read_buffer_ = *buf; |
108 first_read_buffer_size_ = *buf_size; | 106 first_read_buffer_size_ = *buf_size; |
109 first_read_buffer_double_ = new net::IOBuffer(static_cast<size_t>(*buf_size)); | 107 first_read_buffer_double_ = new net::IOBuffer(static_cast<size_t>(*buf_size)); |
110 *buf = first_read_buffer_double_; | 108 *buf = first_read_buffer_double_; |
111 return true; | 109 return true; |
112 } | 110 } |
113 | 111 |
114 void InterceptingResourceHandler::OnReadCompleted( | 112 void InterceptingResourceHandler::OnReadCompleted( |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 int size = 0; | 277 int size = 0; |
280 if (first_read_buffer_) { | 278 if (first_read_buffer_) { |
281 // |first_read_buffer_| is a buffer gotten from |next_handler_| via | 279 // |first_read_buffer_| is a buffer gotten from |next_handler_| via |
282 // OnWillRead. Use the buffer. | 280 // OnWillRead. Use the buffer. |
283 buffer = first_read_buffer_; | 281 buffer = first_read_buffer_; |
284 size = first_read_buffer_size_; | 282 size = first_read_buffer_size_; |
285 | 283 |
286 first_read_buffer_ = nullptr; | 284 first_read_buffer_ = nullptr; |
287 first_read_buffer_size_ = 0; | 285 first_read_buffer_size_ = 0; |
288 } else { | 286 } else { |
289 if (!next_handler_->OnWillRead(&buffer, &size, -1)) { | 287 if (!next_handler_->OnWillRead(&buffer, &size)) { |
290 Cancel(); | 288 Cancel(); |
291 return; | 289 return; |
292 } | 290 } |
293 } | 291 } |
294 | 292 |
295 size = std::min(size, static_cast<int>(payload_for_old_handler_.size() - | 293 size = std::min(size, static_cast<int>(payload_for_old_handler_.size() - |
296 payload_bytes_written_)); | 294 payload_bytes_written_)); |
297 memcpy(buffer->data(), | 295 memcpy(buffer->data(), |
298 payload_for_old_handler_.data() + payload_bytes_written_, size); | 296 payload_for_old_handler_.data() + payload_bytes_written_, size); |
299 payload_bytes_written_ += size; | 297 payload_bytes_written_ += size; |
(...skipping 11 matching lines...) Expand all Loading... |
311 | 309 |
312 if (first_read_buffer_bytes_written_ == first_read_buffer_bytes_read_) { | 310 if (first_read_buffer_bytes_written_ == first_read_buffer_bytes_read_) { |
313 state_ = State::PASS_THROUGH; | 311 state_ = State::PASS_THROUGH; |
314 first_read_buffer_double_ = nullptr; | 312 first_read_buffer_double_ = nullptr; |
315 ResumeInternal(); | 313 ResumeInternal(); |
316 return; | 314 return; |
317 } | 315 } |
318 | 316 |
319 scoped_refptr<net::IOBuffer> buf; | 317 scoped_refptr<net::IOBuffer> buf; |
320 int size = 0; | 318 int size = 0; |
321 if (!next_handler_->OnWillRead(&buf, &size, -1)) { | 319 if (!next_handler_->OnWillRead(&buf, &size)) { |
322 Cancel(); | 320 Cancel(); |
323 return; | 321 return; |
324 } | 322 } |
325 size = std::min(size, static_cast<int>(first_read_buffer_bytes_read_ - | 323 size = std::min(size, static_cast<int>(first_read_buffer_bytes_read_ - |
326 first_read_buffer_bytes_written_)); | 324 first_read_buffer_bytes_written_)); |
327 memcpy(buf->data(), | 325 memcpy(buf->data(), |
328 first_read_buffer_double_->data() + first_read_buffer_bytes_written_, | 326 first_read_buffer_double_->data() + first_read_buffer_bytes_written_, |
329 size); | 327 size); |
330 first_read_buffer_bytes_written_ += size; | 328 first_read_buffer_bytes_written_ += size; |
331 next_handler_->OnReadCompleted(size, base::MakeUnique<Controller>(this)); | 329 next_handler_->OnReadCompleted(size, base::MakeUnique<Controller>(this)); |
332 } | 330 } |
333 | 331 |
334 } // namespace content | 332 } // namespace content |
OLD | NEW |