wsbuilder 1.2.1__tar.gz → 1.2.3__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.
- {wsbuilder-1.2.1/src/wsbuilder.egg-info → wsbuilder-1.2.3}/PKG-INFO +1 -1
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/pyproject.toml +1 -1
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/__init__.py +1 -1
- wsbuilder-1.2.3/src/wsbuilder/_coerce.py +17 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/cache.py +3 -14
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/caches.py +2 -14
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/metrics.py +2 -14
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/proxyi.py +2 -14
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/security.py +2 -14
- {wsbuilder-1.2.1 → wsbuilder-1.2.3/src/wsbuilder.egg-info}/PKG-INFO +1 -1
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/SOURCES.txt +1 -1
- wsbuilder-1.2.1/src/wsbuilder/ws_demo.py +0 -2161
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/LICENSE +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/MANIFEST.in +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/README.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/404.html +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/CNAME +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/advanced.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/ai-predict.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/api-map.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/app-http.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/architecture.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/assets/wsbuilder-mark.svg +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/beginners.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/cache-security.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/cache.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/capabilities.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/data-orm.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/dns.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/full-project.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/getting-started.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/help/index.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/http-versions.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/http.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/ia.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/index.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/install.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/intermediate.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/mdns.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/network-edge.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/observability-tasks.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/observability.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/persistence.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/proxy.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/reference/index.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/security.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/stylesheets/extra.css +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/tasks.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/tls-certificates.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/docs/websocket.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/examples/full-project/.gitignore +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/examples/full-project/README.md +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/examples/full-project/app.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/examples/full-project/pyproject.toml +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/examples/full-project/upstream.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/mkdocs.yml +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/setup.cfg +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/__main__.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/app.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/constants.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/cookies.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/db_replicas.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/dns.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/framework.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/headers.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/hpack.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http1.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http2.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http3.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http3_server.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/http3_websocket.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/ia.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/logs.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/mdns.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/orm.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/pki.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/predicts.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/qpack.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/__init__.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/address.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/connection.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/crypto.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/frames.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/packet.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/recovery.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/tls.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/quic/varint.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/server.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/tasks.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder/ws.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/dependency_links.txt +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/entry_points.txt +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/requires.txt +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/src/wsbuilder.egg-info/top_level.txt +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_app_threads.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_cache.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_caches.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_contributing_policy.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_demo_monitor.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_dns.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_docs.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_documentation_files.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_headers_cookies.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_hpack.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http1.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http2.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http3.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http3_server.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http3_streaming.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_http3_streaming_udp.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_ia.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_logs.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_mdns.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_metrics.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_orm.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_orm_replicas.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_pki.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_pr_identity_policy.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_predicts.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_proxyi.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_quic_address.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_quic_crypto.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_quic_protocol.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_quic_recovery.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_quic_tls.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_security.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_server.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_server_errors.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_tasks.py +0 -0
- {wsbuilder-1.2.1 → wsbuilder-1.2.3}/tests/test_ws.py +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Lenient number coercion shared by config-reading modules."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def safe_int(value, default):
|
|
5
|
+
"""``int(value)``, or ``default`` when the value cannot be converted."""
|
|
6
|
+
try:
|
|
7
|
+
return int(value)
|
|
8
|
+
except (TypeError, ValueError, OverflowError):
|
|
9
|
+
return default
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def safe_float(value, default):
|
|
13
|
+
"""``float(value)``, or ``default`` when the value cannot be converted."""
|
|
14
|
+
try:
|
|
15
|
+
return float(value)
|
|
16
|
+
except (TypeError, ValueError, OverflowError):
|
|
17
|
+
return default
|
|
@@ -9,24 +9,13 @@ import threading
|
|
|
9
9
|
import time
|
|
10
10
|
from collections.abc import Mapping
|
|
11
11
|
|
|
12
|
+
from ._coerce import safe_float as _safe_float
|
|
13
|
+
from ._coerce import safe_int as _safe_int
|
|
14
|
+
|
|
12
15
|
DEFAULT_NAMESPACE = "default"
|
|
13
16
|
DEFAULT_CLEANUP_INTERVAL_SECONDS = 30.0
|
|
14
17
|
|
|
15
18
|
|
|
16
|
-
def _safe_float(value, default):
|
|
17
|
-
try:
|
|
18
|
-
return float(value)
|
|
19
|
-
except (TypeError, ValueError, OverflowError):
|
|
20
|
-
return default
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _safe_int(value, default):
|
|
24
|
-
try:
|
|
25
|
-
return int(value)
|
|
26
|
-
except (TypeError, ValueError, OverflowError):
|
|
27
|
-
return default
|
|
28
|
-
|
|
29
|
-
|
|
30
19
|
class _ValueCodec:
|
|
31
20
|
def __init__(self, *, allow_pickle=False):
|
|
32
21
|
self.allow_pickle = bool(allow_pickle)
|
|
@@ -11,6 +11,8 @@ import time
|
|
|
11
11
|
from collections.abc import Iterable, Mapping
|
|
12
12
|
from dataclasses import dataclass
|
|
13
13
|
|
|
14
|
+
from ._coerce import safe_float as _safe_float
|
|
15
|
+
from ._coerce import safe_int as _safe_int
|
|
14
16
|
from .cache import SQLiteMemoryCache
|
|
15
17
|
from .http import Response
|
|
16
18
|
|
|
@@ -36,20 +38,6 @@ _DROP_HEADERS = {
|
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
def _safe_float(value, default):
|
|
40
|
-
try:
|
|
41
|
-
return float(value)
|
|
42
|
-
except (TypeError, ValueError, OverflowError):
|
|
43
|
-
return default
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def _safe_int(value, default):
|
|
47
|
-
try:
|
|
48
|
-
return int(value)
|
|
49
|
-
except (TypeError, ValueError, OverflowError):
|
|
50
|
-
return default
|
|
51
|
-
|
|
52
|
-
|
|
53
41
|
def _normalize_mimetype(content_type):
|
|
54
42
|
text = str(content_type or "").strip().lower()
|
|
55
43
|
if not text:
|
|
@@ -5,6 +5,8 @@ import threading
|
|
|
5
5
|
import time
|
|
6
6
|
from datetime import UTC, datetime
|
|
7
7
|
|
|
8
|
+
from ._coerce import safe_float as _safe_float
|
|
9
|
+
from ._coerce import safe_int as _safe_int
|
|
8
10
|
from .http import Response
|
|
9
11
|
|
|
10
12
|
DEFAULT_STREAM_POINTS = 5
|
|
@@ -16,20 +18,6 @@ def _iso_utc(ts):
|
|
|
16
18
|
return datetime.fromtimestamp(ts, UTC).isoformat()
|
|
17
19
|
|
|
18
20
|
|
|
19
|
-
def _safe_int(value, default):
|
|
20
|
-
try:
|
|
21
|
-
return int(value)
|
|
22
|
-
except (TypeError, ValueError, OverflowError):
|
|
23
|
-
return default
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def _safe_float(value, default):
|
|
27
|
-
try:
|
|
28
|
-
return float(value)
|
|
29
|
-
except (TypeError, ValueError, OverflowError):
|
|
30
|
-
return default
|
|
31
|
-
|
|
32
|
-
|
|
33
21
|
def _is_truthy(value):
|
|
34
22
|
if value is None:
|
|
35
23
|
return False
|
|
@@ -16,6 +16,8 @@ from dataclasses import dataclass, field
|
|
|
16
16
|
from html import escape as html_escape
|
|
17
17
|
from urllib.parse import urlsplit
|
|
18
18
|
|
|
19
|
+
from ._coerce import safe_float as _safe_float
|
|
20
|
+
from ._coerce import safe_int as _safe_int
|
|
19
21
|
from .http import Response
|
|
20
22
|
|
|
21
23
|
DEFAULT_STREAM_POINTS = 5
|
|
@@ -96,20 +98,6 @@ _SENSITIVE_HEADER_NAMES = {
|
|
|
96
98
|
_REDACTED_HEADER_VALUE = "[REDACTED]"
|
|
97
99
|
|
|
98
100
|
|
|
99
|
-
def _safe_int(value, default):
|
|
100
|
-
try:
|
|
101
|
-
return int(value)
|
|
102
|
-
except (TypeError, ValueError, OverflowError):
|
|
103
|
-
return default
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def _safe_float(value, default):
|
|
107
|
-
try:
|
|
108
|
-
return float(value)
|
|
109
|
-
except (TypeError, ValueError, OverflowError):
|
|
110
|
-
return default
|
|
111
|
-
|
|
112
|
-
|
|
113
101
|
def _is_truthy(value):
|
|
114
102
|
if value is None:
|
|
115
103
|
return False
|
|
@@ -9,6 +9,8 @@ import time
|
|
|
9
9
|
from collections import deque
|
|
10
10
|
from dataclasses import dataclass
|
|
11
11
|
|
|
12
|
+
from ._coerce import safe_float as _safe_float
|
|
13
|
+
from ._coerce import safe_int as _safe_int
|
|
12
14
|
from .headers import get_header
|
|
13
15
|
from .http import Response
|
|
14
16
|
|
|
@@ -26,20 +28,6 @@ DEFAULT_MAX_TRACKED_CLIENTS = 20000
|
|
|
26
28
|
DEFAULT_MAX_TEMPORARY_BLOCKS = 20000
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
def _safe_int(value, default):
|
|
30
|
-
try:
|
|
31
|
-
return int(value)
|
|
32
|
-
except (TypeError, ValueError, OverflowError):
|
|
33
|
-
return default
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _safe_float(value, default):
|
|
37
|
-
try:
|
|
38
|
-
return float(value)
|
|
39
|
-
except (TypeError, ValueError, OverflowError):
|
|
40
|
-
return default
|
|
41
|
-
|
|
42
|
-
|
|
43
31
|
def _to_ip(value):
|
|
44
32
|
text = str(value or "").strip()
|
|
45
33
|
if not text:
|
|
@@ -45,6 +45,7 @@ examples/full-project/pyproject.toml
|
|
|
45
45
|
examples/full-project/upstream.py
|
|
46
46
|
src/wsbuilder/__init__.py
|
|
47
47
|
src/wsbuilder/__main__.py
|
|
48
|
+
src/wsbuilder/_coerce.py
|
|
48
49
|
src/wsbuilder/app.py
|
|
49
50
|
src/wsbuilder/cache.py
|
|
50
51
|
src/wsbuilder/caches.py
|
|
@@ -74,7 +75,6 @@ src/wsbuilder/security.py
|
|
|
74
75
|
src/wsbuilder/server.py
|
|
75
76
|
src/wsbuilder/tasks.py
|
|
76
77
|
src/wsbuilder/ws.py
|
|
77
|
-
src/wsbuilder/ws_demo.py
|
|
78
78
|
src/wsbuilder.egg-info/PKG-INFO
|
|
79
79
|
src/wsbuilder.egg-info/SOURCES.txt
|
|
80
80
|
src/wsbuilder.egg-info/dependency_links.txt
|