veilrender 0.6.2__tar.gz → 0.6.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {veilrender-0.6.2 → veilrender-0.6.4}/PKG-INFO +30 -2
  2. {veilrender-0.6.2 → veilrender-0.6.4}/README.md +29 -1
  3. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/__init__.py +1 -1
  4. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/httpserver.py +564 -68
  5. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/soup.py +523 -47
  6. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/app.py +11 -0
  7. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/browser.py +228 -14
  8. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/cdp_proxy.py +1 -1
  9. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/config.py +65 -15
  10. veilrender-0.6.4/src/veilrender/egress_proxy.py +1071 -0
  11. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/filters.py +63 -4
  12. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/metrics.py +42 -0
  13. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/render.py +21 -0
  14. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/screenshot.py +22 -0
  15. veilrender-0.6.4/src/veilrender/url_validator.py +266 -0
  16. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/PKG-INFO +30 -2
  17. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/SOURCES.txt +7 -1
  18. veilrender-0.6.4/tests/test_browser_attestation.py +283 -0
  19. veilrender-0.6.4/tests/test_config.py +46 -0
  20. veilrender-0.6.4/tests/test_egress_proxy.py +784 -0
  21. veilrender-0.6.4/tests/test_filters.py +110 -0
  22. veilrender-0.6.4/tests/test_url_validator.py +113 -0
  23. veilrender-0.6.2/src/veilrender/url_validator.py +0 -164
  24. {veilrender-0.6.2 → veilrender-0.6.4}/pyproject.toml +0 -0
  25. {veilrender-0.6.2 → veilrender-0.6.4}/setup.cfg +0 -0
  26. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/__main__.py +0 -0
  27. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/__init__.py +0 -0
  28. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/cache.py +0 -0
  29. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/ratelimit.py +0 -0
  30. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/readability.py +0 -0
  31. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/_vendor/s3.py +0 -0
  32. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/auth.py +0 -0
  33. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/data/__init__.py +0 -0
  34. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/data/blocklist.txt +0 -0
  35. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/fonts.py +0 -0
  36. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/models.py +0 -0
  37. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/ratelimit.py +0 -0
  38. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/__init__.py +0 -0
  39. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/dashboard.py +0 -0
  40. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/fonts_route.py +0 -0
  41. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/routes/health.py +0 -0
  42. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/stats.py +0 -0
  43. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender/storage.py +0 -0
  44. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/dependency_links.txt +0 -0
  45. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/entry_points.txt +0 -0
  46. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/requires.txt +0 -0
  47. {veilrender-0.6.2 → veilrender-0.6.4}/src/veilrender.egg-info/top_level.txt +0 -0
  48. {veilrender-0.6.2 → veilrender-0.6.4}/tests/test_fonts.py +0 -0
  49. {veilrender-0.6.2 → veilrender-0.6.4}/tests/test_models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: veilrender
3
- Version: 0.6.2
3
+ Version: 0.6.4
4
4
  Summary: Headless browser rendering API — self-hostable on HF Spaces, Docker, or bare metal
5
5
  Author: Peng Ding
6
6
  License-Expression: MIT
@@ -166,7 +166,7 @@ JSON API for live dashboard data (polled by the dashboard UI).
166
166
 
167
167
  ### WS /cdp
168
168
 
169
- Direct CDP WebSocket proxy to the browser. Supports `?worker=N` for targeting specific workers in a pool.
169
+ Direct CDP WebSocket proxy to the browser. Supports `?worker=N` for targeting specific workers in a pool. Disabled by default (`VEILRENDER_CDP_ENABLED=true` to opt in); raw CDP clients can create contexts outside the egress proxy.
170
170
 
171
171
  ## Configuration
172
172
 
@@ -191,12 +191,32 @@ All settings via `VEILRENDER_*` environment variables:
191
191
  | `VEILRENDER_WORKERS` | *(none)* | Comma-separated worker endpoints (enables pool mode) |
192
192
  | `VEILRENDER_WORKER_MAX_CONCURRENT` | `5` | Per-worker page concurrency |
193
193
  | `VEILRENDER_WORKER_HEALTH_INTERVAL` | `10` | Health check interval (seconds) |
