OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "remoting/client/plugin/pepper_url_request.h" |
| 6 |
| 7 #include "base/callback_helpers.h" |
| 8 #include "ppapi/cpp/url_response_info.h" |
| 9 |
| 10 // Read buffer we allocate per read when reading response from |
| 11 // URLLoader. |
| 12 static const int kReadSize = 1024; |
| 13 |
| 14 namespace remoting { |
| 15 |
| 16 PepperUrlRequest::PepperUrlRequest(pp::InstanceHandle pp_instance, |
| 17 const std::string& url) |
| 18 : request_info_(pp_instance), |
| 19 url_loader_(pp_instance), |
| 20 url_(url), |
| 21 callback_factory_(this) { |
| 22 request_info_.SetMethod("GET"); |
| 23 request_info_.SetURL(url); |
| 24 } |
| 25 |
| 26 PepperUrlRequest::~PepperUrlRequest() {} |
| 27 |
| 28 void PepperUrlRequest::AddHeader(const std::string& value) { |
| 29 headers_ += value + "\n\r"; |
| 30 } |
| 31 |
| 32 void PepperUrlRequest::Start(const OnResultCallback& on_result_callback) { |
| 33 on_result_callback_ = on_result_callback; |
| 34 |
| 35 request_info_.SetHeaders(headers_); |
| 36 int result = url_loader_.Open( |
| 37 request_info_, |
| 38 callback_factory_.NewCallback(&PepperUrlRequest::OnUrlOpened)); |
| 39 DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); |
| 40 } |
| 41 |
| 42 void PepperUrlRequest::OnUrlOpened(int32_t result) { |
| 43 if (result == PP_ERROR_ABORTED) { |
| 44 return; |
| 45 } |
| 46 |
| 47 if (result < 0) { |
| 48 LOG(WARNING) << "pp::URLLoader for " << url_ << " failed: " << result; |
| 49 base::ResetAndReturn(&on_result_callback_).Run(Result::Failed()); |
| 50 return; |
| 51 } |
| 52 |
| 53 ReadResponseBody(); |
| 54 } |
| 55 |
| 56 void PepperUrlRequest::ReadResponseBody() { |
| 57 int pos = response_.size(); |
| 58 response_.resize(pos + kReadSize); |
| 59 int result = url_loader_.ReadResponseBody( |
| 60 &response_[pos], kReadSize, |
| 61 callback_factory_.NewCallback(&PepperUrlRequest::OnResponseBodyRead)); |
| 62 DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); |
| 63 } |
| 64 |
| 65 void PepperUrlRequest::OnResponseBodyRead(int32_t result) { |
| 66 if (result == PP_ERROR_ABORTED) |
| 67 return; |
| 68 |
| 69 if (result < 0) { |
| 70 LOG(WARNING) << "Failed to read HTTP response body when fetching " |
| 71 << url_ << ", error: " << result; |
| 72 base::ResetAndReturn(&on_result_callback_).Run(Result::Failed()); |
| 73 return; |
| 74 } |
| 75 |
| 76 // Resize the buffer in case we've read less than was requested. |
| 77 CHECK_LE(result, kReadSize); |
| 78 CHECK_GE(static_cast<int>(response_.size()), kReadSize); |
| 79 response_.resize(response_.size() - kReadSize + result); |
| 80 |
| 81 // Try to read again if there is more data to read. |
| 82 if (result > 0) { |
| 83 ReadResponseBody(); |
| 84 return; |
| 85 } |
| 86 |
| 87 base::ResetAndReturn(&on_result_callback_) |
| 88 .Run(Result(url_loader_.GetResponseInfo().GetStatusCode(), response_)); |
| 89 } |
| 90 |
| 91 PepperUrlRequestFactory::PepperUrlRequestFactory(pp::InstanceHandle pp_instance) |
| 92 : pp_instance_(pp_instance) {} |
| 93 PepperUrlRequestFactory::~PepperUrlRequestFactory() {} |
| 94 |
| 95 scoped_ptr<UrlRequest> PepperUrlRequestFactory::CreateUrlRequest( |
| 96 const std::string& url) { |
| 97 return make_scoped_ptr(new PepperUrlRequest(pp_instance_, url)); |
| 98 } |
| 99 |
| 100 } // namespace remoting |
OLD | NEW |