ztelur commented on a change in pull request #307:
URL: https://github.com/apache/dubbo-go-pixiu/pull/307#discussion_r771887821



##########
File path: pkg/filter/tracing/tracing.go
##########
@@ -92,8 +96,10 @@ func (m *TraceFilter) Apply() error {
        return nil
 }
 
-func (mf *TraceFilter) PrepareFilterChain(ctx *contexthttp.HttpContext) error {
-       ctx.AppendFilterFunc(mf.Handle)
+func (mf *TraceFilterFilter) PrepareFilterChain(ctx *contexthttp.HttpContext, 
chain filter.FilterChain) error {

Review comment:
       应该是 factory 和 filter 混淆了

##########
File path: pkg/common/http/manager.go
##########
@@ -58,35 +62,75 @@ func (hcm *HttpConnectionManager) OnData(hc 
*pch.HttpContext) error {
        if err != nil {
                return err
        }
-       hcm.addFilter(hc)
        hcm.handleHTTPRequest(hc)
        return nil
 }
 
 // handleHTTPRequest handle http request
 func (hcm *HttpConnectionManager) handleHTTPRequest(c *pch.HttpContext) {
-       if len(c.Filters) > 0 {
-               c.Next()
-               return
+       filterChain := hcm.filterManager.CreateFilterChain(c)
+
+       // recover any err when filterChain run
+       defer func() {
+               if err := recover(); err != nil {
+                       logger.Warnf("[dubbopixiu go] Occur An Unexpected Err: 
%+v", err)
+                       c.SendLocalReply(http.StatusInternalServerError, 
[]byte(fmt.Sprintf("Occur An Unexpected Err: %v", err)))
+               }
+       }()
+
+       //todo timeout
+       filterChain.OnDecode(c)
+       hcm.buildTargetResponse(c)
+       filterChain.OnEncode(c)
+       hcm.writeResponse(c)
+}
+
+func (hcm *HttpConnectionManager) writeResponse(c *pch.HttpContext) {
+       if !c.LocalReply() {
+               writer := c.Writer
+               writer.WriteHeader(c.GetStatusCode())
+               if _, err := writer.Write(c.TargetResp.Data); err != nil {
+                       panic(err)
+               }
        }
-       // TODO redirect
 }
 
-func (hcm *HttpConnectionManager) addFilter(ctx *pch.HttpContext) {
-       for _, f := range hcm.filterManager.GetFilters() {
-               if err := (*f).PrepareFilterChain(ctx); err != nil {
-                       logger.Warnf("PrepareFilterChain error %s", err)
+func (hcm *HttpConnectionManager) buildTargetResponse(c *pch.HttpContext) {
+       if !c.LocalReply() {

Review comment:
       可以及早return,不过 isLocalReply 的情况是否需要打印日志

##########
File path: samples/dubbogo/multi/config/conf.yaml
##########
@@ -57,8 +57,7 @@ static_resources:
                         timeout_config:
                           connect_timeout: 5s
                           request_timeout: 5s
-                  - name: dgp.filter.http.response

Review comment:
       👍

##########
File path: pkg/common/extension/filter/filter_manager.go
##########
@@ -27,32 +27,42 @@ import (
 
 import (
        "github.com/apache/dubbo-go-pixiu/pkg/common/yaml"
+       "github.com/apache/dubbo-go-pixiu/pkg/context/http"
        "github.com/apache/dubbo-go-pixiu/pkg/logger"
        "github.com/apache/dubbo-go-pixiu/pkg/model"
 )
 
 // FilterManager manage filters
 type FilterManager struct {
-       filters       map[string]HttpFilter
-       filtersArray  []*HttpFilter
+       filters       map[string]HttpFilterFactory
+       filtersArray  []*HttpFilterFactory
        filterConfigs []*model.HTTPFilter
 
        mu sync.RWMutex
 }
 
 // NewFilterManager create filter manager
 func NewFilterManager(fs []*model.HTTPFilter) *FilterManager {
-       fm := &FilterManager{filterConfigs: fs, filters: 
make(map[string]HttpFilter)}
+       fm := &FilterManager{filterConfigs: fs, filters: 
make(map[string]HttpFilterFactory)}
        return fm
 }
 
 // NewEmptyFilterManager create empty filter manager
 func NewEmptyFilterManager() *FilterManager {
-       return &FilterManager{filters: make(map[string]HttpFilter)}
+       return &FilterManager{filters: make(map[string]HttpFilterFactory)}
 }
 
-// GetFilters get all filter from manager
-func (fm *FilterManager) GetFilters() []*HttpFilter {
+func (fm *FilterManager) CreateFilterChain(ctx *http.HttpContext) FilterChain {
+       chain := NewDefaultFilterChain()
+
+       for _, f := range fm.GetFactory() {
+               _ = (*f).PrepareFilterChain(ctx, chain)
+       }
+       return chain
+}
+
+// GetFactory get all filter from manager
+func (fm *FilterManager) GetFactory() []*HttpFilterFactory {
        fm.mu.RLock()

Review comment:
       是否其他使用 filtersArray 处也要加锁?

##########
File path: pkg/filter/tracing/tracing.go
##########
@@ -68,15 +72,15 @@ func (ap *Plugin) Kind() string {
        return constant.TracingFilter
 }
 
-func (ap *Plugin) CreateFilter() (filter.HttpFilter, error) {
-       return &TraceFilter{cfg: &TraceConfig{}}, nil
+func (ap *Plugin) CreateFilterFactory() (filter.HttpFilterFactory, error) {
+       return &TraceFilterFilter{cfg: &TraceConfig{}}, nil

Review comment:
       是不是命名有些问题?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to