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;