slicc-cdp-client 1.42.2

Shared CDP connection for slicc-cdp CLIs
Documentation
#[test]
fn redirect_terminal_seen_request_is_redacted_and_finished_once() {
    let mut cdp = url_backend("about:blank");
    cdp.absorb(json!({"method":"Network.requestWillBeSent","sessionId":"S","params":{"requestId":"TERMINAL","type":"Document","timestamp":1,"request":{"url":"https://ordinary.invalid/start","method":"GET","headers":{}}}}));
    let url = "https://seven.sliccy.ai/private?token=TERMINAL_FAKE_SECRET#fragment";
    cdp.absorb(json!({"method":"Network.requestWillBeSent","sessionId":"S","params":{"requestId":"TERMINAL","type":"Document","timestamp":2,"documentURL":url,"request":{"url":url,"method":"GET","headers":{"Cookie":"TERMINAL_FAKE_SECRET"},"postData":"TERMINAL_FAKE_SECRET","urlFragment":"#TERMINAL_FAKE_SECRET"},"redirectResponse":{"url":"https://ordinary.invalid/start","status":302,"headers":{"Location":url}}}}));
    cdp.absorb(json!({"method":"Network.responseReceived","sessionId":"S","params":{"requestId":"TERMINAL","response":{"url":url,"status":200}}}));
    for method in ["Network.loadingFailed", "Network.loadingFinished"] {
        cdp.absorb(json!({"method":method,"sessionId":"S","params":{"requestId":"TERMINAL","timestamp":3}}));
    }
    let events = cdp.events();
    let redirects: Vec<_> = events.iter().filter(|event| event.pointer("/params/redirectResponse").is_some()).collect();
    assert_eq!(redirects.len(), 1);
    assert_eq!(redirects[0].pointer("/params/request/url").unwrap(), "https://seven.sliccy.ai");
    assert_eq!(redirects[0].pointer("/params/redirectResponse/headers/Location").unwrap(), "https://seven.sliccy.ai");
    let terminal: Vec<_> = events.iter().filter(|event| matches!(event["method"].as_str(), Some("Network.loadingFailed" | "Network.loadingFinished"))).collect();
    assert_eq!(terminal.len(), 1);
    assert_eq!(terminal[0]["params"]["errorText"], "net::ERR_BLOCKED_BY_CLIENT");
    assert_eq!(terminal[0]["params"]["blockedReason"], "inspector");
    let output = serde_json::to_string(events).unwrap();
    for secret in ["TERMINAL_FAKE_SECRET", "private?token", "#fragment", "postData", "urlFragment"] {
        assert!(!output.contains(secret), "{secret}: {output}");
    }
    for method in ["Network.getResponseBody", "Network.getRequestPostData", "Network.searchInResponseBody", "Network.streamResourceContent", "Audits.getEncodedResponse"] {
        assert!(cdp.call(method, json!({"requestId":"TERMINAL"}), Some("S")).unwrap_err().starts_with("slicc: refused:"));
    }
}

#[test]
fn redirect_terminal_fetch_network_alias_closes_seen_request_once() {
    let mut cdp = url_backend("about:blank");
    cdp.absorb(json!({"method":"Network.requestWillBeSent","sessionId":"S","params":{"requestId":"NET","type":"Document","timestamp":1,"request":{"url":"https://ordinary.invalid/start","method":"GET","headers":{}}}}));
    cdp.absorb(json!({"method":"Fetch.requestPaused","sessionId":"S","params":{"requestId":"FETCH","networkId":"NET","frameId":"FRAME","resourceType":"Document","request":{"url":"https://ordinary.invalid/start","method":"GET","headers":{}},"responseStatusCode":302,"responseHeaders":[{"name":"Location","value":"https://seven.sliccy.ai/private?token=FETCH_TERMINAL_SECRET"}]}}));
    cdp.absorb(json!({"method":"Network.loadingFailed","sessionId":"S","params":{"requestId":"NET","timestamp":2,"errorText":"net::ERR_BLOCKED_BY_CLIENT"}}));
    assert_eq!(cdp.events().iter().filter(|event| event["method"] == "Network.loadingFailed").count(), 1);
    assert!(!serde_json::to_string(cdp.events()).unwrap().contains("FETCH_TERMINAL_SECRET"));
    for id in ["NET", "FETCH"] {
        for method in ["Network.getResponseBody", "Network.getRequestPostData", "Fetch.getResponseBody", "Fetch.takeResponseBodyAsStream", "Network.getResponseBodyForInterception", "Network.takeResponseBodyForInterceptionAsStream", "Network.replayXHR", "Audits.getEncodedResponse"] {
            assert!(cdp.call(method, json!({"requestId":id,"interceptionId":id}), Some("S")).unwrap_err().starts_with("slicc: refused:"), "{method}/{id}");
        }
    }
}