来自公众号:Gopher指北
文章目录
缘起
做Web服务的时候,可能会有这样一个业务场景,获取一个HTTP请求的完整URL。很巧,老许就碰到了这样的业务场景。面对如此简单的需求,CV大法根本没有展示才能的机会。啪啪啪,获取请求的完整URL代码就出来了。
当时离验证只差一步,老许信心满满,很快,打脸来得很快就像龙卷风。。。
从图中可以知道,req.URL
中的Scheme
和Host
均为空,所以r.URL.String()
无法得到完整的请求连接。这个结果让老许一阵激动,万万没想到有一天我也有机会发现Go源码中可能遗漏的赋值。老许强行按耐住心中的激动,准备好好研究一番,万一成为了Go的Contributor呢^ω^。最后发现官方实现没有问题,因此就有了今天这篇文章。
HTTP1.1中为什么无法获取完整的连接
HTTP1.1的Server读取请求并构建Request.URL
对象的逻辑在request.go文件的readRequest
方法中,下面老许对其源码做一个简单分析总结。
- 读取请求的第一行,HTTP请求的第一行又称为请求行。
// First line: GET /index.html HTTP/1.0
var s string
if s, err = tp.ReadLine(); err != nil {
return nil, err
}
- 将请求行的内容分别解析为
req.Method
、req.RequestURI
和req.Proto
。
var ok bool
req.Method, req.RequestURI, req.Proto, ok = parseRequestLine(s)