Index: remoting/client/plugin/pepper_url_request.cc |
diff --git a/remoting/client/plugin/pepper_url_request.cc b/remoting/client/plugin/pepper_url_request.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43322d482aa25a9b2ce8770dd6f026c33838f768 |
--- /dev/null |
+++ b/remoting/client/plugin/pepper_url_request.cc |
@@ -0,0 +1,101 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "remoting/client/plugin/pepper_url_request.h" |
+ |
+#include "base/callback_helpers.h" |
+#include "base/logging.h" |
+#include "ppapi/cpp/url_response_info.h" |
+ |
+// Read buffer we allocate per read when reading response from |
+// URLLoader. |
+static const int kReadSize = 1024; |
+ |
+namespace remoting { |
+ |
+PepperUrlRequest::PepperUrlRequest(pp::InstanceHandle pp_instance, |
+ const std::string& url) |
+ : request_info_(pp_instance), |
+ url_loader_(pp_instance), |
+ url_(url), |
+ callback_factory_(this) { |
+ request_info_.SetMethod("GET"); |
+ request_info_.SetURL(url); |
+} |
+ |
+PepperUrlRequest::~PepperUrlRequest() {} |
+ |
+void PepperUrlRequest::AddHeader(const std::string& value) { |
+ headers_ += value + "\n\r"; |
+} |
+ |
+void PepperUrlRequest::Start(const OnResultCallback& on_result_callback) { |
+ on_result_callback_ = on_result_callback; |
+ |
+ request_info_.SetHeaders(headers_); |
+ int result = url_loader_.Open( |
+ request_info_, |
+ callback_factory_.NewCallback(&PepperUrlRequest::OnUrlOpened)); |
+ DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); |
+} |
+ |
+void PepperUrlRequest::OnUrlOpened(int32_t result) { |
+ if (result == PP_ERROR_ABORTED) { |
+ return; |
+ } |
+ |
+ if (result < 0) { |
+ LOG(WARNING) << "pp::URLLoader for " << url_ << " failed: " << result; |
+ base::ResetAndReturn(&on_result_callback_).Run(Result::Failed()); |
+ return; |
+ } |
+ |
+ ReadResponseBody(); |
+} |
+ |
+void PepperUrlRequest::ReadResponseBody() { |
+ int pos = response_.size(); |
+ response_.resize(pos + kReadSize); |
+ int result = url_loader_.ReadResponseBody( |
+ &response_[pos], kReadSize, |
+ callback_factory_.NewCallback(&PepperUrlRequest::OnResponseBodyRead)); |
+ DCHECK_EQ(result, PP_OK_COMPLETIONPENDING); |
+} |
+ |
+void PepperUrlRequest::OnResponseBodyRead(int32_t result) { |
+ if (result == PP_ERROR_ABORTED) |
+ return; |
+ |
+ if (result < 0) { |
+ LOG(WARNING) << "Failed to read HTTP response body when fetching " |
+ << url_ << ", error: " << result; |
+ base::ResetAndReturn(&on_result_callback_).Run(Result::Failed()); |
+ return; |
+ } |
+ |
+ // Resize the buffer in case we've read less than was requested. |
+ CHECK_LE(result, kReadSize); |
+ CHECK_GE(static_cast<int>(response_.size()), kReadSize); |
+ response_.resize(response_.size() - kReadSize + result); |
+ |
+ // Try to read again if there is more data to read. |
+ if (result > 0) { |
+ ReadResponseBody(); |
+ return; |
+ } |
+ |
+ base::ResetAndReturn(&on_result_callback_) |
+ .Run(Result(url_loader_.GetResponseInfo().GetStatusCode(), response_)); |
+} |
+ |
+PepperUrlRequestFactory::PepperUrlRequestFactory(pp::InstanceHandle pp_instance) |
+ : pp_instance_(pp_instance) {} |
+PepperUrlRequestFactory::~PepperUrlRequestFactory() {} |
+ |
+scoped_ptr<UrlRequest> PepperUrlRequestFactory::CreateUrlRequest( |
+ const std::string& url) { |
+ return make_scoped_ptr(new PepperUrlRequest(pp_instance_, url)); |
+} |
+ |
+} // namespace remoting |