viewpoint_core/network/mod.rs
1//! # Network Interception and Monitoring
2//!
3//! This module provides comprehensive network capabilities including request
4//! interception, response mocking, event monitoring, and HAR recording/replay.
5//!
6//! ## Features
7//!
8//! - **Request Interception**: Intercept and modify outgoing requests
9//! - **Response Mocking**: Return custom responses without hitting the server
10//! - **Request Blocking**: Block requests matching specific patterns
11//! - **Network Events**: Monitor requests, responses, and failures
12//! - **HAR Recording**: Record network traffic for debugging
13//! - **HAR Replay**: Replay recorded traffic for testing
14//! - **WebSocket Monitoring**: Track WebSocket connections and messages
15//!
16//! ## Request Interception
17//!
18//! Use [`Route`] to intercept and handle network requests:
19//!
20//! ```ignore
21//! use viewpoint_core::Browser;
22//!
23//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
24//! # let browser = Browser::launch().headless(true).launch().await?;
25//! # let context = browser.new_context().await?;
26//! # let page = context.new_page().await?;
27//! // Mock an API response
28//! page.route("**/api/users", |route| async move {
29//! route.fulfill()
30//! .status(200)
31//! .content_type("application/json")
32//! .body(r#"[{"id": 1, "name": "Alice"}]"#)
33//! .fulfill()
34//! .await
35//! }).await?;
36//!
37//! // Block images
38//! page.route("**/*.{png,jpg,jpeg,gif,webp}", |route| async move {
39//! route.abort().await
40//! }).await?;
41//!
42//! // Modify request headers
43//! page.route("**/api/**", |route| async move {
44//! route.continue_route()
45//! .header("Authorization", "Bearer token123")
46//! .continue_route()
47//! .await
48//! }).await?;
49//!
50//! // Modify POST body
51//! page.route("**/api/submit", |route| async move {
52//! route.continue_route()
53//! .post_data(r#"{"modified": true}"#)
54//! .continue_route()
55//! .await
56//! }).await?;
57//! # Ok(())
58//! # }
59//! ```
60//!
61//! ## URL Patterns
62//!
63//! Routes support glob patterns for matching URLs:
64//!
65//! - `**` - Match any path segments
66//! - `*` - Match any characters except `/`
67//! - `?` - Match a single character
68//!
69//! ```ignore
70//! use viewpoint_core::{Browser, Route};
71//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
72//! # let browser = Browser::launch().headless(true).launch().await?;
73//! # let context = browser.new_context().await?;
74//! # let page = context.new_page().await?;
75//! // Match all API endpoints
76//! page.route("**/api/**", |route| async move {
77//! route.continue_route().continue_route().await
78//! }).await?;
79//!
80//! // Match specific file types
81//! page.route("**/*.{js,css}", |route| async move {
82//! route.continue_route().continue_route().await
83//! }).await?;
84//!
85//! // Match exact URL
86//! page.route("https://example.com/login", |route| async move {
87//! route.continue_route().continue_route().await
88//! }).await?;
89//! # Ok(())
90//! # }
91//! ```
92//!
93//! ## Network Events
94//!
95//! Monitor network activity with event listeners:
96//!
97//! ```ignore
98//! use viewpoint_core::Browser;
99//!
100//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
101//! # let browser = Browser::launch().headless(true).launch().await?;
102//! # let context = browser.new_context().await?;
103//! # let page = context.new_page().await?;
104//! // Wait for a specific request
105//! let request = page.wait_for_request("**/api/data")
106//! .wait()
107//! .await?;
108//! println!("Request URL: {}", request.url());
109//!
110//! // Wait for a specific response
111//! let response = page.wait_for_response("**/api/data")
112//! .wait()
113//! .await?;
114//! println!("Response status: {}", response.status());
115//! # Ok(())
116//! # }
117//! ```
118//!
119//! ## HAR Recording
120//!
121//! Record network traffic for debugging or test fixtures:
122//!
123//! ```ignore
124//! use viewpoint_core::Browser;
125//!
126//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
127//! # let browser = Browser::launch().headless(true).launch().await?;
128//! # let context = browser.new_context().await?;
129//! // Start HAR recording
130//! context.route_from_har()
131//! .record_path("recording.har")
132//! .build()
133//! .await?;
134//!
135//! // ... navigate and interact ...
136//!
137//! // HAR is automatically saved when context closes
138//! # Ok(())
139//! # }
140//! ```
141//!
142//! ## HAR Replay
143//!
144//! Replay recorded traffic for deterministic tests:
145//!
146//! ```ignore
147//! use viewpoint_core::Browser;
148//!
149//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
150//! # let browser = Browser::launch().headless(true).launch().await?;
151//! # let context = browser.new_context().await?;
152//! // Replay from HAR file
153//! context.route_from_har()
154//! .path("recording.har")
155//! .build()
156//! .await?;
157//!
158//! // Now requests will be served from the HAR file
159//! let page = context.new_page().await?;
160//! page.goto("https://example.com").goto().await?;
161//! # Ok(())
162//! # }
163//! ```
164//!
165//! ## WebSocket Monitoring
166//!
167//! Monitor WebSocket connections:
168//!
169//! ```ignore
170//! use viewpoint_core::Browser;
171//!
172//! # async fn example() -> Result<(), viewpoint_core::CoreError> {
173//! # let browser = Browser::launch().headless(true).launch().await?;
174//! # let context = browser.new_context().await?;
175//! # let page = context.new_page().await?;
176//! // Listen for WebSocket connections
177//! page.on_websocket(|ws| async move {
178//! println!("WebSocket connected: {}", ws.url());
179//!
180//! // Listen for messages
181//! ws.on_frame(|frame| async move {
182//! println!("Frame: {:?}", frame.payload());
183//! Ok(())
184//! }).await;
185//!
186//! Ok(())
187//! }).await;
188//! # Ok(())
189//! # }
190//! ```
191
192pub mod auth;
193pub mod events;
194pub(crate) mod handler;
195mod handler_fetch;
196mod handler_request;
197pub mod har;
198pub mod har_recorder;
199pub mod har_replay;
200mod har_types;
201mod request;
202mod response;
203mod route;
204mod route_builders;
205mod route_fetch;
206mod types;
207pub mod websocket;
208
209pub use events::{
210 NetworkEvent, NetworkEventListener, RequestEvent, RequestFailedEvent, RequestFinishedEvent,
211 ResponseEvent, WaitForRequestBuilder, WaitForResponseBuilder,
212};
213pub use handler::RouteHandlerRegistry;
214pub use har::{Har, HarEntry, HarPage, HarRequest, HarResponse, HarTimings};
215pub use har_recorder::{HarRecorder, HarRecordingBuilder, HarRecordingOptions};
216pub use har_replay::{
217 HarReplayHandler, HarReplayOptions, HarResponseData, TimingMode, UpdateContentMode,
218};
219pub use request::{Request, RequestSizes, RequestTiming};
220pub use response::{RemoteAddress, Response, SecurityDetails};
221pub use route::{Route, RouteAction, RouteHandler};
222pub use route_builders::{ContinueBuilder, FulfillBuilder};
223pub use route_fetch::{FetchBuilder, FetchedResponse};
224pub use types::{AbortError, ResourceType, UrlMatcher, UrlPattern};
225pub use websocket::{WebSocket, WebSocketFrame, WebSocketManager};
226
227// Re-export CDP types that are used directly
228pub use viewpoint_cdp::protocol::fetch::HeaderEntry;