有趣!一行代码居然无法获取请求的完整URL

在处理Web服务时,有时需要获取HTTP请求的完整URL,但在Go语言中直接获取可能存在困难。本文探讨了HTTP1.1和HTTP2中无法直接获取完整连接的原因,并提供了两种解决方案。在HTTP1.1中,请求行不包含完整URL;而在HTTP2中,请求伪标头不再包含Host信息。解决方案包括结合请求头和配置文件信息来构建完整URL。
摘要由CSDN通过智能技术生成

来自公众号:Gopher指北

缘起

做Web服务的时候,可能会有这样一个业务场景,获取一个HTTP请求的完整URL。很巧,老许就碰到了这样的业务场景。面对如此简单的需求,CV大法根本没有展示才能的机会。啪啪啪,获取请求的完整URL代码就出来了。

在这里插入图片描述

当时离验证只差一步,老许信心满满,很快,打脸来得很快就像龙卷风。。。

在这里插入图片描述

从图中可以知道,req.URL中的SchemeHost均为空,所以r.URL.String()无法得到完整的请求连接。这个结果让老许一阵激动,万万没想到有一天我也有机会发现Go源码中可能遗漏的赋值。老许强行按耐住心中的激动,准备好好研究一番,万一成为了Go的Contributor呢^ω^。最后发现官方实现没有问题,因此就有了今天这篇文章。

HTTP1.1中为什么无法获取完整的连接

HTTP1.1的Server读取请求并构建Request.URL对象的逻辑在request.go文件的readRequest方法中,下面老许对其源码做一个简单分析总结。

  1. 读取请求的第一行,HTTP请求的第一行又称为请求行。
// First line: GET /index.html HTTP/1.0
var s string
if s, err = tp.ReadLine(); err != nil {
   
	return nil, err
}
  1. 将请求行的内容分别解析为req.Methodreq.RequestURIreq.Proto
var ok bool
req.Method, req.RequestURI, req.Proto, ok = parseRequestLine(s)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值