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.
Files changed (61) hide show
  1. {procproxy-0.1.4/src/procproxy.egg-info → procproxy-0.1.4.1}/PKG-INFO +3 -3
  2. {procproxy-0.1.4 → procproxy-0.1.4.1}/README.md +2 -2
  3. {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
  4. {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
  5. {procproxy-0.1.4 → procproxy-0.1.4.1}/pyproject.toml +1 -1
  6. {procproxy-0.1.4 → procproxy-0.1.4.1/src/procproxy.egg-info}/PKG-INFO +3 -3
  7. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/__init__.py +1 -1
  8. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/__init__.py +17 -15
  9. {procproxy-0.1.4 → procproxy-0.1.4.1}/LICENSE +0 -0
  10. {procproxy-0.1.4 → procproxy-0.1.4.1}/MANIFEST.in +0 -0
  11. {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
  12. {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
  13. {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
  14. {procproxy-0.1.4 → procproxy-0.1.4.1}/examples/proxy_process.py +0 -0
  15. {procproxy-0.1.4 → procproxy-0.1.4.1}/examples/verify_sdk.py +0 -0
  16. {procproxy-0.1.4 → procproxy-0.1.4.1}/setup.cfg +0 -0
  17. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/SOURCES.txt +0 -0
  18. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/dependency_links.txt +0 -0
  19. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/entry_points.txt +0 -0
  20. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/requires.txt +0 -0
  21. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/procproxy.egg-info/top_level.txt +0 -0
  22. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/__main__.py +0 -0
  23. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/api.py +0 -0
  24. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/__init__.py +0 -0
  25. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/base.py +0 -0
  26. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/null.py +0 -0
  27. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/filter.py +0 -0
  28. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/pidmap.py +0 -0
  29. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/backend/windivert/pkt.py +0 -0
  30. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/canproxy.py +0 -0
  31. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/checkroute.py +0 -0
  32. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/cli.py +0 -0
  33. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config.py +0 -0
  34. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config_init.py +0 -0
  35. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/config_source.py +0 -0
  36. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/data/default.yaml +0 -0
  37. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/__init__.py +0 -0
  38. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/cache.py +0 -0
  39. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/modes.py +0 -0
  40. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/dns/udp.py +0 -0
  41. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/forward.py +0 -0
  42. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/ipc.py +0 -0
  43. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/log.py +0 -0
  44. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/pathsetup.py +0 -0
  45. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/probe.py +0 -0
  46. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/proc.py +0 -0
  47. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/rules.py +0 -0
  48. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/runtime.py +0 -0
  49. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/service/__init__.py +0 -0
  50. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/service/__main__.py +0 -0
  51. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/__init__.py +0 -0
  52. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/relay.py +0 -0
  53. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/sessions.py +0 -0
  54. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/tunnel/sink.py +0 -0
  55. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/types.py +0 -0
  56. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/__init__.py +0 -0
  57. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/base.py +0 -0
  58. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/chain.py +0 -0
  59. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/http_connect.py +0 -0
  60. {procproxy-0.1.4 → procproxy-0.1.4.1}/src/proxycore/upstream/socks4.py +0 -0
  61. {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/ 测试套件(624 passed / 4 skipped)
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 passed / 4 skipped(非管理员 Windows)
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/ 测试套件(624 passed / 4 skipped)
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/ # 624 passed / 4 skipped(非管理员 Windows)
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
  ---
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "procproxy"
7
- version = "0.1.4"
7
+ version = "0.1.4.1"
8
8
  description = "ProcProxy —— 进程级代理:按进程决定哪条连接走哪个上游代理"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -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/ 测试套件(624 passed / 4 skipped)
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 passed / 4 skipped(非管理员 Windows)
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
  ```
@@ -2,6 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "0.1.4"
5
+ __version__ = "0.1.4.1"
6
6
 
7
7
  __all__ = ["__version__"]
@@ -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
- out = pydivert.Packet(raw, direction=direction)
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
- addr = getattr(out, "wd_addr", None)
617
- if addr is not None:
618
- addr.Outbound = 1 if outbound else 0
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