diff --git a/internal/nodes/http_request_page.go b/internal/nodes/http_request_page.go index 6a68abd..b7d5c84 100644 --- a/internal/nodes/http_request_page.go +++ b/internal/nodes/http_request_page.go @@ -1,6 +1,7 @@ package nodes import ( + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/utils" @@ -16,10 +17,36 @@ var urlPrefixRegexp = regexp.MustCompile("^(?i)(http|https|ftp)://") // 请求特殊页面 func (this *HTTPRequest) doPage(status int) (shouldStop bool) { if len(this.web.Pages) == 0 { + // 集群自定义页面 + if this.nodeConfig != nil && this.ReqServer != nil { + var httpPagesPolicy = this.nodeConfig.FindHTTPPagesPolicyWithClusterId(this.ReqServer.ClusterId) + if httpPagesPolicy != nil && httpPagesPolicy.IsOn && len(httpPagesPolicy.Pages) > 0 { + return this.doPageLookup(httpPagesPolicy.Pages, status) + } + } + return false } - for _, page := range this.web.Pages { + // 查找当前网站自定义页面 + shouldStop = this.doPageLookup(this.web.Pages, status) + if shouldStop { + return + } + + // 集群自定义页面 + if this.nodeConfig != nil && this.ReqServer != nil { + var httpPagesPolicy = this.nodeConfig.FindHTTPPagesPolicyWithClusterId(this.ReqServer.ClusterId) + if httpPagesPolicy != nil && httpPagesPolicy.IsOn && len(httpPagesPolicy.Pages) > 0 { + return this.doPageLookup(httpPagesPolicy.Pages, status) + } + } + + return +} + +func (this *HTTPRequest) doPageLookup(pages []*serverconfigs.HTTPPageConfig, status int) (shouldStop bool) { + for _, page := range pages { if page.Match(status) { if len(page.BodyType) == 0 || page.BodyType == shared.BodyTypeURL { if urlPrefixRegexp.MatchString(page.URL) { diff --git a/internal/nodes/node_tasks.go b/internal/nodes/node_tasks.go index e608098..1b7b921 100644 --- a/internal/nodes/node_tasks.go +++ b/internal/nodes/node_tasks.go @@ -80,6 +80,8 @@ func (this *Node) execTask(rpcClient *rpc.RPCClient, task *pb.NodeTask) error { err = this.execUserServersStateChangedTask(rpcClient, task) case "uamPolicyChanged": err = this.execUAMPolicyChangedTask(rpcClient) + case "httpPagesPolicyChanged": + err = this.execHTTPPagesPolicyChangedTask(rpcClient) case "updatingServers": err = this.execUpdatingServersTask(rpcClient) case "plusChanged": @@ -187,6 +189,34 @@ func (this *Node) execUAMPolicyChangedTask(rpcClient *rpc.RPCClient) error { return nil } +// 自定义页面策略变更 +func (this *Node) execHTTPPagesPolicyChangedTask(rpcClient *rpc.RPCClient) error { + remotelogs.Println("NODE", "updating http pages policies ...") + resp, err := rpcClient.NodeRPC.FindNodeHTTPPagesPolicies(rpcClient.Context(), &pb.FindNodeHTTPPagesPoliciesRequest{}) + if err != nil { + return err + } + var httpPagesPolicyMap = map[int64]*nodeconfigs.HTTPPagesPolicy{} + for _, policy := range resp.HttpPagesPolicies { + if len(policy.HttpPagesPolicyJSON) > 0 { + var httpPagesPolicy = nodeconfigs.NewHTTPPagesPolicy() + err = json.Unmarshal(policy.HttpPagesPolicyJSON, httpPagesPolicy) + if err != nil { + remotelogs.Error("NODE", "decode http pages policy failed: "+err.Error()) + continue + } + err = httpPagesPolicy.Init() + if err != nil { + remotelogs.Error("NODE", "initialize http pages policy failed: "+err.Error()) + continue + } + httpPagesPolicyMap[policy.NodeClusterId] = httpPagesPolicy + } + } + sharedNodeConfig.UpdateHTTPPagesPolicies(httpPagesPolicyMap) + return nil +} + // DDoS配置变更 func (this *Node) execDDoSProtectionChangedTask(rpcClient *rpc.RPCClient) error { resp, err := rpcClient.NodeRPC.FindNodeDDoSProtection(rpcClient.Context(), &pb.FindNodeDDoSProtectionRequest{})