From b20ab500aac175157d0c32e3bb23e7636d1aa280 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 16 Sep 2020 20:29:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E7=AC=A6=E7=BC=96?= =?UTF-8?q?=E7=A0=81/HTTP=20Header=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/rpc_client.go | 70 ++++--- .../servers/server/settings/charset/index.go | 41 ++++- .../servers/server/settings/charset/init.go | 2 +- .../servers/server/settings/gzip/index.go | 32 ++-- .../settings/headers/createDeletePopup.go | 57 ++++++ .../server/settings/headers/createSetPopup.go | 86 +++++++++ .../servers/server/settings/headers/delete.go | 118 ++++++++++++ .../settings/headers/deleteDeletingHeader.go | 48 +++++ .../servers/server/settings/headers/index.go | 72 +++++++- .../servers/server/settings/headers/init.go | 5 + .../server/settings/headers/updateSetPopup.go | 63 +++++++ .../servers/serverutils/server_helper.go | 2 +- .../js/components/server/charsets-box.js | 28 +++ .../js/components/server/header-policy-box.js | 173 ++++++++++++++++++ .../server/settings/charset/index.html | 6 +- .../servers/server/settings/charset/index.js | 3 + .../settings/headers/createDeletePopup.html | 15 ++ .../settings/headers/createDeletePopup.js | 3 + .../settings/headers/createSetPopup.html | 22 +++ .../server/settings/headers/createSetPopup.js | 3 + .../server/settings/headers/index.html | 2 +- .../settings/headers/updateSetPopup.html | 23 +++ .../server/settings/headers/updateSetPopup.js | 3 + 23 files changed, 827 insertions(+), 50 deletions(-) create mode 100644 internal/web/actions/default/servers/server/settings/headers/createDeletePopup.go create mode 100644 internal/web/actions/default/servers/server/settings/headers/createSetPopup.go create mode 100644 internal/web/actions/default/servers/server/settings/headers/delete.go create mode 100644 internal/web/actions/default/servers/server/settings/headers/deleteDeletingHeader.go create mode 100644 internal/web/actions/default/servers/server/settings/headers/updateSetPopup.go create mode 100644 web/public/js/components/server/charsets-box.js create mode 100644 web/public/js/components/server/header-policy-box.js create mode 100644 web/views/@default/servers/server/settings/charset/index.js create mode 100644 web/views/@default/servers/server/settings/headers/createDeletePopup.html create mode 100644 web/views/@default/servers/server/settings/headers/createDeletePopup.js create mode 100644 web/views/@default/servers/server/settings/headers/createSetPopup.html create mode 100644 web/views/@default/servers/server/settings/headers/createSetPopup.js create mode 100644 web/views/@default/servers/server/settings/headers/updateSetPopup.html create mode 100644 web/views/@default/servers/server/settings/headers/updateSetPopup.js diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 1e1ed985..126bfe8f 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -17,18 +17,20 @@ import ( ) type RPCClient struct { - apiConfig *configs.APIConfig - adminClients []pb.AdminServiceClient - nodeClients []pb.NodeServiceClient - nodeGrantClients []pb.NodeGrantServiceClient - nodeClusterClients []pb.NodeClusterServiceClient - nodeIPAddressClients []pb.NodeIPAddressServiceClient - serverClients []pb.ServerServiceClient - apiNodeClients []pb.APINodeServiceClient - originNodeClients []pb.OriginServerServiceClient - httpWebClients []pb.HTTPWebServiceClient - reverseProxyClients []pb.ReverseProxyServiceClient - httpGzipClients []pb.HTTPGzipServiceClient + apiConfig *configs.APIConfig + adminClients []pb.AdminServiceClient + nodeClients []pb.NodeServiceClient + nodeGrantClients []pb.NodeGrantServiceClient + nodeClusterClients []pb.NodeClusterServiceClient + nodeIPAddressClients []pb.NodeIPAddressServiceClient + serverClients []pb.ServerServiceClient + apiNodeClients []pb.APINodeServiceClient + originNodeClients []pb.OriginServerServiceClient + httpWebClients []pb.HTTPWebServiceClient + reverseProxyClients []pb.ReverseProxyServiceClient + httpGzipClients []pb.HTTPGzipServiceClient + httpHeaderPolicyClients []pb.HTTPHeaderPolicyServiceClient + httpHeaderClients []pb.HTTPHeaderServiceClient } func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) { @@ -47,6 +49,8 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) { httpWebClients := []pb.HTTPWebServiceClient{} reverseProxyClients := []pb.ReverseProxyServiceClient{} httpGzipClients := []pb.HTTPGzipServiceClient{} + httpHeaderPolicyClients := []pb.HTTPHeaderPolicyServiceClient{} + httpHeaderClients := []pb.HTTPHeaderServiceClient{} conns := []*grpc.ClientConn{} for _, endpoint := range apiConfig.RPC.Endpoints { @@ -73,21 +77,25 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) { httpWebClients = append(httpWebClients, pb.NewHTTPWebServiceClient(conn)) reverseProxyClients = append(reverseProxyClients, pb.NewReverseProxyServiceClient(conn)) httpGzipClients = append(httpGzipClients, pb.NewHTTPGzipServiceClient(conn)) + httpHeaderPolicyClients = append(httpHeaderPolicyClients, pb.NewHTTPHeaderPolicyServiceClient(conn)) + httpHeaderClients = append(httpHeaderClients, pb.NewHTTPHeaderServiceClient(conn)) } return &RPCClient{ - apiConfig: apiConfig, - adminClients: adminClients, - nodeClients: nodeClients, - nodeGrantClients: nodeGrantClients, - nodeClusterClients: nodeClusterClients, - nodeIPAddressClients: nodeIPAddressClients, - serverClients: serverClients, - apiNodeClients: apiNodeClients, - originNodeClients: originNodeClients, - httpWebClients: httpWebClients, - reverseProxyClients: reverseProxyClients, - httpGzipClients: httpGzipClients, + apiConfig: apiConfig, + adminClients: adminClients, + nodeClients: nodeClients, + nodeGrantClients: nodeGrantClients, + nodeClusterClients: nodeClusterClients, + nodeIPAddressClients: nodeIPAddressClients, + serverClients: serverClients, + apiNodeClients: apiNodeClients, + originNodeClients: originNodeClients, + httpWebClients: httpWebClients, + reverseProxyClients: reverseProxyClients, + httpGzipClients: httpGzipClients, + httpHeaderPolicyClients: httpHeaderPolicyClients, + httpHeaderClients: httpHeaderClients, }, nil } @@ -168,6 +176,20 @@ func (this *RPCClient) HTTPGzipRPC() pb.HTTPGzipServiceClient { return nil } +func (this *RPCClient) HTTPHeaderRPC() pb.HTTPHeaderServiceClient { + if len(this.httpHeaderClients) > 0 { + return this.httpHeaderClients[rands.Int(0, len(this.httpHeaderClients)-1)] + } + return nil +} + +func (this *RPCClient) HTTPHeaderPolicyRPC() pb.HTTPHeaderPolicyServiceClient { + if len(this.httpHeaderPolicyClients) > 0 { + return this.httpHeaderPolicyClients[rands.Int(0, len(this.httpHeaderPolicyClients)-1)] + } + return nil +} + func (this *RPCClient) Context(adminId int64) context.Context { ctx := context.Background() m := maps.Map{ diff --git a/internal/web/actions/default/servers/server/settings/charset/index.go b/internal/web/actions/default/servers/server/settings/charset/index.go index 13fb2ac1..6c27f5d0 100644 --- a/internal/web/actions/default/servers/server/settings/charset/index.go +++ b/internal/web/actions/default/servers/server/settings/charset/index.go @@ -1,7 +1,12 @@ package charset import ( + "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/configutils" + "github.com/iwind/TeaGo/actions" ) type IndexAction struct { @@ -16,7 +21,41 @@ func (this *IndexAction) Init() { func (this *IndexAction) RunGet(params struct { ServerId int64 }) { - // TODO + webConfigResp, err := this.RPC().ServerRPC().FindAndInitServerWebConfig(this.AdminContext(), &pb.FindAndInitServerWebRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + webConfig := &serverconfigs.HTTPWebConfig{} + err = json.Unmarshal(webConfigResp.Config, webConfig) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["webId"] = webConfig.Id + this.Data["charset"] = webConfig.Charset + + this.Data["usualCharsets"] = configutils.UsualCharsets + this.Data["allCharsets"] = configutils.AllCharsets this.Show() } + +func (this *IndexAction) RunPost(params struct { + WebId int64 + Charset string + + Must *actions.Must +}) { + _, err := this.RPC().HTTPWebRPC().UpdateHTTPWebCharset(this.AdminContext(), &pb.UpdateHTTPWebCharsetRequest{ + WebId: params.WebId, + Charset: params.Charset, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/charset/init.go b/internal/web/actions/default/servers/server/settings/charset/init.go index 532456ea..2cb835ec 100644 --- a/internal/web/actions/default/servers/server/settings/charset/init.go +++ b/internal/web/actions/default/servers/server/settings/charset/init.go @@ -12,7 +12,7 @@ func init() { Helper(helpers.NewUserMustAuth()). Helper(serverutils.NewServerHelper()). Prefix("/servers/server/settings/charset"). - Get("", new(IndexAction)). + GetPost("", new(IndexAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/server/settings/gzip/index.go b/internal/web/actions/default/servers/server/settings/gzip/index.go index d631e36a..1d0d151e 100644 --- a/internal/web/actions/default/servers/server/settings/gzip/index.go +++ b/internal/web/actions/default/servers/server/settings/gzip/index.go @@ -2,9 +2,7 @@ package gzip import ( "encoding/json" - "errors" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" @@ -22,32 +20,26 @@ func (this *IndexAction) Init() { func (this *IndexAction) RunGet(params struct { ServerId int64 }) { - server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId) - if !isOk { + webConfigResp, err := this.RPC().ServerRPC().FindAndInitServerWebConfig(this.AdminContext(), &pb.FindAndInitServerWebRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + webConfig := &serverconfigs.HTTPWebConfig{} + err = json.Unmarshal(webConfigResp.Config, webConfig) + if err != nil { + this.ErrorPage(err) return } - webId := server.WebId - if webId <= 0 { - resp, err := this.RPC().ServerRPC().InitServerWeb(this.AdminContext(), &pb.InitServerWebRequest{ServerId: params.ServerId}) - if err != nil { - this.ErrorPage(err) - return - } - webId = resp.WebId - } - - webResp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWeb(this.AdminContext(), &pb.FindEnabledHTTPWebRequest{WebId: webId}) + webResp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWeb(this.AdminContext(), &pb.FindEnabledHTTPWebRequest{WebId: webConfig.Id}) if err != nil { this.ErrorPage(err) return } web := webResp.Web - if web == nil { - this.ErrorPage(errors.New("web should not be nil")) - return - } - this.Data["webId"] = web.Id + + this.Data["webId"] = webConfig.Id gzipId := web.GzipId gzipConfig := &serverconfigs.HTTPGzipConfig{ diff --git a/internal/web/actions/default/servers/server/settings/headers/createDeletePopup.go b/internal/web/actions/default/servers/server/settings/headers/createDeletePopup.go new file mode 100644 index 00000000..be76f151 --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/headers/createDeletePopup.go @@ -0,0 +1,57 @@ +package headers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" + "github.com/iwind/TeaGo/actions" +) + +type CreateDeletePopupAction struct { + actionutils.ParentAction +} + +func (this *CreateDeletePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreateDeletePopupAction) RunGet(params struct { + HeaderPolicyId int64 +}) { + this.Data["headerPolicyId"] = params.HeaderPolicyId + + this.Show() +} + +func (this *CreateDeletePopupAction) RunPost(params struct { + HeaderPolicyId int64 + Name string + + Must *actions.Must +}) { + policyConfigResp, err := this.RPC().HTTPHeaderPolicyRPC().FindEnabledHTTPHeaderPolicyConfig(this.AdminContext(), &pb.FindEnabledHTTPHeaderPolicyConfigRequest{HeaderPolicyId: params.HeaderPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + policyConfig := &shared.HTTPHeaderPolicy{} + err = json.Unmarshal(policyConfigResp.Config, policyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + deleteHeaders := policyConfig.DeletedHeaders + deleteHeaders = append(deleteHeaders, params.Name) + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicyDeletingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicyDeletingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeaderNames: deleteHeaders, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/headers/createSetPopup.go b/internal/web/actions/default/servers/server/settings/headers/createSetPopup.go new file mode 100644 index 00000000..f5e611a3 --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/headers/createSetPopup.go @@ -0,0 +1,86 @@ +package headers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" + "github.com/iwind/TeaGo/actions" +) + +type CreateSetPopupAction struct { + actionutils.ParentAction +} + +func (this *CreateSetPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreateSetPopupAction) RunGet(params struct { + ServerId int64 + HeaderPolicyId int64 +}) { + this.Data["headerPolicyId"] = params.HeaderPolicyId + + this.Show() +} + +func (this *CreateSetPopupAction) RunPost(params struct { + HeaderPolicyId int64 + Name string + Value string + + Must *actions.Must +}) { + params.Must. + Field("name", params.Name). + Require("请输入Header名称") + + configResp, err := this.RPC().HTTPHeaderPolicyRPC().FindEnabledHTTPHeaderPolicyConfig(this.AdminContext(), &pb.FindEnabledHTTPHeaderPolicyConfigRequest{HeaderPolicyId: params.HeaderPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + policyConfig := &shared.HTTPHeaderPolicy{} + err = json.Unmarshal(configResp.Config, policyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + // 创建Header + createHeaderResp, err := this.RPC().HTTPHeaderRPC().CreateHTTPHeader(this.AdminContext(), &pb.CreateHTTPHeaderRequest{ + Name: params.Name, + Value: params.Value, + }) + if err != nil { + this.ErrorPage(err) + return + } + headerId := createHeaderResp.HeaderId + + // 保存 + policyConfig.SetHeaders = append(policyConfig.SetHeaders, &shared.HTTPHeaderConfig{ + Id: headerId, + IsOn: true, + Name: params.Name, + Value: params.Value, + Status: nil, + }) + setHeadersJSON, err := json.Marshal(policyConfig.SetHeaders) + if err != nil { + this.ErrorPage(err) + return + } + + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicySettingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicySettingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeadersJSON: setHeadersJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/headers/delete.go b/internal/web/actions/default/servers/server/settings/headers/delete.go new file mode 100644 index 00000000..93e69aa5 --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/headers/delete.go @@ -0,0 +1,118 @@ +package headers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" +) + +// 删除Header +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + HeaderPolicyId int64 + Type string + HeaderId int64 +}) { + policyConfigResp, err := this.RPC().HTTPHeaderPolicyRPC().FindEnabledHTTPHeaderPolicyConfig(this.AdminContext(), &pb.FindEnabledHTTPHeaderPolicyConfigRequest{ + HeaderPolicyId: params.HeaderPolicyId, + }) + if err != nil { + this.ErrorPage(err) + return + } + policyConfig := &shared.HTTPHeaderPolicy{} + err = json.Unmarshal(policyConfigResp.Config, policyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + switch params.Type { + case "addHeader": + result := []*shared.HTTPHeaderConfig{} + for _, h := range policyConfig.AddHeaders { + if h.Id != params.HeaderId { + result = append(result, h) + } + } + resultJSON, err := json.Marshal(result) + if err != nil { + this.ErrorPage(err) + return + } + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicyAddingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicyAddingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeadersJSON: resultJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + case "setHeader": + result := []*shared.HTTPHeaderConfig{} + for _, h := range policyConfig.SetHeaders { + if h.Id != params.HeaderId { + result = append(result, h) + } + } + resultJSON, err := json.Marshal(result) + if err != nil { + this.ErrorPage(err) + return + } + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicySettingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicySettingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeadersJSON: resultJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + case "replace": + result := []*shared.HTTPHeaderConfig{} + for _, h := range policyConfig.ReplaceHeaders { + if h.Id != params.HeaderId { + result = append(result, h) + } + } + resultJSON, err := json.Marshal(result) + if err != nil { + this.ErrorPage(err) + return + } + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicyReplacingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicyReplacingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeadersJSON: resultJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + case "addTrailer": + result := []*shared.HTTPHeaderConfig{} + for _, h := range policyConfig.AddTrailers { + if h.Id != params.HeaderId { + result = append(result, h) + } + } + resultJSON, err := json.Marshal(result) + if err != nil { + this.ErrorPage(err) + return + } + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicyAddingTrailers(this.AdminContext(), &pb.UpdateHTTPHeaderPolicyAddingTrailersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeadersJSON: resultJSON, + }) + if err != nil { + this.ErrorPage(err) + return + } + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/headers/deleteDeletingHeader.go b/internal/web/actions/default/servers/server/settings/headers/deleteDeletingHeader.go new file mode 100644 index 00000000..4a0ceb25 --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/headers/deleteDeletingHeader.go @@ -0,0 +1,48 @@ +package headers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" +) + +type DeleteDeletingHeaderAction struct { + actionutils.ParentAction +} + +func (this *DeleteDeletingHeaderAction) RunPost(params struct { + HeaderPolicyId int64 + HeaderName string +}) { + policyConfigResp, err := this.RPC().HTTPHeaderPolicyRPC().FindEnabledHTTPHeaderPolicyConfig(this.AdminContext(), &pb.FindEnabledHTTPHeaderPolicyConfigRequest{HeaderPolicyId: params.HeaderPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + policyConfigJSON := policyConfigResp.Config + policyConfig := &shared.HTTPHeaderPolicy{} + err = json.Unmarshal(policyConfigJSON, policyConfig) + if err != nil { + this.ErrorPage(err) + return + } + + headerNames := []string{} + for _, h := range policyConfig.DeletedHeaders { + if h == params.HeaderName { + continue + } + headerNames = append(headerNames, h) + } + _, err = this.RPC().HTTPHeaderPolicyRPC().UpdateHTTPHeaderPolicyDeletingHeaders(this.AdminContext(), &pb.UpdateHTTPHeaderPolicyDeletingHeadersRequest{ + HeaderPolicyId: params.HeaderPolicyId, + HeaderNames: headerNames, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/headers/index.go b/internal/web/actions/default/servers/server/settings/headers/index.go index 502a000e..4feaaa26 100644 --- a/internal/web/actions/default/servers/server/settings/headers/index.go +++ b/internal/web/actions/default/servers/server/settings/headers/index.go @@ -1,7 +1,11 @@ package headers import ( + "encoding/json" + "errors" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" ) type IndexAction struct { @@ -16,7 +20,73 @@ func (this *IndexAction) Init() { func (this *IndexAction) RunGet(params struct { ServerId int64 }) { - // TODO + webConfigResp, err := this.RPC().ServerRPC().FindAndInitServerWebConfig(this.AdminContext(), &pb.FindAndInitServerWebRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + webConfig := &serverconfigs.HTTPWebConfig{} + err = json.Unmarshal(webConfigResp.Config, webConfig) + if err != nil { + this.ErrorPage(err) + return + } + + // 初始化Header + webResp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWeb(this.AdminContext(), &pb.FindEnabledHTTPWebRequest{WebId: webConfig.Id}) + if err != nil { + this.ErrorPage(err) + return + } + web := webResp.Web + if web == nil { + this.ErrorPage(errors.New("web should not be nil")) + return + } + isChanged := false + if web.RequestHeaderPolicyId <= 0 { + createHeaderPolicyResp, err := this.RPC().HTTPHeaderPolicyRPC().CreateHTTPHeaderPolicy(this.AdminContext(), &pb.CreateHTTPHeaderPolicyRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + headerPolicyId := createHeaderPolicyResp.HeaderPolicyId + _, err = this.RPC().HTTPWebRPC().UpdateHTTPWebRequestHeaderPolicy(this.AdminContext(), &pb.UpdateHTTPWebRequestHeaderPolicyRequest{ + WebId: web.Id, + HeaderPolicyId: headerPolicyId, + }) + isChanged = true + } + if web.ResponseHeaderPolicyId <= 0 { + createHeaderPolicyResp, err := this.RPC().HTTPHeaderPolicyRPC().CreateHTTPHeaderPolicy(this.AdminContext(), &pb.CreateHTTPHeaderPolicyRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + headerPolicyId := createHeaderPolicyResp.HeaderPolicyId + _, err = this.RPC().HTTPWebRPC().UpdateHTTPWebResponseHeaderPolicy(this.AdminContext(), &pb.UpdateHTTPWebResponseHeaderPolicyRequest{ + WebId: web.Id, + HeaderPolicyId: headerPolicyId, + }) + isChanged = true + } + + // 重新获取配置 + if isChanged { + webConfigResp, err := this.RPC().ServerRPC().FindAndInitServerWebConfig(this.AdminContext(), &pb.FindAndInitServerWebRequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + err = json.Unmarshal(webConfigResp.Config, webConfig) + if err != nil { + this.ErrorPage(err) + return + } + } + + this.Data["requestHeaderPolicy"] = webConfig.RequestHeaders + this.Data["responseHeaderPolicy"] = webConfig.ResponseHeaders this.Show() } diff --git a/internal/web/actions/default/servers/server/settings/headers/init.go b/internal/web/actions/default/servers/server/settings/headers/init.go index 5e3aaee2..590fa76b 100644 --- a/internal/web/actions/default/servers/server/settings/headers/init.go +++ b/internal/web/actions/default/servers/server/settings/headers/init.go @@ -13,6 +13,11 @@ func init() { Helper(serverutils.NewServerHelper()). Prefix("/servers/server/settings/headers"). Get("", new(IndexAction)). + GetPost("/createSetPopup", new(CreateSetPopupAction)). + GetPost("/updateSetPopup", new(UpdateSetPopupAction)). + GetPost("/createDeletePopup", new(CreateDeletePopupAction)). + Post("/deleteDeletingHeader", new(DeleteDeletingHeaderAction)). + Post("/delete", new(DeleteAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/server/settings/headers/updateSetPopup.go b/internal/web/actions/default/servers/server/settings/headers/updateSetPopup.go new file mode 100644 index 00000000..74a0c1dc --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/headers/updateSetPopup.go @@ -0,0 +1,63 @@ +package headers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" + "github.com/iwind/TeaGo/actions" +) + +type UpdateSetPopupAction struct { + actionutils.ParentAction +} + +func (this *UpdateSetPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdateSetPopupAction) RunGet(params struct { + HeaderPolicyId int64 + HeaderId int64 +}) { + this.Data["headerPolicyId"] = params.HeaderPolicyId + this.Data["headerId"] = params.HeaderId + + headerResp, err := this.RPC().HTTPHeaderRPC().FindEnabledHTTPHeaderConfig(this.AdminContext(), &pb.FindEnabledHTTPHeaderConfigRequest{HeaderId: params.HeaderId}) + if err != nil { + this.ErrorPage(err) + return + } + headerConfig := &shared.HTTPHeaderConfig{} + err = json.Unmarshal(headerResp.Config, headerConfig) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["headerConfig"] = headerConfig + + this.Show() +} + +func (this *UpdateSetPopupAction) RunPost(params struct { + HeaderId int64 + Name string + Value string + + Must *actions.Must +}) { + params.Must. + Field("name", params.Name). + Require("请输入Header名称") + + _, err := this.RPC().HTTPHeaderRPC().UpdateHTTPHeader(this.AdminContext(), &pb.UpdateHTTPHeaderRequest{ + HeaderId: params.HeaderId, + Name: params.Name, + Value: params.Value, + }) + if err != nil { + this.ErrorPage(err) + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/serverutils/server_helper.go b/internal/web/actions/default/servers/serverutils/server_helper.go index 61dea778..688ef764 100644 --- a/internal/web/actions/default/servers/serverutils/server_helper.go +++ b/internal/web/actions/default/servers/serverutils/server_helper.go @@ -201,7 +201,7 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri }) menuItems = append(menuItems, maps.Map{ - "name": "字符集", + "name": "字符编码", "url": "/servers/server/settings/charset?serverId=" + serverIdString, "isActive": secondMenuItem == "charset", }) diff --git a/web/public/js/components/server/charsets-box.js b/web/public/js/components/server/charsets-box.js new file mode 100644 index 00000000..9fb20ea1 --- /dev/null +++ b/web/public/js/components/server/charsets-box.js @@ -0,0 +1,28 @@ +Vue.component("charsets-box", { + props: ["v-usual-charsets", "v-all-charsets", "v-charset"], + data: function () { + let charset = this.vCharset + if (charset == null) { + charset = "" + } + return { + charset: charset + } + }, + template: `
+ + + + + +
选择字符编码 +
+
+
` +}) \ No newline at end of file diff --git a/web/public/js/components/server/header-policy-box.js b/web/public/js/components/server/header-policy-box.js new file mode 100644 index 00000000..0ff5b9df --- /dev/null +++ b/web/public/js/components/server/header-policy-box.js @@ -0,0 +1,173 @@ +Vue.component("header-policy-box", { + props: ["v-request-header-policy", "v-response-header-policy", "v-params"], + data: function () { + let type = "request" + let hash = window.location.hash + if (hash == "#response") { + type = "response" + } + + // 请求相关 + let requestSettingHeaders = [] + let requestDeletingHeaders = [] + + let requestPolicy = this.vRequestHeaderPolicy + if (requestPolicy != null) { + if (requestPolicy.setHeaders != null) { + requestSettingHeaders = requestPolicy.setHeaders + } + if (requestPolicy.deleteHeaders != null) { + requestDeletingHeaders = requestPolicy.deleteHeaders + } + } + + // 响应相关 + let responseSettingHeaders = [] + let responseDeletingHeaders = [] + + let responsePolicy = this.vResponseHeaderPolicy + if (responsePolicy != null) { + if (responsePolicy.setHeaders != null) { + responseSettingHeaders = responsePolicy.setHeaders + } + if (responsePolicy.deleteHeaders != null) { + responseDeletingHeaders = responsePolicy.deleteHeaders + } + } + + return { + type: type, + requestSettingHeaders: requestSettingHeaders, + requestDeletingHeaders: requestDeletingHeaders, + responseSettingHeaders: responseSettingHeaders, + responseDeletingHeaders: responseDeletingHeaders + } + }, + methods: { + selectType: function (type) { + this.type = type + window.location.hash = "#" + type + }, + addSettingHeader: function (policyId) { + teaweb.popup("/servers/server/settings/headers/createSetPopup?" + this.vParams + "&headerPolicyId=" + policyId, { + callback: function () { + window.location.reload() + } + }) + }, + addDeletingHeader: function (policyId, type) { + teaweb.popup("/servers/server/settings/headers/createDeletePopup?" + this.vParams + "&headerPolicyId=" + policyId + "&type=" + type, { + callback: function () { + window.location.reload() + } + }) + }, + updateSettingPopup: function (policyId, headerId) { + teaweb.popup("/servers/server/settings/headers/updateSetPopup?" + this.vParams + "&headerPolicyId=" + policyId + "&headerId=" + headerId, { + callback: function () { + window.location.reload() + } + }) + }, + deleteDeletingHeader: function (policyId, headerName) { + teaweb.confirm("确定要删除'" + headerName + "'吗?", function () { + Tea.action("/servers/server/settings/headers/deleteDeletingHeader") + .params({ + headerPolicyId: policyId, + headerName: headerName + }) + .post() + .refresh() + }) + }, + deleteHeader: function (policyId, type, headerId) { + teaweb.confirm("确定要删除此Header吗?", function () { + this.$post("/servers/server/settings/headers/delete") + .params({ + headerPolicyId: policyId, + type: type, + headerId: headerId + }) + .refresh() + } + ) + } + }, + template: `
+ + 请求Header + 响应Header + + +
+ + +
+

设置Header [添加新Header]

+

暂时还没有Header。

+ + + + + + + + + + + + + +
名称操作
{{header.name}}{{header.value}}修改   删除
+ +

删除Header

+

这里可以设置需要从请求中删除的Header。

+ + + + +
需要删除的Header +
+
{{headerName}}
+
+
+ +
+
+ + +
+

设置Header [添加新Header]

+

暂时还没有Header。

+ + + + + + + + + + + + + +
名称操作
{{header.name}}{{header.value}}修改   删除
+ +

删除Header

+

这里可以设置需要从响应中删除的Header。

+ + + + +
需要删除的Header +
+
{{headerName}}
+
+
+ +
+
+ +
` +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/settings/charset/index.html b/web/views/@default/servers/server/settings/charset/index.html index eae519e9..f867a040 100644 --- a/web/views/@default/servers/server/settings/charset/index.html +++ b/web/views/@default/servers/server/settings/charset/index.html @@ -3,5 +3,9 @@ {$template "/left_menu"}
-

此功能暂未开放,敬请期待。

+
+ + + +
\ No newline at end of file diff --git a/web/views/@default/servers/server/settings/charset/index.js b/web/views/@default/servers/server/settings/charset/index.js new file mode 100644 index 00000000..295a9aaf --- /dev/null +++ b/web/views/@default/servers/server/settings/charset/index.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/settings/headers/createDeletePopup.html b/web/views/@default/servers/server/settings/headers/createDeletePopup.html new file mode 100644 index 00000000..e8084a70 --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/createDeletePopup.html @@ -0,0 +1,15 @@ +{$layout "layout_popup"} + +

添加需要删除的Header

+
+ + + + + + +
名称(Name) + +
+ +
diff --git a/web/views/@default/servers/server/settings/headers/createDeletePopup.js b/web/views/@default/servers/server/settings/headers/createDeletePopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/createDeletePopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/settings/headers/createSetPopup.html b/web/views/@default/servers/server/settings/headers/createSetPopup.html new file mode 100644 index 00000000..f83492e6 --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/createSetPopup.html @@ -0,0 +1,22 @@ +{$layout "layout_popup"} +

设置Header

+ +
+ + + + + + + + + + + +
名称(Name) + +
(Value) + +
+ +
diff --git a/web/views/@default/servers/server/settings/headers/createSetPopup.js b/web/views/@default/servers/server/settings/headers/createSetPopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/createSetPopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/settings/headers/index.html b/web/views/@default/servers/server/settings/headers/index.html index eae519e9..a7d0aa52 100644 --- a/web/views/@default/servers/server/settings/headers/index.html +++ b/web/views/@default/servers/server/settings/headers/index.html @@ -3,5 +3,5 @@ {$template "/left_menu"}
-

此功能暂未开放,敬请期待。

+
\ No newline at end of file diff --git a/web/views/@default/servers/server/settings/headers/updateSetPopup.html b/web/views/@default/servers/server/settings/headers/updateSetPopup.html new file mode 100644 index 00000000..6fd1c02e --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/updateSetPopup.html @@ -0,0 +1,23 @@ +{$layout "layout_popup"} +

修改Header

+ +
+ + + + + + + + + + + + +
名称(Name) + +
(Value) + +
+ +
diff --git a/web/views/@default/servers/server/settings/headers/updateSetPopup.js b/web/views/@default/servers/server/settings/headers/updateSetPopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/servers/server/settings/headers/updateSetPopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file