有一个建议是让LookupCNAME在unix和windows之间保持一致,或者更具体地说,让它发送一个明确的CNAME查询,这样当最后一个CNAME没有以A/AAAA记录结尾时,它会返回CNAME。因此,这次更改使得cgo版本使用res_search例程而不是getaddrinfo。
这导致了一些由于这次更改而发生的不兼容性破坏的变化,以及linux/windows之间的一些细微差别。
当前问题:
- 当cgo失败时,正在使用go解析器(即使对于noSuchHost)。这将返回completed == false,因此回退到go(lookupCNAME)。编辑:go解析器还将发送第二个(不必要的)CNAME。
go/src/net/cgo_unix.go
第296行至第300行
| funccgoLookupCNAME(ctx context.Context, namestring) (cnamestring, errerror, completedbool) { |
| resources, err:=resSearch(ctx, name, int(dnsmessage.TypeCNAME), int(dnsmessage.ClassINET)) |
| iferr!=nil { |
| return |
| } |
go/src/net/lookup_unix.go
第102行至第110行
| func (r*Resolver) lookupCNAME(ctx context.Context, namestring) (string, error) { |
| order, conf:=systemConf().hostLookupOrder(r, name) |
| iforder==hostLookupCgo { |
| ifcname, err, ok:=cgoLookupCNAME(ctx, name); ok { |
| returncname, err |
| } |
| } |
| returnr.goLookupCNAME(ctx, name, order, conf) |
| } |
4条答案
按热度按时间ncecgwcz1#
CC @neild
j8ag8udp2#
https://go.dev/cl/455275提到了这个问题:
net: rework the unified CNAME handling on unix
kqlmhetl3#
CC @rsc
hpcdzsge4#
@rsc对此你有什么看法/想法吗?如果能解决这个问题就太好了。考虑到你已经实施了#50101的更改,我想听听你对此事的看法。