聊聊dubbo-go-proxy的replacePathFilter

mb601a5ca21139e · · 365 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本文主要研究一下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

  • dubbo-go-proxy

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

本文来自:51CTO博客

感谢作者:mb601a5ca21139e

查看原文:聊聊dubbo-go-proxy的replacePathFilter

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

365 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传