diff --git a/go.mod b/go.mod index ad633cd5..7f9b7bf0 100644 --- a/go.mod +++ b/go.mod @@ -6,11 +6,11 @@ replace github.com/TeaOSLab/EdgeCommon => ../EdgeCommon require ( github.com/TeaOSLab/EdgeCommon v0.0.0-00010101000000-000000000000 - github.com/TeaOSLab/EdgePlus v0.0.0-00010101000000-000000000000 github.com/aliyun/alibaba-cloud-sdk-go v1.61.1755 github.com/andybalholm/brotli v1.0.4 github.com/cespare/xxhash v1.1.0 github.com/cespare/xxhash/v2 v2.1.1 + github.com/fsnotify/fsnotify v1.6.0 github.com/go-acme/lego/v4 v4.10.2 github.com/go-sql-driver/mysql v1.7.0 github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible @@ -30,7 +30,6 @@ require ( require ( github.com/cenkalti/backoff/v4 v4.2.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -42,6 +41,8 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/smartwalle/crypto4go v1.0.2 // indirect + github.com/tdewolff/minify/v2 v2.12.7 // indirect + github.com/tdewolff/parse/v2 v2.6.6 // indirect github.com/technoweenie/multipartstreamer v1.0.1 // indirect github.com/tklauser/go-sysconf v0.3.9 // indirect github.com/tklauser/numcpus v0.3.0 // indirect diff --git a/go.sum b/go.sum index 5a8f8575..02f94170 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,7 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -30,6 +31,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200624174652-8d2f3be8b2d9/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -81,14 +84,6 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= -github.com/iwind/TeaGo v0.0.0-20230304012706-c1f4a4e27470 h1:TuRxvKRv9PxKVijWOkUnZm5TeanQqWGUJyPx9u6cra4= -github.com/iwind/TeaGo v0.0.0-20230304012706-c1f4a4e27470/go.mod h1:fi/Pq+/5m2HZoseM+39dMF57ANXRt6w4PkGu3NXPc5s= -github.com/iwind/TeaGo v0.0.0-20230623080147-cd1e53b4915f h1:xo6XmXLtveKcwcZAXV6VMxkWNzy/2dStfHEnyowsGAE= -github.com/iwind/TeaGo v0.0.0-20230623080147-cd1e53b4915f/go.mod h1:fi/Pq+/5m2HZoseM+39dMF57ANXRt6w4PkGu3NXPc5s= -github.com/iwind/TeaGo v0.0.0-20230630104525-161f0b32996d h1:XnTIj781NdSipts60fVqbgZorVAKVSRaA6nqVNfBQ1g= -github.com/iwind/TeaGo v0.0.0-20230630104525-161f0b32996d/go.mod h1:fi/Pq+/5m2HZoseM+39dMF57ANXRt6w4PkGu3NXPc5s= -github.com/iwind/TeaGo v0.0.0-20230704123021-ebe4ec1e7717 h1:YgTomks1Bdt+GFajnxcGoM2xhm+LgESMnS3jdgGBBiQ= -github.com/iwind/TeaGo v0.0.0-20230704123021-ebe4ec1e7717/go.mod h1:fi/Pq+/5m2HZoseM+39dMF57ANXRt6w4PkGu3NXPc5s= github.com/iwind/TeaGo v0.0.0-20230704135818-4a5646ab1f5b h1:yYUaxnc04uzfr7C9HBN52ZZvcQomND+C5aZTpjOUYFI= github.com/iwind/TeaGo v0.0.0-20230704135818-4a5646ab1f5b/go.mod h1:fi/Pq+/5m2HZoseM+39dMF57ANXRt6w4PkGu3NXPc5s= github.com/iwind/gosock v0.0.0-20220505115348-f88412125a62 h1:HJH6RDheAY156DnIfJSD/bEvqyXzsZuE2gzs8PuUjoo= @@ -106,10 +101,11 @@ github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -150,12 +146,20 @@ github.com/smartwalle/crypto4go v1.0.2 h1:9DUEOOsPhmp00438L4oBdcL8EZG1zumecft5bW github.com/smartwalle/crypto4go v1.0.2/go.mod h1:LQ7vCZIb7BE5+MuMtJBuO8ORkkQ01m4DXDBWPzLbkMY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/tdewolff/minify/v2 v2.12.7 h1:pBzz2tAfz5VghOXiQIsSta6srhmTeinQPjRDHWoumCA= +github.com/tdewolff/minify/v2 v2.12.7/go.mod h1:ZRKTheiOGyLSK8hOZWWv+YoJAECzDivNgAlVYDHp/Ws= +github.com/tdewolff/parse/v2 v2.6.6 h1:Yld+0CrKUJaCV78DL1G2nk3C9lKrxyRTux5aaK/AkDo= +github.com/tdewolff/parse/v2 v2.6.6/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0= +github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/technoweenie/multipartstreamer v1.0.1 h1:XRztA5MXiR1TIRHxH2uNxXxaIkKQDeX7m2XsSOlQEnM= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= @@ -233,7 +237,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/internal/db/models/http_web_dao.go b/internal/db/models/http_web_dao.go index 3c98cce8..35f55b25 100644 --- a/internal/db/models/http_web_dao.go +++ b/internal/db/models/http_web_dao.go @@ -151,6 +151,18 @@ func (this *HTTPWebDAO) ComposeWebConfig(tx *dbs.Tx, webId int64, isLocationOrGr } } + // Optimization + if IsNotNull(web.Optimization) { + var optimizationConfig = serverconfigs.NewHTTPPageOptimizationConfig() + err = json.Unmarshal(web.Optimization, optimizationConfig) + if err != nil { + return nil, err + } + if this.shouldCompose(isLocationOrGroup, forNode, optimizationConfig.IsPrior, true) { + config.Optimization = optimizationConfig + } + } + // charset if IsNotNull(web.Charset) { var charsetConfig = &serverconfigs.HTTPCharsetConfig{} @@ -587,14 +599,42 @@ func (this *HTTPWebDAO) UpdateWeb(tx *dbs.Tx, webId int64, rootJSON []byte) erro } // UpdateWebCompression 修改压缩配置 -func (this *HTTPWebDAO) UpdateWebCompression(tx *dbs.Tx, webId int64, compressionConfig []byte) error { +func (this *HTTPWebDAO) UpdateWebCompression(tx *dbs.Tx, webId int64, compressionConfig *serverconfigs.HTTPCompressionConfig) error { if webId <= 0 { return errors.New("invalid webId") } + + compressionJSON, err := json.Marshal(compressionConfig) + if err != nil { + return err + } + var op = NewHTTPWebOperator() op.Id = webId - op.Compression = JSONBytes(compressionConfig) - err := this.Save(tx, op) + op.Compression = compressionJSON + err = this.Save(tx, op) + if err != nil { + return err + } + + return this.NotifyUpdate(tx, webId) +} + +// UpdateWebOptimization 修改页面优化配置 +func (this *HTTPWebDAO) UpdateWebOptimization(tx *dbs.Tx, webId int64, optimizationConfig *serverconfigs.HTTPPageOptimizationConfig) error { + if webId <= 0 { + return errors.New("invalid webId") + } + + optimizationJSON, err := json.Marshal(optimizationConfig) + if err != nil { + return err + } + + var op = NewHTTPWebOperator() + op.Id = webId + op.Optimization = optimizationJSON + err = this.Save(tx, op) if err != nil { return err } diff --git a/internal/db/models/http_web_model.go b/internal/db/models/http_web_model.go index ab2f576b..4d8c8c1e 100644 --- a/internal/db/models/http_web_model.go +++ b/internal/db/models/http_web_model.go @@ -2,6 +2,47 @@ package models import "github.com/iwind/TeaGo/dbs" +const ( + HTTPWebField_Id dbs.FieldName = "id" // ID + HTTPWebField_IsOn dbs.FieldName = "isOn" // 是否启用 + HTTPWebField_TemplateId dbs.FieldName = "templateId" // 模版ID + HTTPWebField_AdminId dbs.FieldName = "adminId" // 管理员ID + HTTPWebField_UserId dbs.FieldName = "userId" // 用户ID + HTTPWebField_State dbs.FieldName = "state" // 状态 + HTTPWebField_CreatedAt dbs.FieldName = "createdAt" // 创建时间 + HTTPWebField_Root dbs.FieldName = "root" // 根目录 + HTTPWebField_Charset dbs.FieldName = "charset" // 字符集 + HTTPWebField_Shutdown dbs.FieldName = "shutdown" // 临时关闭页面配置 + HTTPWebField_Pages dbs.FieldName = "pages" // 特殊页面 + HTTPWebField_RedirectToHttps dbs.FieldName = "redirectToHttps" // 跳转到HTTPS设置 + HTTPWebField_Indexes dbs.FieldName = "indexes" // 首页文件列表 + HTTPWebField_MaxRequestBodySize dbs.FieldName = "maxRequestBodySize" // 最大允许的请求内容尺寸 + HTTPWebField_RequestHeader dbs.FieldName = "requestHeader" // 请求Header配置 + HTTPWebField_ResponseHeader dbs.FieldName = "responseHeader" // 响应Header配置 + HTTPWebField_AccessLog dbs.FieldName = "accessLog" // 访问日志配置 + HTTPWebField_Stat dbs.FieldName = "stat" // 统计配置 + HTTPWebField_Gzip dbs.FieldName = "gzip" // Gzip配置(v0.3.2弃用) + HTTPWebField_Compression dbs.FieldName = "compression" // 压缩配置 + HTTPWebField_Cache dbs.FieldName = "cache" // 缓存配置 + HTTPWebField_Firewall dbs.FieldName = "firewall" // 防火墙设置 + HTTPWebField_Locations dbs.FieldName = "locations" // 路由规则配置 + HTTPWebField_Websocket dbs.FieldName = "websocket" // Websocket设置 + HTTPWebField_RewriteRules dbs.FieldName = "rewriteRules" // 重写规则配置 + HTTPWebField_HostRedirects dbs.FieldName = "hostRedirects" // 域名跳转 + HTTPWebField_Fastcgi dbs.FieldName = "fastcgi" // Fastcgi配置 + HTTPWebField_Auth dbs.FieldName = "auth" // 认证策略配置 + HTTPWebField_Webp dbs.FieldName = "webp" // WebP配置 + HTTPWebField_RemoteAddr dbs.FieldName = "remoteAddr" // 客户端IP配置 + HTTPWebField_MergeSlashes dbs.FieldName = "mergeSlashes" // 是否合并路径中的斜杠 + HTTPWebField_RequestLimit dbs.FieldName = "requestLimit" // 请求限制 + HTTPWebField_RequestScripts dbs.FieldName = "requestScripts" // 请求脚本 + HTTPWebField_Uam dbs.FieldName = "uam" // UAM设置 + HTTPWebField_Cc dbs.FieldName = "cc" // CC设置 + HTTPWebField_Referers dbs.FieldName = "referers" // 防盗链设置 + HTTPWebField_UserAgent dbs.FieldName = "userAgent" // UserAgent设置 + HTTPWebField_Optimization dbs.FieldName = "optimization" // 页面优化配置 +) + // HTTPWeb HTTP Web type HTTPWeb struct { Id uint32 `field:"id"` // ID @@ -41,6 +82,7 @@ type HTTPWeb struct { Cc dbs.JSON `field:"cc"` // CC设置 Referers dbs.JSON `field:"referers"` // 防盗链设置 UserAgent dbs.JSON `field:"userAgent"` // UserAgent设置 + Optimization dbs.JSON `field:"optimization"` // 页面优化配置 } type HTTPWebOperator struct { @@ -81,6 +123,7 @@ type HTTPWebOperator struct { Cc any // CC设置 Referers any // 防盗链设置 UserAgent any // UserAgent设置 + Optimization any // 页面优化配置 } func NewHTTPWebOperator() *HTTPWebOperator { diff --git a/internal/rpc/services/service_http_web.go b/internal/rpc/services/service_http_web.go index fc8b3845..33347fd8 100644 --- a/internal/rpc/services/service_http_web.go +++ b/internal/rpc/services/service_http_web.go @@ -141,7 +141,60 @@ func (this *HTTPWebService) UpdateHTTPWebCompression(ctx context.Context, req *p var tx = this.NullTx() - err = models.SharedHTTPWebDAO.UpdateWebCompression(tx, req.HttpWebId, req.CompressionJSON) + if len(req.CompressionJSON) == 0 { + return nil, errors.New("'compressionJSON' should not be empty") + } + var compressionConfig = &serverconfigs.HTTPCompressionConfig{} + err = json.Unmarshal(req.CompressionJSON, compressionConfig) + if err != nil { + return nil, err + } + err = compressionConfig.Init() + if err != nil { + return nil, err + } + + err = models.SharedHTTPWebDAO.UpdateWebCompression(tx, req.HttpWebId, compressionConfig) + if err != nil { + return nil, err + } + + return this.Success() +} + +// UpdateHTTPWebOptimization 修改页面优化配置 +func (this *HTTPWebService) UpdateHTTPWebOptimization(ctx context.Context, req *pb.UpdateHTTPWebOptimizationRequest) (*pb.RPCSuccess, error) { + // 校验请求 + _, userId, err := this.ValidateAdminAndUser(ctx, true) + if err != nil { + return nil, err + } + + if userId > 0 { + // 检查用户权限 + err = models.SharedHTTPWebDAO.CheckUserWeb(nil, userId, req.HttpWebId) + if err != nil { + return nil, err + } + } + + var tx = this.NullTx() + + if len(req.OptimizationJSON) == 0 { + return nil, errors.New("invalid 'optimizationJSON'") + } + var optimizationConfig = serverconfigs.NewHTTPPageOptimizationConfig() + err = json.Unmarshal(req.OptimizationJSON, optimizationConfig) + if err != nil { + return nil, err + } + + err = optimizationConfig.Init() + if err != nil { + return nil, err + } + + err = models.SharedHTTPWebDAO.UpdateWebOptimization(tx, req.HttpWebId, optimizationConfig) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_server_group.go b/internal/rpc/services/service_server_group.go index c8cf58b8..99f32b2d 100644 --- a/internal/rpc/services/service_server_group.go +++ b/internal/rpc/services/service_server_group.go @@ -483,6 +483,7 @@ func (this *ServerGroupService) FindEnabledServerGroupConfigInfo(ctx context.Con result.HasAccessLogConfig = webConfig != nil && webConfig.AccessLogRef != nil && webConfig.AccessLogRef.IsPrior result.HasStatConfig = webConfig != nil && webConfig.StatRef != nil && webConfig.StatRef.IsPrior result.HasCompressionConfig = webConfig != nil && webConfig.Compression != nil && webConfig.Compression.IsPrior + result.HasOptimizationConfig = webConfig != nil && webConfig.Optimization != nil && webConfig.Optimization.IsPrior result.HasWebsocketConfig = webConfig != nil && webConfig.WebsocketRef != nil && webConfig.WebsocketRef.IsPrior result.HasRequestHeadersConfig = webConfig != nil && webConfig.RequestHeaderPolicyRef != nil && webConfig.RequestHeaderPolicyRef.IsPrior result.HasResponseHeadersConfig = webConfig != nil && webConfig.ResponseHeaderPolicyRef != nil && webConfig.ResponseHeaderPolicyRef.IsPrior