Skip to content

Wire BanditURLOverrides through to MutableURLTest#333

Open
myleshorton wants to merge 13 commits intomainfrom
bandit-url-overrides
Open

Wire BanditURLOverrides through to MutableURLTest#333
myleshorton wants to merge 13 commits intomainfrom
bandit-url-overrides

Conversation

@myleshorton
Copy link
Contributor

Summary

  • Passes BanditURLOverrides from config response through to sing-box MutableURLTestOutboundOptions.URLOverrides
  • Updates urlTestOutbound() and appendGroupOutbounds() to accept and forward urlOverrides map[string]string
  • Lantern server group gets bandit overrides; user group and autoAll pass nil
  • Updates go.mod to reference common and lantern-box bandit-url-overrides branches

Test plan

  • go vet ./vpn/... passes
  • Existing TestConnection and TestUpdateServers still pass
  • Verify MutableURLTest uses per-proxy callback URLs when overrides are present

🤖 Generated with Claude Code

Pass per-proxy callback URLs from config response through to
sing-box MutableURLTest URLOverrides, enabling per-ISP bandit
proxy assignment on the client side.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings February 20, 2026 17:11
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR threads BanditURLOverrides from the loaded config through to Lantern’s MutableURLTestOutboundOptions.URLOverrides, enabling per-proxy URL test callback overrides to reach the sing-box mutable URL test implementation.

Changes:

  • Extend urlTestOutbound() and appendGroupOutbounds() to accept urlOverrides map[string]string and forward it into MutableURLTestOutboundOptions.URLOverrides.
  • Pass cfg.BanditURLOverrides into the Lantern server group’s URL test outbound; keep User/All URL test outbounds using nil.
  • Update module dependencies (go.mod/go.sum) to versions/branches that include the new options surface.

Reviewed changes

Copilot reviewed 4 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
vpn/vpn.go Updates pre-start URL test outbound construction to the new urlTestOutbound signature (currently passing nil overrides).
vpn/tunnel_test.go Updates tests to call urlTestOutbound with the new signature.
vpn/boxoptions.go Wires BanditURLOverrides into the Lantern group’s MutableURLTest outbound and adds URLOverrides to the outbound options.
go.mod Bumps common/lantern-box (and other deps) to versions needed for the new override option surface.
go.sum Corresponding checksum updates after dependency changes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

myleshorton and others added 5 commits February 20, 2026 11:06
Forward cfg.BanditURLOverrides into the preTest urlTestOutbound so
bandit callback URLs are used during pre-start URL testing, not just
during normal operation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verify that URLOverrides from config.BanditURLOverrides are correctly
forwarded into the auto-lantern MutableURLTestOutboundOptions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Periodically reports per-outbound throughput to the bandit system so it
can optimize for actual download speed, not just connectivity. Interval
and body size are randomized to avoid creating a fingerprintable signal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@garmr-ulfr
Copy link
Collaborator

@myleshorton are the BanditURLOverrides specific to each proxy, meaning each new config will contain new override URLs? If that's the case, do they need to be? The existing overrides will become invalid once we receive a new config.

@myleshorton
Copy link
Contributor Author

@myleshorton are the BanditURLOverrides specific to each proxy, meaning each new config will contain new override URLs? If that's the case, do they need to be? The existing overrides will become invalid once we receive a new config.

Basically each config response is a test for each "arm" of the multi-armed bandit, so each URL has a token for that test that allows the server to identify it when the client makes the callback. So each proxy gets its own token essentially.

@garmr-ulfr
Copy link
Collaborator

garmr-ulfr commented Feb 24, 2026

Gotcha. Then they'll become invalid as soon as we receive a new config... We could add a field, (URLTester??), to MutableURLTestOptions to specify which tester implementation to use. Then we can implement a bandit-based tester that supports updating tokens dynamically when the config changes.

@myleshorton
Copy link
Contributor Author

I don't quite understand the problem sorry. What's bad about them becoming invalid?

@garmr-ulfr
Copy link
Collaborator

When a new config is received, won't it have new override URLs that are specific to the new proxies?

@myleshorton
Copy link
Contributor Author

Yeah, but that's what we want -- that means the server wants to test those.

@myleshorton
Copy link
Contributor Author

@garmr-ulfr
Copy link
Collaborator

Yeah, but that's what we want -- that means the server wants to test those.

Right, so when we get a new config while the VPN is connected, we update the outbounds/endpoints and just add the new tags to the MutableURLTest outbounds. Since they're not recreated, they won't have the new override URLs.

@myleshorton
Copy link
Contributor Author

Oh sorry I misunderstood! OK, I should be able to fix that.

Persist URLOverrides in servers.Options so they survive file-watcher
reloads, and call SetURLOverrides in updateGroup so new proxies from
a config refresh get their bandit callback URLs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@myleshorton
Copy link
Contributor Author

OK that last commit implements a fairly straightforward solution I think?

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 9 changed files in this pull request and generated 2 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@myleshorton myleshorton marked this pull request as draft February 26, 2026 00:11
myleshorton and others added 5 commits February 25, 2026 17:20
- Fix URLOverrides lost through removeDuplicates: stash overrides
  before dedup and pass the stashed value to SetURLOverrides
- Persist URLOverrides through servers.Manager: clone in setServers
  and Servers so overrides survive save/load round-trips
- go.sum updated by go mod tidy

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The merge() function rebuilds Options without carrying URLOverrides,
so AddServers would silently drop them. Merge incoming URLOverrides
into the existing group's map alongside Locations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts:
#	go.mod
#	go.sum
#	vpn/tunnel.go
Update lantern-box to v0.0.6-0.20260304185010-31f62b643c0e (latest)
and resolve go.mod/go.sum merge conflicts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@myleshorton myleshorton marked this pull request as ready for review March 6, 2026 22:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants