mirror of
https://github.com/telemt/telemt.git
synced 2026-09-05 18:16:06 +03:00
Compat Bootstrap Literal for iOS
Co-Authored-By: brekotis <93345790+brekotis@users.noreply.github.com>
This commit is contained in:
+27
-1
@@ -54,7 +54,7 @@ const DOCUMENT: &str = r##"<!doctype html>
|
|||||||
<script nonce="__NONCE__">
|
<script nonce="__NONCE__">
|
||||||
(()=>{
|
(()=>{
|
||||||
'use strict';
|
'use strict';
|
||||||
const relayOrigin='https://__HOST__',bootstrap='__BOOTSTRAP__',carrier='__CARRIER__';
|
const relayOrigin='https://__HOST__',bootstrap="__BOOTSTRAP__",carrier='__CARRIER__';
|
||||||
const batchLimit=__BATCH_LIMIT__,queueLimit=__QUEUE_LIMIT__,queueItemLimit=__QUEUE_ITEMS__;
|
const batchLimit=__BATCH_LIMIT__,queueLimit=__QUEUE_LIMIT__,queueItemLimit=__QUEUE_ITEMS__;
|
||||||
const laneQueueLimit=Math.min(queueLimit,8388608),laneItemLimit=Math.min(queueItemLimit,1024),closedLaneLimit=4096;
|
const laneQueueLimit=Math.min(queueLimit,8388608),laneItemLimit=Math.min(queueItemLimit,1024),closedLaneLimit=4096;
|
||||||
const fragment=location.hash,androidNonce=/^#android=([A-Za-z0-9_-]{43})$/.exec(fragment)?.[1]||'';
|
const fragment=location.hash,androidNonce=/^#android=([A-Za-z0-9_-]{43})$/.exec(fragment)?.[1]||'';
|
||||||
@@ -331,4 +331,30 @@ mod tests {
|
|||||||
.contains("frame-ancestors http://127.0.0.1:*")
|
.contains("frame-ancestors http://127.0.0.1:*")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rendered_page_is_parseable_by_ios_native_carrier() {
|
||||||
|
let bootstrap = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
|
||||||
|
let page = render(
|
||||||
|
"proxy.example.com",
|
||||||
|
bootstrap,
|
||||||
|
2 * 1024 * 1024,
|
||||||
|
32 * 1024 * 1024,
|
||||||
|
16 * 1024,
|
||||||
|
WebCarrier::Https,
|
||||||
|
&SecureRandom::new(),
|
||||||
|
);
|
||||||
|
let accepted_shapes = [
|
||||||
|
format!("const bootstrap=\"{bootstrap}\""),
|
||||||
|
format!("const bootstrap='{bootstrap}'"),
|
||||||
|
format!("bootstrap=\"{bootstrap}\""),
|
||||||
|
];
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
accepted_shapes
|
||||||
|
.iter()
|
||||||
|
.any(|shape| page.body.contains(shape)),
|
||||||
|
"the iOS native carrier cannot parse a comma-declared single-quoted bootstrap"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-14
@@ -131,8 +131,8 @@ async fn https_carrier_bootstraps_and_closes_one_session() {
|
|||||||
assert!(root_headers.starts_with(b"HTTP/1.1 200"));
|
assert!(root_headers.starts_with(b"HTTP/1.1 200"));
|
||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(bootstrap.len(), 43);
|
assert_eq!(bootstrap.len(), 43);
|
||||||
@@ -184,7 +184,7 @@ async fn https_carrier_bootstraps_and_closes_one_session() {
|
|||||||
assert!(
|
assert!(
|
||||||
next_root_body
|
next_root_body
|
||||||
.windows(11)
|
.windows(11)
|
||||||
.any(|value| value == b"bootstrap='")
|
.any(|value| value == b"bootstrap=\"")
|
||||||
);
|
);
|
||||||
assert!(
|
assert!(
|
||||||
next_root_body
|
next_root_body
|
||||||
@@ -226,7 +226,7 @@ async fn rejected_bridge_bootstrap_falls_back_to_uncacheable_static_index() {
|
|||||||
|
|
||||||
let first_response = request(&listener, &runtime, bridge_request()).await;
|
let first_response = request(&listener, &runtime, bridge_request()).await;
|
||||||
let (_, first_body) = split_response(&first_response);
|
let (_, first_body) = split_response(&first_response);
|
||||||
assert!(first_body.windows(11).any(|value| value == b"bootstrap='"));
|
assert!(first_body.windows(11).any(|value| value == b"bootstrap=\""));
|
||||||
|
|
||||||
let fallback_response = request(&listener, &runtime, bridge_request()).await;
|
let fallback_response = request(&listener, &runtime, bridge_request()).await;
|
||||||
let (fallback_headers, fallback_body) = split_response(&fallback_response);
|
let (fallback_headers, fallback_body) = split_response(&fallback_response);
|
||||||
@@ -255,8 +255,8 @@ async fn bootstrap_survives_client_address_family_change() {
|
|||||||
let (_, root_body) = split_response(&root_response);
|
let (_, root_body) = split_response(&root_response);
|
||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -291,8 +291,8 @@ async fn unused_bootstrap_survives_equivalent_runtime_generation_swap() {
|
|||||||
let (_, root_body) = split_response(&root_response);
|
let (_, root_body) = split_response(&root_response);
|
||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -331,8 +331,8 @@ async fn unused_bootstrap_is_rejected_after_profile_identity_change() {
|
|||||||
let (_, root_body) = split_response(&root_response);
|
let (_, root_body) = split_response(&root_response);
|
||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -373,8 +373,8 @@ async fn https_lanes_is_advertised_and_requires_canonical_lane_headers() {
|
|||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
assert!(root_body.contains("carrier='https-lanes'"));
|
assert!(root_body.contains("carrier='https-lanes'"));
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -457,8 +457,8 @@ async fn windows_restricted_webview_empty_cookie_preserves_the_carrier_flow() {
|
|||||||
assert!(root_headers.starts_with(b"HTTP/1.1 200"));
|
assert!(root_headers.starts_with(b"HTTP/1.1 200"));
|
||||||
let root_body = std::str::from_utf8(root_body).unwrap();
|
let root_body = std::str::from_utf8(root_body).unwrap();
|
||||||
let bootstrap = root_body
|
let bootstrap = root_body
|
||||||
.split_once("bootstrap='")
|
.split_once("bootstrap=\"")
|
||||||
.and_then(|(_, suffix)| suffix.split_once('\''))
|
.and_then(|(_, suffix)| suffix.split_once('"'))
|
||||||
.map(|(token, _)| token)
|
.map(|(token, _)| token)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user