fengyoulin / hookingo

A library use to hooking go functions, just hook in go.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请教一个问题

chennqqi opened this issue · comments

直接调用是可以的,但是间接调用就不管用了,不知道是什么原理。
测试代码

  1. 正常测试
import "golang.org/x/net/http/httpguts"
import "fmt"
import  "github.com/fengyoulin/hookingo"
func main() {
	hookingo.Apply(httpguts.IsTokenRune, func(r rune) bool {
		fmt.Println("hookingo:", r)
		return true
	})
        httpguts.IsTokenRune('a')
}
成功
  1. 间接调用
import (
"golang.org/x/net/http/httpguts"
 "fmt"
 "github.com/fengyoulin/hookingo"
"net/http"
)
func main() {
	hookingo.Apply(httpguts.IsTokenRune, func(r rune) bool {
		fmt.Println("hookingo:", r)//没有打印输出
		return true
	})
       req, err := http.NewRequest(`<custom-method>`, "http://127.0.0.1", nil)
}
//失败,其中 http.NewRequest内部调用了httpguts.IsTokenRune

你好,很高兴收到你的反馈。你确定http.NewRequest内部调用了httpguts.IsTokenRune?我通过gdb断点调试发现你的第二段代码并没有调用httpguts.IsTokenRune。

我确定调用了
NewRequest内部是调用NewRequestWithContext, 里面的私有函数validMethod中调用了isNotToken
调用栈大概是这样的

NewRequest(request.go)
--NewRequestWithContext(request.go)
----validMethod(request.go)
------isNotToken(http.go)
--------httpguts.IsTokenRune

不知道是不是高版本的go mod之后,这两个链接的是不同版本的"golang.org/x/net/http/httpguts"

我用的是go1.13,我再试试低版本的,没有go mod的

go1.11 代码都不一样
import的是这个包 "golang_org/x/net/http/httpguts"
看样子想修改有点难了,楼主有啥好办法吗

我看了一下,http.NewRequest调的IsTokenRune在go源码中,1.11里路径是"vendor\golang_org\x\net\http\httpguts",1.12里是"internal/x/net/http/httpguts",1.13里是"vendor\golang.org\x\net\http\httpguts"。

有没有办法hook住vendor中的

通过gdb和nm看,IsTokenRune应该是被内联优化掉了,我试了"-N -l -std"参数但是没什么效果,暂时没有好的办法。

多谢!