aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/tests
diff options
context:
space:
mode:
authorCristian Brinza <cristianb@gmail.com>2024-10-02 19:59:31 +0300
committerGitHub <noreply@github.com>2024-10-02 16:59:31 +0000
commitc7a4e4f627f0bf331cedc1700ddeb92ffcba4e78 (patch)
tree4622a8ca7f541c2ccd9083cbefbfe8cbe0698cde /components/net/tests
parentc682172440e2010ddd7e225463e81ddb175ebd81 (diff)
downloadservo-c7a4e4f627f0bf331cedc1700ddeb92ffcba4e78.tar.gz
servo-c7a4e4f627f0bf331cedc1700ddeb92ffcba4e78.zip
net: Refactor `Decoder` (#33611)
* Refactor Decoder to be fully async Signed-off-by: crbrz <cristianb@gmail.com> * Update WPT results Signed-off-by: crbrz <cristianb@gmail.com> * Fix deflate unit test Signed-off-by: crbrz <cristianb@gmail.com> * Add compressed response update count test Signed-off-by: crbrz <cristianb@gmail.com> * Fix typo Signed-off-by: crbrz <cristianb@gmail.com> * Source error check without conversion to String Signed-off-by: crbrz <cristianb@gmail.com> * Simplify error check Signed-off-by: crbrz <cristianb@gmail.com> * Fix variable name Signed-off-by: crbrz <cristianb@gmail.com> * Added TODO note for network.tls.ignore_unexpected_eof Signed-off-by: crbrz <cristianb@gmail.com> --------- Signed-off-by: crbrz <cristianb@gmail.com>
Diffstat (limited to 'components/net/tests')
-rw-r--r--components/net/tests/http_loader.rs79
1 files changed, 72 insertions, 7 deletions
diff --git a/components/net/tests/http_loader.rs b/components/net/tests/http_loader.rs
index c56618833aa..11b31c87606 100644
--- a/components/net/tests/http_loader.rs
+++ b/components/net/tests/http_loader.rs
@@ -13,12 +13,12 @@ use std::time::Duration;
use base::id::TEST_PIPELINE_ID;
use cookie::Cookie as CookiePair;
-use crossbeam_channel::{unbounded, Receiver};
+use crossbeam_channel::{unbounded, Receiver, Sender};
use devtools_traits::{
ChromeToDevtoolsControlMsg, DevtoolsControlMsg, HttpRequest as DevtoolsHttpRequest,
HttpResponse as DevtoolsHttpResponse, NetworkEvent,
};
-use flate2::write::{DeflateEncoder, GzEncoder};
+use flate2::write::{GzEncoder, ZlibEncoder};
use flate2::Compression;
use headers::authorization::Basic;
use headers::{
@@ -32,17 +32,19 @@ use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use net::cookie::ServoCookie;
use net::cookie_storage::CookieStorage;
+use net::fetch::methods::{self};
use net::http_loader::determine_requests_referrer;
use net::resource_thread::AuthCacheEntry;
-use net::test::replace_host_table;
+use net::test::{replace_host_table, DECODER_BUFFER_SIZE};
use net_traits::http_status::HttpStatus;
use net_traits::request::{
BodyChunkRequest, BodyChunkResponse, BodySource, CredentialsMode, Destination, Referrer,
- RequestBody, RequestBuilder,
+ Request, RequestBody, RequestBuilder,
};
-use net_traits::response::ResponseBody;
-use net_traits::{CookieSource, NetworkError, ReferrerPolicy};
+use net_traits::response::{Response, ResponseBody};
+use net_traits::{CookieSource, FetchTaskTarget, NetworkError, ReferrerPolicy};
use servo_url::{ImmutableOrigin, ServoUrl};
+use tokio_test::block_on;
use crate::{fetch, fetch_with_context, make_server, new_fetch_context};
@@ -437,7 +439,7 @@ fn test_load_should_decode_the_response_as_deflate_when_response_headers_have_co
header::CONTENT_ENCODING,
HeaderValue::from_static("deflate"),
);
- let mut e = DeflateEncoder::new(Vec::new(), Compression::default());
+ let mut e = ZlibEncoder::new(Vec::new(), Compression::default());
e.write(b"Yay!").unwrap();
let encoded_content = e.finish().unwrap();
*response.body_mut() = encoded_content.into();
@@ -1356,3 +1358,66 @@ fn test_determine_requests_referrer_longer_than_4k() {
assert_eq!(referer.unwrap().as_str(), "http://example.com/");
}
+
+#[test]
+fn test_fetch_compressed_response_update_count() {
+ // contents of ../../tests/wpt/tests/fetch/content-encoding/br/resources/foo.text.br
+ const DATA_BROTLI_COMPRESSED: [u8; 15] = [
+ 0xe1, 0x18, 0x48, 0xc1, 0x2f, 0x65, 0xf6, 0x16, 0x9f, 0x05, 0x01, 0xbb, 0x20, 0x00, 0x06,
+ ];
+ const DATA_DECOMPRESSED_LEN: usize = 10500;
+
+ let handler = move |_: HyperRequest<Body>, response: &mut HyperResponse<Body>| {
+ response
+ .headers_mut()
+ .insert(header::CONTENT_ENCODING, HeaderValue::from_static("br"));
+ *response.body_mut() = DATA_BROTLI_COMPRESSED.to_vec().into();
+ };
+ let (server, url) = make_server(handler);
+
+ let mut request = RequestBuilder::new(url.clone(), Referrer::NoReferrer)
+ .method(Method::GET)
+ .body(None)
+ .destination(Destination::Document)
+ .origin(mock_origin())
+ .pipeline_id(Some(TEST_PIPELINE_ID))
+ .build();
+
+ struct FetchResponseCollector {
+ sender: Sender<usize>,
+ update_count: usize,
+ }
+ impl FetchTaskTarget for FetchResponseCollector {
+ fn process_request_body(&mut self, _: &Request) {}
+ fn process_request_eof(&mut self, _: &Request) {}
+ fn process_response(&mut self, _: &Response) {}
+ fn process_response_chunk(&mut self, _: Vec<u8>) {
+ self.update_count += 1;
+ }
+ /// Fired when the response is fully fetched
+ fn process_response_eof(&mut self, _: &Response) {
+ let _ = self.sender.send(self.update_count);
+ }
+ }
+
+ let (sender, receiver) = unbounded();
+ let mut target = FetchResponseCollector {
+ sender: sender,
+ update_count: 0,
+ };
+ let response_update_count = block_on(async move {
+ methods::fetch(
+ &mut request,
+ &mut target,
+ &mut new_fetch_context(None, None, None),
+ )
+ .await;
+ receiver.recv().unwrap()
+ });
+
+ server.close();
+
+ const EXPECTED_UPDATE_COUNT: usize =
+ (DATA_DECOMPRESSED_LEN + DECODER_BUFFER_SIZE - 1) / DECODER_BUFFER_SIZE;
+ assert_eq!(response_update_count, EXPECTED_UPDATE_COUNT);
+}