Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: remoting/client/plugin/pepper_url_request.cc

Issue 1679023009: Add remoting::UrlRequest interface with 2 implementations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698