简介Hijack

type Hijacker interface {// Hijack lets the caller take over the connection.// After a call to Hijack the HTTP server library// will not do anything else with the connection.//// It becomes the caller's responsibility to manage// and close the connection.//// The returned net.Conn may have read or write deadlines// already set, depending on the configuration of the// Server. It is the caller's responsibility to set// or clear those deadlines as needed.//// The returned bufio.Reader may contain unprocessed buffered// data from the client.//// After a call to Hijack, the original Request.Body must// not be used.Hijack() (net.Conn, *bufio.ReadWriter, error)
}

Hijack()可以将HTTP对应的TCP连接取出,连接在Hijack()之后,HTTP的相关操作就会受到影响,调用方需要负责去关闭连接。看一个简单的例子。

func handle1(w http.ResponseWriter, r *http.Request) {hj, _ := w.(http.Hijacker)conn, buf, _ := hj.Hijack()defer conn.Close()buf.WriteString("hello world")buf.Flush()
}func handle2(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "hello world")
}

问题来了,上面两个handle方法有什么区别呢?很简单,同样是http请求,返回的结果一个遵循http协议,一个不遵循。

➜  ~ curl -i http://localhost/handle1
hello world%                                                                                                                                                                                                                            ➜  ~ curl -i http://localhost/handle2
HTTP/1.1 200 OK
Date: Thu, 14 Jun 2022 09:51:31 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8hello world%

分别是以上两者的返回,可以看到,hijack之后的返回,虽然body是相同的,但是完全没有遵循http协议。(废话,别人都说了hijack之后返回了body然后直接关闭了,哪来的headers = = )

但我们还是要看看为啥..

func (c *conn) serve(ctx context.Context) {...serverHandler{c.server}.ServeHTTP(w, w.req)w.cancelCtx()if c.hijacked() {return}w.finishRequest()...
}

这是net/http包中的方法,也是http路由的核心方法。调用ServeHTTP(也就是上边的handle方法)方法,如果被hijack了就直接return了,而一般的http请求会经过后边的finishRequest方法,加入headers等并关闭连接。

打开方式

上边我们说了Hijack方法,一般在在创建连接阶段使用HTTP连接,后续自己完全处理connection。符合这样的使用场景的并不多,基于HTTP协议的rpc算一个,从HTTP升级到WebSocket也算一个。

引用:golang hijack打开方式 - 简书

Golang hijack 劫持相关推荐

  1. golang的hijack篡取劫持

    一直不太明白golang的hijack是干什么的?只知道hijack这个词是篡取的意思,难道跟网关的作用一样,把client的请求发到这个服务上,然后这个服务帮忙转发到远端server,但是看了源码后 ...

  2. golang Java_goLang

    Golang标准库文档 https://studygolang.com/pkgdoc go语言介绍 http://www.topgoer.com/ 一文带你了解Go的工程管理 go.mod入门 go语 ...

  3. CSRF的绕过与利用

    Origin & Referer Bypass Null值绕过 当遇到一个cors可用null值绕过时,用iframe配合data协议,就可以发送一个origin为null的请求.这个绕过方式 ...

  4. 宜信PaaS平台基于Calico的容器

    容器云面临的网络挑战 在传统的IDC的架构里面网络是很重要的事情,在虚拟机环境中网络的发展已经有很多成熟的解决方案,现在为什么还在研究新的方案呢?因为云计算.云计算在2013.2014年之前的时间段, ...

  5. 恋恋有词 - 高频版

    名字重音在前.动词重音在后 1-1.初始词汇 小词可以做形容词.动词.名词(小词为个数小于等于7) law 法律.规律 claw 爪.钳.用爪抓 lawful 合法的.法律许可的 lawsuit 诉讼 ...

  6. cs224w(图机器学习)2021冬季课程学习笔记20 Advanced Topics on GNNs

    诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Advanced Topics on GNNs 2. Limitations of Grap ...

  7. 恋练有词重点单词快速识记

    恋练有词考研重点单词快速识记 可能整个格式非常的糟糕,但这是我会一直更新的一个博文,因为我在背单词的时候,基本都会把我不会的词,打录下来,所以,这些是我认为比较重点的单词.共勉!用一个寒假的时间把整个 ...

  8. 2022.10.27 英语背诵

    culminate 使达高潮,结束 ~ in 达到顶点 legend 传说,传奇 origin 起源,血统 technique 技术,技能,行家手法 occurrence 发生,出现 liquor 酒 ...

  9. 2022.10.11 英语背诵

    constant 不变的,经常的,坚定的 culminate 使达高潮,使结束 ~ in liquor  酒类 nil 无,零 overture 倡议,建议,序曲 hijack 劫持,抢劫 the a ...

  10. 英语易混淆词语:四六级,考研均适用(持续更新中~)

    1.preside:主持         reside:居住 2.withstand:承受    withdraw:撤回 3.review:评论家       interview:采访 4.subst ...

最新文章

  1. mysql商品管理系统总结_Mysql管理总结
  2. 2020年6月18日 618感言
  3. 【业务建模_2】通用数据工具
  4. Java中Json和List转换
  5. ORA-12154/ORA-12560 可以尝试的解决办法
  6. VTK:图片之DrawShapes
  7. c语言类型名占字节,C语言实现 数据类型占多少字节指针占多少字节
  8. Cassandra1.2文档学习(7)—— 规划集群部署
  9. python并行计算numpy_【Nature文章摘录】NumPy: 从单机到分布式并行计算
  10. java串口监听超时_从串口读取时如何实现read()的超时(C / C)
  11. php for 脚本,php for循环脚本。
  12. 农村包围城市:企业网站关键词排名上首页
  13. 什么是自适应学习(个性化学习)?
  14. 时间日期插件引用使用方法
  15. 人口流向数据_2017中国流动人口发展报告(数据摘要)
  16. MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
  17. 资深数据科学家教你如何在求职过程中找到心仪工作
  18. Python二级--奖学金评选
  19. solidity 异常处理
  20. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

热门文章

  1. privilege权限级别的命令介绍及实例分析
  2. PDF文件格式的特点
  3. 常用 25/26 Flash 系列器件型号、ID、容量对照表
  4. 计算机itunes无法安装,Win7电脑无法安装itunes怎么办 win7安装itunes失败的解决方法...
  5. xp系统itunes无法连接服务器失败,xp系统iTunes无法连接到iTunes store的修复步骤
  6. photoshop cs6用户界面字体太小的解决方案
  7. Linux,DNS服务器配置
  8. html 播放微信amr音频文件,微信amr文件打开的方法
  9. 笔记本双显卡Ubantu16.04 Nvidia驱动安装指导
  10. 【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)