OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/child/web_url_loader_impl.h" | 5 #include "content/child/web_url_loader_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <string.h> | 8 #include <string.h> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 const char kTestData[] = "blah!"; | 46 const char kTestData[] = "blah!"; |
47 | 47 |
48 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir"; | 48 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir"; |
49 // Simple FTP directory listing. Tests are not concerned with correct parsing, | 49 // Simple FTP directory listing. Tests are not concerned with correct parsing, |
50 // but rather correct cleanup when deleted while parsing. Important details of | 50 // but rather correct cleanup when deleted while parsing. Important details of |
51 // this list are that it contains more than one entry that are not "." or "..". | 51 // this list are that it contains more than one entry that are not "." or "..". |
52 const char kFtpDirListing[] = | 52 const char kFtpDirListing[] = |
53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n" | 53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n" |
54 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat"; | 54 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat"; |
55 | 55 |
56 const char kMultipartResponseMimeType[] = "multipart/x-mixed-replace"; | |
57 const char kMultipartResponseHeaders[] = | |
58 "HTTP/1.0 200 Peachy\r\n" | |
59 "Content-Type: multipart/x-mixed-replace; boundary=boundary\r\n\r\n"; | |
60 // Simple multipart response. Imporant details for the tests are that it | |
61 // contains multiple chunks, and that it doesn't end with a boundary, so will | |
62 // send data in OnResponseComplete. Also, it will resolve to kTestData. | |
63 const char kMultipartResponse[] = | |
64 "--boundary\n" | |
65 "Content-type: text/html\n\n" | |
66 "bl" | |
67 "--boundary\n" | |
68 "Content-type: text/html\n\n" | |
69 "ah!"; | |
70 | |
71 class TestResourceDispatcher : public ResourceDispatcher { | 56 class TestResourceDispatcher : public ResourceDispatcher { |
72 public: | 57 public: |
73 TestResourceDispatcher() : | 58 TestResourceDispatcher() : |
74 ResourceDispatcher(nullptr, nullptr), | 59 ResourceDispatcher(nullptr, nullptr), |
75 canceled_(false) { | 60 canceled_(false) { |
76 } | 61 } |
77 | 62 |
78 ~TestResourceDispatcher() override {} | 63 ~TestResourceDispatcher() override {} |
79 | 64 |
80 // TestDispatcher implementation: | 65 // TestDispatcher implementation: |
(...skipping 29 matching lines...) Expand all Loading... |
110 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher); | 95 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher); |
111 }; | 96 }; |
112 | 97 |
113 class TestWebURLLoaderClient : public blink::WebURLLoaderClient { | 98 class TestWebURLLoaderClient : public blink::WebURLLoaderClient { |
114 public: | 99 public: |
115 TestWebURLLoaderClient(ResourceDispatcher* dispatcher, | 100 TestWebURLLoaderClient(ResourceDispatcher* dispatcher, |
116 scoped_refptr<scheduler::TaskQueue> task_runner) | 101 scoped_refptr<scheduler::TaskQueue> task_runner) |
117 : loader_(new WebURLLoaderImpl( | 102 : loader_(new WebURLLoaderImpl( |
118 dispatcher, | 103 dispatcher, |
119 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))), | 104 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))), |
120 expect_multipart_response_(false), | |
121 delete_on_receive_redirect_(false), | 105 delete_on_receive_redirect_(false), |
122 delete_on_receive_response_(false), | 106 delete_on_receive_response_(false), |
123 delete_on_receive_data_(false), | 107 delete_on_receive_data_(false), |
124 delete_on_finish_(false), | 108 delete_on_finish_(false), |
125 delete_on_fail_(false), | 109 delete_on_fail_(false), |
126 did_receive_redirect_(false), | 110 did_receive_redirect_(false), |
127 did_receive_response_(false), | 111 did_receive_response_(false), |
128 did_finish_(false) {} | 112 did_finish_(false) {} |
129 | 113 |
130 ~TestWebURLLoaderClient() override {} | 114 ~TestWebURLLoaderClient() override {} |
(...skipping 18 matching lines...) Expand all Loading... |
149 unsigned long long totalBytesToBeSent) override { | 133 unsigned long long totalBytesToBeSent) override { |
150 EXPECT_TRUE(loader_); | 134 EXPECT_TRUE(loader_); |
151 EXPECT_EQ(loader_.get(), loader); | 135 EXPECT_EQ(loader_.get(), loader); |
152 } | 136 } |
153 | 137 |
154 void didReceiveResponse( | 138 void didReceiveResponse( |
155 blink::WebURLLoader* loader, | 139 blink::WebURLLoader* loader, |
156 const blink::WebURLResponse& response) override { | 140 const blink::WebURLResponse& response) override { |
157 EXPECT_TRUE(loader_); | 141 EXPECT_TRUE(loader_); |
158 EXPECT_EQ(loader_.get(), loader); | 142 EXPECT_EQ(loader_.get(), loader); |
159 | 143 EXPECT_FALSE(did_receive_response_); |
160 // Only multipart requests may receive multiple response headers. | |
161 EXPECT_TRUE(expect_multipart_response_ || !did_receive_response_); | |
162 | 144 |
163 did_receive_response_ = true; | 145 did_receive_response_ = true; |
164 response_ = response; | 146 response_ = response; |
165 if (delete_on_receive_response_) | 147 if (delete_on_receive_response_) |
166 loader_.reset(); | 148 loader_.reset(); |
167 } | 149 } |
168 | 150 |
169 void didDownloadData(blink::WebURLLoader* loader, | 151 void didDownloadData(blink::WebURLLoader* loader, |
170 int dataLength, | 152 int dataLength, |
171 int encodedDataLength) override { | 153 int encodedDataLength) override { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 201 |
220 if (delete_on_fail_) | 202 if (delete_on_fail_) |
221 loader_.reset(); | 203 loader_.reset(); |
222 } | 204 } |
223 | 205 |
224 WebURLLoaderImpl* loader() { return loader_.get(); } | 206 WebURLLoaderImpl* loader() { return loader_.get(); } |
225 void DeleteLoader() { | 207 void DeleteLoader() { |
226 loader_.reset(); | 208 loader_.reset(); |
227 } | 209 } |
228 | 210 |
229 void set_expect_multipart_response() { expect_multipart_response_ = true; } | |
230 | |
231 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } | 211 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } |
232 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } | 212 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } |
233 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } | 213 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } |
234 void set_delete_on_finish() { delete_on_finish_ = true; } | 214 void set_delete_on_finish() { delete_on_finish_ = true; } |
235 void set_delete_on_fail() { delete_on_fail_ = true; } | 215 void set_delete_on_fail() { delete_on_fail_ = true; } |
236 | 216 |
237 bool did_receive_redirect() const { return did_receive_redirect_; } | 217 bool did_receive_redirect() const { return did_receive_redirect_; } |
238 bool did_receive_response() const { return did_receive_response_; } | 218 bool did_receive_response() const { return did_receive_response_; } |
239 const std::string& received_data() const { return received_data_; } | 219 const std::string& received_data() const { return received_data_; } |
240 bool did_finish() const { return did_finish_; } | 220 bool did_finish() const { return did_finish_; } |
241 const blink::WebURLError& error() const { return error_; } | 221 const blink::WebURLError& error() const { return error_; } |
242 const blink::WebURLResponse& response() const { return response_; } | 222 const blink::WebURLResponse& response() const { return response_; } |
243 | 223 |
244 private: | 224 private: |
245 scoped_ptr<WebURLLoaderImpl> loader_; | 225 scoped_ptr<WebURLLoaderImpl> loader_; |
246 | 226 |
247 bool expect_multipart_response_; | |
248 | |
249 bool delete_on_receive_redirect_; | 227 bool delete_on_receive_redirect_; |
250 bool delete_on_receive_response_; | 228 bool delete_on_receive_response_; |
251 bool delete_on_receive_data_; | 229 bool delete_on_receive_data_; |
252 bool delete_on_finish_; | 230 bool delete_on_finish_; |
253 bool delete_on_fail_; | 231 bool delete_on_fail_; |
254 | 232 |
255 bool did_receive_redirect_; | 233 bool did_receive_redirect_; |
256 bool did_receive_response_; | 234 bool did_receive_response_; |
257 std::string received_data_; | 235 std::string received_data_; |
258 bool did_finish_; | 236 bool did_finish_; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 EXPECT_TRUE(client()->did_receive_response()); | 315 EXPECT_TRUE(client()->did_receive_response()); |
338 } | 316 } |
339 | 317 |
340 void DoReceiveDataFtp() { | 318 void DoReceiveDataFtp() { |
341 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( | 319 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( |
342 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); | 320 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); |
343 // The FTP delegate should modify the data the client sees. | 321 // The FTP delegate should modify the data the client sees. |
344 EXPECT_NE(kFtpDirListing, client()->received_data()); | 322 EXPECT_NE(kFtpDirListing, client()->received_data()); |
345 } | 323 } |
346 | 324 |
347 void DoReceiveResponseMultipart() { | |
348 EXPECT_FALSE(client()->did_receive_response()); | |
349 content::ResourceResponseInfo response_info; | |
350 response_info.headers = new net::HttpResponseHeaders( | |
351 net::HttpUtil::AssembleRawHeaders(kMultipartResponseHeaders, | |
352 strlen(kMultipartResponseHeaders))); | |
353 response_info.mime_type = kMultipartResponseMimeType; | |
354 peer()->OnReceivedResponse(response_info); | |
355 EXPECT_TRUE(client()->did_receive_response()); | |
356 } | |
357 | |
358 void DoReceiveDataMultipart() { | |
359 peer()->OnReceivedData(make_scoped_ptr( | |
360 new FixedReceivedData(kMultipartResponse, strlen(kMultipartResponse), | |
361 strlen(kMultipartResponse)))); | |
362 // Multipart delegate should modify the data the client sees. | |
363 EXPECT_NE(kMultipartResponse, client()->received_data()); | |
364 } | |
365 | |
366 TestWebURLLoaderClient* client() { return client_.get(); } | 325 TestWebURLLoaderClient* client() { return client_.get(); } |
367 TestResourceDispatcher* dispatcher() { return &dispatcher_; } | 326 TestResourceDispatcher* dispatcher() { return &dispatcher_; } |
368 RequestPeer* peer() { return dispatcher()->peer(); } | 327 RequestPeer* peer() { return dispatcher()->peer(); } |
369 base::MessageLoop* message_loop() { return &message_loop_; } | 328 base::MessageLoop* message_loop() { return &message_loop_; } |
370 | 329 |
371 private: | 330 private: |
372 base::MessageLoop message_loop_; | 331 base::MessageLoop message_loop_; |
373 // WorkerScheduler is needed because WebURLLoaderImpl needs a | 332 // WorkerScheduler is needed because WebURLLoaderImpl needs a |
374 // scheduler::TaskQueue. | 333 // scheduler::TaskQueue. |
375 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; | 334 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 } | 548 } |
590 | 549 |
591 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { | 550 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { |
592 client()->set_delete_on_fail(); | 551 client()->set_delete_on_fail(); |
593 DoStartAsyncRequest(); | 552 DoStartAsyncRequest(); |
594 DoReceiveResponseFtp(); | 553 DoReceiveResponseFtp(); |
595 DoReceiveDataFtp(); | 554 DoReceiveDataFtp(); |
596 DoFailRequest(); | 555 DoFailRequest(); |
597 } | 556 } |
598 | 557 |
599 // Multipart integration tests. These are focused more on safe deletion than | |
600 // correct parsing of Multipart responses. | |
601 | |
602 TEST_F(WebURLLoaderImplTest, Multipart) { | |
603 client()->set_expect_multipart_response(); | |
604 DoStartAsyncRequest(); | |
605 DoReceiveResponseMultipart(); | |
606 DoReceiveDataMultipart(); | |
607 DoCompleteRequest(); | |
608 EXPECT_EQ(kTestData, client()->received_data()); | |
609 EXPECT_FALSE(dispatcher()->canceled()); | |
610 } | |
611 | |
612 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstResponse) { | |
613 client()->set_expect_multipart_response(); | |
614 client()->set_delete_on_receive_response(); | |
615 DoStartAsyncRequest(); | |
616 DoReceiveResponseMultipart(); | |
617 EXPECT_EQ("", client()->received_data()); | |
618 } | |
619 | |
620 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveSecondResponse) { | |
621 client()->set_expect_multipart_response(); | |
622 DoStartAsyncRequest(); | |
623 DoReceiveResponseMultipart(); | |
624 client()->set_delete_on_receive_response(); | |
625 DoReceiveDataMultipart(); | |
626 EXPECT_EQ("", client()->received_data()); | |
627 } | |
628 | |
629 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstData) { | |
630 client()->set_expect_multipart_response(); | |
631 client()->set_delete_on_receive_data(); | |
632 DoStartAsyncRequest(); | |
633 DoReceiveResponseMultipart(); | |
634 DoReceiveDataMultipart(); | |
635 EXPECT_EQ("bl", client()->received_data()); | |
636 } | |
637 | |
638 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveMoreData) { | |
639 client()->set_expect_multipart_response(); | |
640 DoStartAsyncRequest(); | |
641 DoReceiveResponseMultipart(); | |
642 DoReceiveDataMultipart(); | |
643 // For multipart responses, the delegate may send some data when notified | |
644 // of a request completing. | |
645 client()->set_delete_on_receive_data(); | |
646 peer()->OnCompletedRequest(net::OK, false, false, "", base::TimeTicks(), | |
647 strlen(kTestData)); | |
648 EXPECT_FALSE(client()->did_finish()); | |
649 EXPECT_EQ(kTestData, client()->received_data()); | |
650 } | |
651 | |
652 TEST_F(WebURLLoaderImplTest, MultipartDeleteFinish) { | |
653 client()->set_expect_multipart_response(); | |
654 client()->set_delete_on_finish(); | |
655 DoStartAsyncRequest(); | |
656 DoReceiveResponseMultipart(); | |
657 DoReceiveDataMultipart(); | |
658 DoCompleteRequest(); | |
659 EXPECT_EQ(kTestData, client()->received_data()); | |
660 } | |
661 | |
662 TEST_F(WebURLLoaderImplTest, MultipartDeleteFail) { | |
663 client()->set_expect_multipart_response(); | |
664 client()->set_delete_on_fail(); | |
665 DoStartAsyncRequest(); | |
666 DoReceiveResponseMultipart(); | |
667 DoReceiveDataMultipart(); | |
668 DoFailRequest(); | |
669 } | |
670 | |
671 // PlzNavigate: checks that the stream override parameters provided on | 558 // PlzNavigate: checks that the stream override parameters provided on |
672 // navigation commit are properly applied. | 559 // navigation commit are properly applied. |
673 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { | 560 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { |
674 // Initialize the request and the stream override. | 561 // Initialize the request and the stream override. |
675 const GURL kNavigationURL = GURL(kTestURL); | 562 const GURL kNavigationURL = GURL(kTestURL); |
676 const GURL kStreamURL = GURL("http://bar"); | 563 const GURL kStreamURL = GURL("http://bar"); |
677 const std::string kMimeType = "text/html"; | 564 const std::string kMimeType = "text/html"; |
678 blink::WebURLRequest request; | 565 blink::WebURLRequest request; |
679 request.initialize(); | 566 request.initialize(); |
680 request.setURL(kNavigationURL); | 567 request.setURL(kNavigationURL); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
733 info.socket_address = net::HostPortPair(test.ip, 443); | 620 info.socket_address = net::HostPortPair(test.ip, 443); |
734 blink::WebURLResponse response; | 621 blink::WebURLResponse response; |
735 response.initialize(); | 622 response.initialize(); |
736 WebURLLoaderImpl::PopulateURLResponse(url, info, &response, true); | 623 WebURLLoaderImpl::PopulateURLResponse(url, info, &response, true); |
737 EXPECT_EQ(test.expected, response.remoteIPAddress().utf8()); | 624 EXPECT_EQ(test.expected, response.remoteIPAddress().utf8()); |
738 }; | 625 }; |
739 } | 626 } |
740 | 627 |
741 } // namespace | 628 } // namespace |
742 } // namespace content | 629 } // namespace content |
OLD | NEW |