iplist/test/App/Controller
Rekryt 9d3ff3d6e0 feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat
New output formats:

- `format=geosite` — v2ray/xray geosite.dat, built natively by GeositeDatWriter
  (domain-list-community rejects 406 of 409 portal names, so an external
  generator was not an option); `domaintype=suffix|full|keyword|regex`.
- `format=singbox` — sing-box rule-set source JSON, served inline; it becomes
  an attachment only with `?filesave=1`.
- `format=srs` — the same rule-set compiled to binary by the sing-box binary
  (SINGBOX_PATH); without the binary the format returns a plain-text error.
- `format=geoip` — same contract, now built in PHP by GeoipDatWriter.
  `SYS_GEOIP_NATIVE=false` keeps the v2fly binary path for one release.

Infrastructure:

- src/Infrastructure/Codec: ProtobufWriter, GeoipDatWriter, GeositeDatWriter,
  SingboxRuleSetBuilder, EntryPayload, DatEncoder. Writers are pure functions —
  no I/O, no Amp, no singletons — so the same class runs inline and inside an
  amphp/parallel worker. Above SYS_ENCODE_WORKER_THRESHOLD encoding goes to a
  worker, below it yields to the event loop every 32 lists.
- TempWorkspace: one temp dir per request under storage/tmp, removed in a
  finally, plus a sweeper for dirs orphaned by SIGKILL (SYS_TMP_TTL,
  SYS_TMP_SWEEP_INTERVAL). Replaces the leaking geoip/input + geoip/output.
- ProcessRunner: the single place that starts external binaries — command as an
  array, both pipes buffered concurrently (not reading them deadlocked a chatty
  child), exit code and stderr surfaced in the error body.

Fixes:

- wildcard domain collapse no longer emits a bare "." for scraped junk like
  `DNSdumpster..`; such entries are dropped by SiteFactory::normalizeDomains
  on ingestion, and a matching guard sits in Site::getDomains.
- geoip.dat was served as text/plain; both engines now use
  application/octet-stream.
- HttpClient in AsyncTest is shared across the run: per-test clients kept their
  keep-alive pools alive and starved the Windows StreamSelectDriver by the end
  of a full run.

UI, docs, build:

- Form.vue: new formats, domaintype and rule-set version selects, wildcard on by
  default, filesave hidden for attachment-only formats; public/ rebuilt.
- IndexTemplate.php (no-JS form on /index) caught up with the frontend.
- README.md, README.en.md, CLAUDE.md, ROADMAP.md, .env.example.
- Dockerfile: sing-box from the release tarball (-glibc), v2fly/geoip built on
  golang:1.25 with a pinned tag; the apt Go 1.19 stage was the broken build.

https://github.com/itdoginfo/podkop/issues/418
2026-07-31 13:44:33 +03:00
..
AmneziaControllerTest.php fix - emit content-length header from a buffered string body 2026-06-01 18:36:15 +03:00
BatControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
ClashxControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
CommaControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
CustomControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
FaviconControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
GeoipControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
GeoipNativeTest.php feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat 2026-07-31 13:44:33 +03:00
GeositeControllerTest.php feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat 2026-07-31 13:44:33 +03:00
IpsetControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
JsonControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
JsonFilterTest.php feat: per-portal CIDR-replacement map for overlapping zones 2026-04-24 13:30:56 +03:00
KvasControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
MainControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
MikrotikControllerTest.php fix: mikrotik "no such item" error in new versions RouterOS 2026-06-17 18:47:30 +03:00
MikrotikFilterTest.php test(filters): add filter and exclude matrix 2026-04-23 17:54:45 +03:00
NfsetControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
PacControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
ReplaceFlowTest.php fix: apply excludes to ip-zones after replacements 2026-04-27 10:56:21 +03:00
ScriptsControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
SingboxControllerTest.php feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat 2026-07-31 13:44:33 +03:00
SiteMutationGuardTest.php feat: per-portal CIDR-replacement map for overlapping zones 2026-04-24 13:30:56 +03:00
SrsControllerTest.php feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat 2026-07-31 13:44:33 +03:00
SwitchyControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
TempCleanupTest.php feat: geosite.dat, sing-box rule-set (json + srs), native geoip.dat 2026-07-31 13:44:33 +03:00
TextControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00
TextFilterTest.php test(filters): add filter and exclude matrix 2026-04-23 17:54:45 +03:00
WildcardControllerTest.php test(controllers): add happy-path coverage for every format 2026-04-23 17:53:46 +03:00