194
+ | `VEILRENDER_EGRESS_BIND` | `127.0.0.1` | Egress proxy bind address (`0.0.0.0` in pool mode) |
195
+ | `VEILRENDER_EGRESS_PORT` | `0` | Egress proxy port (`0` = ephemeral; set a fixed port for pool mode) |
196
+ | `VEILRENDER_EGRESS_ADVERTISE` | *(none)* | Proxy URL given to browsers (e.g. `http://gateway:7870`) |
197
+ | `VEILRENDER_EGRESS_PROXY_TOKEN` | *(none)* | Proxy Basic-auth password; required for non-loopback binds |
198
+ | `VEILRENDER_UPSTREAM_PROXY` | *(none)* | Optional upstream proxy (`http`, `https`, `socks5`) |
199
+ | `VEILRENDER_UPSTREAM_PIN_IP` | `true` | Send the validated IP to the upstream proxy instead of the hostname |
200
+ | `VEILRENDER_CDP_ENABLED` | `false` | Enable the raw `/cdp` endpoint (can bypass the proxy — trusted operators only) |
194
201
 
195
202
  Worker endpoint formats:
196
203
  - `cdp://host:9222` or `http://host:9222` — Chromium CDP worker
197
204
  - `playwright://host:1234/ws-path` — Firefox/Camoufox Playwright worker
198
205
  - `playwrights://host:1234/ws-path` — TLS Playwright worker
199
206
 
207
+ > **Outbound request policy:** all HTTP(S)/WebSocket traffic from every
208
+ > browser is routed through an in-process egress proxy that refuses
209
+ > destinations outside the global address space, including each redirect hop.
210
+ > It listens on loopback by default and needs no configuration for
211
+ > single-instance deployments. Pool deployments must expose it to the worker
212
+ > containers (see the pool examples below). A worker whose traffic does not
213
+ > reach the proxy is disabled at startup. The raw `/cdp` endpoint is off by
214
+ > default (`VEILRENDER_CDP_ENABLED=true` to opt in). WebRTC/QUIC UDP is not
215
+ > proxied; see [SECURITY.md](SECURITY.md) for the browser flags remote workers
216
+ > need. If pool-mode navigations fail with proxy or tunnel errors, check that
217
+ > `VEILRENDER_EGRESS_ADVERTISE` is reachable from the worker containers and
218
+ > that `VEILRENDER_EGRESS_PROXY_TOKEN` matches.
219
+
200
220
  ### Browser Binary
201
221
 
202
222
  | Variable | Default | Description |
@@ -237,6 +257,10 @@ services:
237
257
  image: oaklight/veilrender:gateway
238
258
  environment:
239
259
  - VEILRENDER_WORKERS=cdp://worker1:9222,cdp://worker2:9222
260
+ - VEILRENDER_EGRESS_BIND=0.0.0.0
261
+ - VEILRENDER_EGRESS_PORT=7870
262
+ - VEILRENDER_EGRESS_ADVERTISE=http://veilrender:7870
263
+ - VEILRENDER_EGRESS_PROXY_TOKEN=${VEILRENDER_EGRESS_PROXY_TOKEN:?set a random token}
240
264
 
241
265
  worker1:
242
266
  image: cloakhq/cloakbrowser
@@ -257,6 +281,10 @@ services:
257
281
  image: oaklight/veilrender:gateway
258
282
  environment:
259
283
  - VEILRENDER_WORKERS=cdp://chromium:9222,playwright://camoufox:1234/ws
284
+ - VEILRENDER_EGRESS_BIND=0.0.0.0
285
+ - VEILRENDER_EGRESS_PORT=7870
286
+ - VEILRENDER_EGRESS_ADVERTISE=http://veilrender:7870
287
+ - VEILRENDER_EGRESS_PROXY_TOKEN=${VEILRENDER_EGRESS_PROXY_TOKEN:?set a random token}
260
288
 
261
289
  chromium:
262
290
  image: cloakhq/cloakbrowser
@@ -146,7 +146,7 @@ JSON API for live dashboard data (polled by the dashboard UI).
146
146
 
147
147
  ### WS /cdp
148
148
 
149
- Direct CDP WebSocket proxy to the browser. Supports `?worker=N` for targeting specific workers in a pool.
149
+ Direct CDP WebSocket proxy to the browser. Supports `?worker=N` for targeting specific workers in a pool. Disabled by default (`VEILRENDER_CDP_ENABLED=true` to opt in); raw CDP clients can create contexts outside the egress proxy.
150
150
 
151
151
  ## Configuration
152
152
 
@@ -171,12 +171,32 @@ All settings via `VEILRENDER_*` environment variables:
171
171
  | `VEILRENDER_WORKERS` | *(none)* | Comma-separated worker endpoints (enables pool mode) |
