4

聊聊dubbo-go-proxy的replacePathFilter

 3 years ago
source link: https://studygolang.com/articles/33266
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文主要研究一下dubbo-go-proxy的replacePathFilter

replacePathFilter

dubbo-go-proxy/pkg/filter/replacepath/replace_path.go

// replacePathFilter is a filter for host.
type replacePathFilter struct {
    path string
}

// New create replace path filter.
func New(path string) filter.Filter {
    return &replacePathFilter{path: path}
}

func (f replacePathFilter) Do() context.FilterFunc {
    return func(c context.Context) {
        f.doReplacePathFilter(c.(*http.HttpContext))
    }
}

func (f replacePathFilter) doReplacePathFilter(ctx *http.HttpContext) {
    req := ctx.Request
    if req.URL.RawPath == "" {
        req.Header.Add(ReplacedPathHeader, req.URL.Path)
    } else {
        req.Header.Add(ReplacedPathHeader, req.URL.RawPath)
    }

    req.URL.RawPath = f.path
    var err error
    req.URL.Path, err = url.PathUnescape(req.URL.RawPath)
    if err != nil {
        ctx.AddHeader(constant.HeaderKeyContextType, constant.HeaderValueTextPlain)
        ctx.WriteWithStatus(nh.StatusInternalServerError, []byte(replacePathError))
        ctx.Abort()
        return
    }

    req.RequestURI = req.URL.RequestURI()

    ctx.Next()
}

replacePathFilter定义了path属性;它实现了Filter的Do方法,该方法执行的是doReplacePathFilter方法,它会往header写入名为ReplacedPathHeader,若req.URL.RawPath为空则取req.URL.Path;之后将req.URL.RawPath更新为f.path,再通过url.PathUnescape(req.URL.RawPath)计算req.URL.Path,最后将req.URL.RequestURI()赋值给req.RequestURI

httpFilter

dubbo-go-proxy/pkg/proxy/listener.go

func httpFilter(ctx *h.HttpContext, request fc.IntegrationRequest) {
    if len(request.Host) != 0 {
        ctx.AppendFilterFunc(host.New(request.Host).Do())
    }
    if len(request.Path) != 0 {
        ctx.AppendFilterFunc(replacepath.New(request.Path).Do())
    }
}

httpFilter方法会根据request.Path通过AppendFilterFunc添加replacepath.New(request.Path)

小结

dubbo-go-proxy的httpFilter会根据request.Path通过AppendFilterFunc添加replacepath.New(request.Path);而replacePathFilter会根据path属性替换req.URL.RawPath及req.URL.Path,最后更新req.RequestURI。

doc

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK