5 Commits

Author SHA1 Message Date
Toby Chui
5c8e4a7df1 Fixed priority sort logic for HTTP proxy rule
Fixed proxy rule sort logic from alphabetical to best match
2025-10-21 07:52:07 +08:00
Toby Chui
298444a53f Merge pull request #858 from tobychui/main
master branch sync
2025-10-19 22:18:48 +08:00
Toby Chui
41cf0cc2c7 Fixed #856
Updated upstreamHostSwap to accept currentTarget and avoid swapping to the same proxy endpoint, preventing unnecessary loopback handling. Also bumped SYSTEM_VERSION to 3.2.9.
2025-10-19 22:11:58 +08:00
Toby Chui
863113a1b8 Merge pull request #853 from Morethanevil/main
Update CHANGELOG.md
2025-10-18 10:17:06 +08:00
Marcel
aa9036fa8b Update CHANGELOG.md 2025-10-17 16:23:35 +02:00
3 changed files with 32 additions and 8 deletions

View File

@@ -1,3 +1,10 @@
# v3.2.8 16 Oct 2025
+ Fixed wildcard certificate bug [#845](https://github.com/tobychui/zoraxy/issues/845) by [zen8841](https://github.com/zen8841)
+ Move function:NormalizeDomain to netutils module by [zen8841](https://github.com/zen8841)
+ Add support for Proxy Protocol V1 and V2 in streamproxy configuration by [jemmy1794](https://github.com/jemmy1794)
+ Added user selectable versions for TLS
# v3.2.7 09 Oct 2025
+ Update Sidebar CSS by [Saeraphinx](https://github.com/Saeraphinx)

View File

@@ -44,7 +44,7 @@ import (
const (
/* Build Constants */
SYSTEM_NAME = "Zoraxy"
SYSTEM_VERSION = "3.2.8"
SYSTEM_VERSION = "3.2.9"
DEVELOPMENT_BUILD = false
/* System Constants */

View File

@@ -51,6 +51,11 @@ func (router *Router) GetProxyEndpointFromHostname(hostname string) *ProxyEndpoi
matchProxyEndpoints := []*ProxyEndpoint{}
router.ProxyEndpoints.Range(func(k, v interface{}) bool {
ep := v.(*ProxyEndpoint)
if ep.Disabled {
//Skip disabled endpoint
return true
}
match, err := filepath.Match(ep.RootOrMatchingDomain, hostname)
if err != nil {
//Bad pattern. Skip this rule
@@ -83,12 +88,24 @@ func (router *Router) GetProxyEndpointFromHostname(hostname string) *ProxyEndpoi
})
if len(matchProxyEndpoints) == 1 {
//Only 1 match
return matchProxyEndpoints[0]
} else if len(matchProxyEndpoints) > 1 {
//More than one match. Get the best match one
sort.Slice(matchProxyEndpoints, func(i, j int) bool {
return matchProxyEndpoints[i].RootOrMatchingDomain < matchProxyEndpoints[j].RootOrMatchingDomain
// More than one match, pick one that is:
// 1. longer RootOrMatchingDomain (more specific)
// 2. fewer wildcard characters (* and ?) (more specific)
// 3. fallback to lexicographic order
sort.SliceStable(matchProxyEndpoints, func(i, j int) bool {
a := matchProxyEndpoints[i].RootOrMatchingDomain
b := matchProxyEndpoints[j].RootOrMatchingDomain
if len(a) != len(b) {
return len(a) > len(b)
}
aw := strings.Count(a, "*") + strings.Count(a, "?")
bw := strings.Count(b, "*") + strings.Count(b, "?")
if aw != bw {
return aw < bw
}
return a < b
})
return matchProxyEndpoints[0]
}
@@ -110,13 +127,13 @@ func (router *Router) rewriteURL(rooturl string, requestURL string) string {
// upstreamHostSwap check if this loopback to one of the proxy rule in the system. If yes, do a shortcut target swap
// this prevents unnecessary external DNS lookup and connection, return true if swapped and request is already handled
// by the loopback handler. Only continue if return is false
func (h *ProxyHandler) upstreamHostSwap(w http.ResponseWriter, r *http.Request, selectedUpstream *loadbalance.Upstream) bool {
func (h *ProxyHandler) upstreamHostSwap(w http.ResponseWriter, r *http.Request, selectedUpstream *loadbalance.Upstream, currentTarget *ProxyEndpoint) bool {
upstreamHostname := selectedUpstream.OriginIpOrDomain
if strings.Contains(upstreamHostname, ":") {
upstreamHostname = strings.Split(upstreamHostname, ":")[0]
}
loopbackProxyEndpoint := h.Parent.GetProxyEndpointFromHostname(upstreamHostname)
if loopbackProxyEndpoint != nil {
if loopbackProxyEndpoint != nil && loopbackProxyEndpoint != currentTarget {
//This is a loopback request. Swap the target to the loopback target
//h.Parent.Option.Logger.PrintAndLog("proxy", "Detected a loopback request to self. Swap the target to "+loopbackProxyEndpoint.RootOrMatchingDomain, nil)
if loopbackProxyEndpoint.IsEnabled() {
@@ -147,7 +164,7 @@ func (h *ProxyHandler) hostRequest(w http.ResponseWriter, r *http.Request, targe
}
/* Upstream Host Swap (use to detect loopback to self) */
if h.upstreamHostSwap(w, r, selectedUpstream) {
if h.upstreamHostSwap(w, r, selectedUpstream, target) {
//Request handled by the loopback handler
return
}