procproxy 0.1.4__tar.gz → 0.1.4.1__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.
- {procproxy-0.1.4/src/procproxy.egg-info → procproxy-0.1.4.1}/PKG-INFO +3 -3
- {procproxy-0.1.4 → procproxy-0.1.4.1}/README.md +2 -2
- {procproxy-0.1.4 → procproxy-0.1.4.1}/docs/11-/350/260/203/350/257/225/346/216/222/351/224/231/346/211/213/345/206/214.md +10 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/docs/15-/347/274/226/347/250/213/346/216/245/345/217/243/344/270/216SDK.md +1 -1
- {procproxy-0.1.4 → procproxy-0.1.4.1}/pyproject.toml +1 -1
- {procproxy-0.1.4 → procproxy-0.1.4.1/src/procproxy.egg-info}/PKG-INFO +3 -3
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/__init__.py +1 -1
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/__init__.py +17 -15
- {procproxy-0.1.4 → procproxy-0.1.4.1}/LICENSE +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/MANIFEST.in +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/docs/00-/346/236/266/346/236/204/344/270/216/351/230/205/350/257/273/350/267/257/347/272/277.md" +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/docs/07-/350/247/204/345/210/231/345/274/225/346/223/216/344/270/216Profile/346/240/274/345/274/217.md" +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/docs/14-/346/212/212/350/277/233/347/250/213/346/265/201/351/207/217/350/275/254/345/217/221/347/273/231/346/212/223/345/214/205/345/267/245/345/205/267.md" +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/examples/proxy_process.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/examples/verify_sdk.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/setup.cfg +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/SOURCES.txt +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/dependency_links.txt +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/entry_points.txt +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/requires.txt +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/top_level.txt +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/__main__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/api.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/__init__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/base.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/null.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/filter.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/pidmap.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/pkt.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/canproxy.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/checkroute.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/cli.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config_init.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config_source.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/data/default.yaml +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/__init__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/cache.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/modes.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/udp.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/forward.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/ipc.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/log.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/pathsetup.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/probe.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/proc.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/rules.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/runtime.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/service/__init__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/service/__main__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/__init__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/relay.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/sessions.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/sink.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/types.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/__init__.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/base.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/chain.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/http_connect.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/socks4.py +0 -0
- {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/socks5.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: procproxy
|
|
3
|
-
Version: 0.1.4
|
|
3
|
+
Version: 0.1.4.1
|
|
4
4
|
Summary: ProcProxy —— 进程级代理:按进程决定哪条连接走哪个上游代理
|
|
5
5
|
Author: Longersking
|
|
6
6
|
License-Expression: MIT
|
|
@@ -590,7 +590,7 @@ src/proxycore/ 核心包
|
|
|
590
590
|
samples/ mock 服务 + 示例配置
|
|
591
591
|
examples/ 纯 Python 示例(proxy_process.py / verify_sdk.py)
|
|
592
592
|
docs/ 文档(00 架构 / 07 规则 / 11 排错 / 14 抓包 / 15 SDK)
|
|
593
|
-
tests/ 测试套件(
|
|
593
|
+
tests/ 测试套件(625 passed / 4 skipped)
|
|
594
594
|
└── tools/ 验证脚本(run_demo / run_e2e / bench / …)
|
|
595
595
|
```
|
|
596
596
|
|
|
@@ -621,7 +621,7 @@ tests/ 测试套件(624 passed / 4 skipped)
|
|
|
621
621
|
|
|
622
622
|
```bash
|
|
623
623
|
pip install -e ".[dev]"
|
|
624
|
-
python -m pytest -q tests/ #
|
|
624
|
+
python -m pytest -q tests/ # 625 passed / 4 skipped(非管理员 Windows)
|
|
625
625
|
python -m ruff check src tests
|
|
626
626
|
python -m mypy src/proxycore
|
|
627
627
|
```
|
|
@@ -551,7 +551,7 @@ src/proxycore/ 核心包
|
|
|
551
551
|
samples/ mock 服务 + 示例配置
|
|
552
552
|
examples/ 纯 Python 示例(proxy_process.py / verify_sdk.py)
|
|
553
553
|
docs/ 文档(00 架构 / 07 规则 / 11 排错 / 14 抓包 / 15 SDK)
|
|
554
|
-
tests/ 测试套件(
|
|
554
|
+
tests/ 测试套件(625 passed / 4 skipped)
|
|
555
555
|
└── tools/ 验证脚本(run_demo / run_e2e / bench / …)
|
|
556
556
|
```
|
|
557
557
|
|
|
@@ -582,7 +582,7 @@ tests/ 测试套件(624 passed / 4 skipped)
|
|
|
582
582
|
|
|
583
583
|
```bash
|
|
584
584
|
pip install -e ".[dev]"
|
|
585
|
-
python -m pytest -q tests/ #
|
|
585
|
+
python -m pytest -q tests/ # 625 passed / 4 skipped(非管理员 Windows)
|
|
586
586
|
python -m ruff check src tests
|
|
587
587
|
python -m mypy src/proxycore
|
|
588
588
|
```
|
|
@@ -100,6 +100,16 @@ sc stop WinDivert # 极端情况:直接卸掉 WinDive
|
|
|
100
100
|
|
|
101
101
|
> `version != 1` 仍然报 `config_version_unsupported`,与读取错误分开。
|
|
102
102
|
|
|
103
|
+
### 2.9 升级 pydivert 4.0.0 后,改道成功但连接卡在 SYN_SENT
|
|
104
|
+
|
|
105
|
+
| 项 | 内容 |
|
|
106
|
+
|---|---|
|
|
107
|
+
| 症状 | 日志有 `redirect`,但应用一直 SYN_SENT、curl 超时、sink/Yakit 收不到包;上游 0 条 CONNECT |
|
|
108
|
+
| 根因 | pydivert 4.0.0 的 `send()` 默认调用 `recalculate_checksums()`,后者在 Windows 上先执行 `_populate_wd_addr()`,按**构造期缓存**重建 `WINDIVERT_ADDRESS`。旧实现先构造 `Packet` 再直接改 `wd_addr.Loopback/IfIdx`,重建时被清零 → 回环 SYN 被内核丢弃。3.1.3 不做这次重建,所以 3.x 正常 |
|
|
109
|
+
| 修复 | 0.1.4.1 起:`Loopback` / `IfIdx` / `direction` 通过 `Packet(...)` 构造参数传入,并且 `send(..., recalculate_checksum=False)`(校验和已由 `pkt.py` 算好);同时兼容 3.x / 4.x |
|
|
110
|
+
| 快速确认 | `python -c "import pydivert; print(pydivert.__version__)"`;4.x 且有上述症状就升级 proxycore |
|
|
111
|
+
| 临时绕过 | 不要长期 monkey patch;可在验证阶段把 pydivert 固定到 `3.1.3`,或直接使用含修复的 proxycore |
|
|
112
|
+
|
|
103
113
|
## 3. 抓包与验证技巧
|
|
104
114
|
|
|
105
115
|
```powershell
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> 发行包名是 `procproxy`,导入名是 `proxycore`。`pip install procproxy` 同时安装
|
|
6
6
|
> 库和可选的 CLI;CLI 只是库的外壳,不使用它也能完成初始化、代理、查询和停止。
|
|
7
7
|
|
|
8
|
-
本文既是使用教程,也是**行为契约**。对应 `proxycore 0.1.4`;§10 的验收脚本
|
|
8
|
+
本文既是使用教程,也是**行为契约**。对应 `proxycore 0.1.4.1`;§10 的验收脚本
|
|
9
9
|
`examples/verify_sdk.py`(25 项断言)可以直接用来检查一份实现是否与本文一致。
|
|
10
10
|
|
|
11
11
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: procproxy
|
|
3
|
-
Version: 0.1.4
|
|
3
|
+
Version: 0.1.4.1
|
|
4
4
|
Summary: ProcProxy —— 进程级代理:按进程决定哪条连接走哪个上游代理
|
|
5
5
|
Author: Longersking
|
|
6
6
|
License-Expression: MIT
|
|
@@ -590,7 +590,7 @@ src/proxycore/ 核心包
|
|
|
590
590
|
samples/ mock 服务 + 示例配置
|
|
591
591
|
examples/ 纯 Python 示例(proxy_process.py / verify_sdk.py)
|
|
592
592
|
docs/ 文档(00 架构 / 07 规则 / 11 排错 / 14 抓包 / 15 SDK)
|
|
593
|
-
tests/ 测试套件(
|
|
593
|
+
tests/ 测试套件(625 passed / 4 skipped)
|
|
594
594
|
└── tools/ 验证脚本(run_demo / run_e2e / bench / …)
|
|
595
595
|
```
|
|
596
596
|
|
|
@@ -621,7 +621,7 @@ tests/ 测试套件(624 passed / 4 skipped)
|
|
|
621
621
|
|
|
622
622
|
```bash
|
|
623
623
|
pip install -e ".[dev]"
|
|
624
|
-
python -m pytest -q tests/ #
|
|
624
|
+
python -m pytest -q tests/ # 625 passed / 4 skipped(非管理员 Windows)
|
|
625
625
|
python -m ruff check src tests
|
|
626
626
|
python -m mypy src/proxycore
|
|
627
627
|
```
|
|
@@ -610,23 +610,25 @@ class WinDivertBackend(BaseBackend):
|
|
|
610
610
|
if direction is None: # pragma: no cover - start() 里已缓存
|
|
611
611
|
direction = pydivert.Direction.OUTBOUND if outbound else pydivert.Direction.INBOUND
|
|
612
612
|
|
|
613
|
-
|
|
613
|
+
# 没显式给就沿用原包的接口索引;生产路径两个方向都会显式传。
|
|
614
|
+
idx = int(self._ifidx(packet) if ifidx is None else ifidx)
|
|
615
|
+
|
|
616
|
+
# 元数据必须在构造期传入,不能事后改 wd_addr:
|
|
617
|
+
# pydivert 4.0.0 的 send() 默认会调用 recalculate_checksums(),而它在 Windows
|
|
618
|
+
# 上先执行 _populate_wd_addr(),按构造期缓存的 _loopback/_interface/_direction
|
|
619
|
+
# 重建 WINDIVERT_ADDRESS。直接写 out.wd_addr.Loopback/IfIdx 会被清零,
|
|
620
|
+
# 回环 SYN 被内核丢弃,应用卡在 SYN_SENT(3.x 不做这次重建,所以以前没暴露)。
|
|
621
|
+
out = pydivert.Packet(
|
|
622
|
+
raw,
|
|
623
|
+
interface=(idx, 0),
|
|
624
|
+
direction=direction,
|
|
625
|
+
loopback=outbound,
|
|
626
|
+
)
|
|
614
627
|
# 用改写后的报文挑句柄(地址族与原始包一致,但这里的数据更权威)
|
|
615
628
|
handle = self._handle_for(out) or handle
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
# 回环流量要置 Loopback 位:内核据此把它当本机回环报文处理
|
|
620
|
-
addr.Loopback = 1 if outbound else 0
|
|
621
|
-
addr.Sniffed = 0
|
|
622
|
-
addr.Impostor = 0
|
|
623
|
-
# 没显式给就沿用原包的接口索引(老行为,够用);生产路径两个方向都会显式传
|
|
624
|
-
idx = self._ifidx(packet) if ifidx is None else ifidx
|
|
625
|
-
if idx:
|
|
626
|
-
addr.Network.IfIdx = int(idx)
|
|
627
|
-
# 校验和交给 pydivert 重算兜底(wd_addr 上的 *Checksum 标志会影响 helper 的行为,
|
|
628
|
-
# 让它自己算最稳);我们 pkt.py 的校验和另有单测保证正确性。
|
|
629
|
-
handle.send(out)
|
|
629
|
+
# pkt.py 的 redirect/reflect 已经算好校验和;关掉 pydivert 的重算,
|
|
630
|
+
# 既避免重复计算,也避免 4.0.0 重建地址时依赖构造期缓存的隐式行为。
|
|
631
|
+
handle.send(out, recalculate_checksum=False)
|
|
630
632
|
|
|
631
633
|
# ------------------------------------------------------------ 统计 -----
|
|
632
634
|
def stats(self) -> dict[str, Any]:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|