172
172
  | `VEILRENDER_WORKER_MAX_CONCURRENT` | `5` | Per-worker page concurrency |
173
173
  | `VEILRENDER_WORKER_HEALTH_INTERVAL` | `10` | Health check interval (seconds) |
174
+ | `VEILRENDER_EGRESS_BIND` | `127.0.0.1` | Egress proxy bind address (`0.0.0.0` in pool mode) |
175
+ | `VEILRENDER_EGRESS_PORT` | `0` | Egress proxy port (`0` = ephemeral; set a fixed port for pool mode) |
176
+ | `VEILRENDER_EGRESS_ADVERTISE` | *(none)* | Proxy URL given to browsers (e.g. `http://gateway:7870`) |
177
+ | `VEILRENDER_EGRESS_PROXY_TOKEN` | *(none)* | Proxy Basic-auth password; required for non-loopback binds |
178
+ | `VEILRENDER_UPSTREAM_PROXY` | *(none)* | Optional upstream proxy (`http`, `https`, `socks5`) |
179
+ | `VEILRENDER_UPSTREAM_PIN_IP` | `true` | Send the validated IP to the upstream proxy instead of the hostname |
180
+ | `VEILRENDER_CDP_ENABLED` | `false` | Enable the raw `/cdp` endpoint (can bypass the proxy — trusted operators only) |
174
181
 
175
182
  Worker endpoint formats:
176
183
  - `cdp://host:9222` or `http://host:9222` — Chromium CDP worker
177
184
  - `playwright://host:1234/ws-path` — Firefox/Camoufox Playwright worker
178
185
  - `playwrights://host:1234/ws-path` — TLS Playwright worker
179
186
 
187
+ > **Outbound request policy:** all HTTP(S)/WebSocket traffic from every
188
+ > browser is routed through an in-process egress proxy that refuses
189
+ > destinations outside the global address space, including each redirect hop.
190
+ > It listens on loopback by default and needs no configuration for
191
+ > single-instance deployments. Pool deployments must expose it to the worker
192
+ > containers (see the pool examples below). A worker whose traffic does not
193
+ > reach the proxy is disabled at startup. The raw `/cdp` endpoint is off by
194
+ > default (`VEILRENDER_CDP_ENABLED=true` to opt in). WebRTC/QUIC UDP is not
195
+ > proxied; see [SECURITY.md](SECURITY.md) for the browser flags remote workers
196
+ > need. If pool-mode navigations fail with proxy or tunnel errors, check that
197
+ > `VEILRENDER_EGRESS_ADVERTISE` is reachable from the worker containers and
198
+ > that `VEILRENDER_EGRESS_PROXY_TOKEN` matches.
199
+
180
200
  ### Browser Binary
181
201
 
182
202
  | Variable | Default | Description |
@@ -217,6 +237,10 @@ services:
217
237
  image: oaklight/veilrender:gateway
218
238
  environment:
219
239
  - VEILRENDER_WORKERS=cdp://worker1:9222,cdp://worker2:9222
240
+ - VEILRENDER_EGRESS_BIND=0.0.0.0
241
+ - VEILRENDER_EGRESS_PORT=7870
242
+ - VEILRENDER_EGRESS_ADVERTISE=http://veilrender:7870
243
+ - VEILRENDER_EGRESS_PROXY_TOKEN=${VEILRENDER_EGRESS_PROXY_TOKEN:?set a random token}
220
244
 
221
245
  worker1:
222
246
  image: cloakhq/cloakbrowser
@@ -237,6 +261,10 @@ services:
237
261
  image: oaklight/veilrender:gateway
238
262
  environment:
239
263
  - VEILRENDER_WORKERS=cdp://chromium:9222,playwright://camoufox:1234/ws
264
+ - VEILRENDER_EGRESS_BIND=0.0.0.0
265
+ - VEILRENDER_EGRESS_PORT=7870
266
+ - VEILRENDER_EGRESS_ADVERTISE=http://veilrender:7870
267
+ - VEILRENDER_EGRESS_PROXY_TOKEN=${VEILRENDER_EGRESS_PROXY_TOKEN:?set a random token}
240
268
 
241
269
  chromium:
242
270
  image: cloakhq/cloakbrowser
@@ -1,3 +1,3 @@
1
1
  """VeilRender — headless browser rendering API."""
2
2
 
3
- __version__ = "0.6.2"
3
+ __version__ = "0.6.4"