|
|
@@ -4,6 +4,7 @@ package dispatcher
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "regexp"
|
|
|
"strings"
|
|
|
"sync"
|
|
|
"time"
|
|
|
@@ -186,8 +187,20 @@ func (d *DefaultDispatcher) shouldOverride(ctx context.Context, result SniffResu
|
|
|
return false
|
|
|
}
|
|
|
for _, d := range request.ExcludeForDomain {
|
|
|
- if strings.ToLower(domain) == d {
|
|
|
- return false
|
|
|
+ if strings.HasPrefix(d, "regexp:") {
|
|
|
+ pattern := d[7:]
|
|
|
+ re, err := regexp.Compile(pattern)
|
|
|
+ if err != nil {
|
|
|
+ newError("Unable to compile regex").WriteToLog(session.ExportIDToError(ctx))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if re.MatchString(domain) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if strings.ToLower(domain) == d {
|
|
|
+ return false
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
protocolString := result.Protocol()
|
|
|
@@ -223,7 +236,7 @@ func (d *DefaultDispatcher) Dispatch(ctx context.Context, destination net.Destin
|
|
|
outbounds = []*session.Outbound{{}}
|
|
|
ctx = session.ContextWithOutbounds(ctx, outbounds)
|
|
|
}
|
|
|
- ob := outbounds[len(outbounds) - 1]
|
|
|
+ ob := outbounds[len(outbounds)-1]
|
|
|
ob.OriginalTarget = destination
|
|
|
ob.Target = destination
|
|
|
content := session.ContentFromContext(ctx)
|
|
|
@@ -280,7 +293,7 @@ func (d *DefaultDispatcher) DispatchLink(ctx context.Context, destination net.De
|
|
|
outbounds = []*session.Outbound{{}}
|
|
|
ctx = session.ContextWithOutbounds(ctx, outbounds)
|
|
|
}
|
|
|
- ob := outbounds[len(outbounds) - 1]
|
|
|
+ ob := outbounds[len(outbounds)-1]
|
|
|
ob.OriginalTarget = destination
|
|
|
ob.Target = destination
|
|
|
content := session.ContentFromContext(ctx)
|
|
|
@@ -371,7 +384,7 @@ func sniffer(ctx context.Context, cReader *cachedReader, metadataOnly bool, netw
|
|
|
}
|
|
|
func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport.Link, destination net.Destination) {
|
|
|
outbounds := session.OutboundsFromContext(ctx)
|
|
|
- ob := outbounds[len(outbounds) - 1]
|
|
|
+ ob := outbounds[len(outbounds)-1]
|
|
|
if hosts, ok := d.dns.(dns.HostsLookup); ok && destination.Address.Family().IsDomain() {
|
|
|
proxied := hosts.LookupHosts(ob.Target.String())
|
|
|
if proxied != nil {
|