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

先看一下hijack相关的结构说明:

type Hijacker interface {Hijack() (net.Conn, *bufio.ReadWriter, error)
}
//返回连接接口net.Conn和ReadWriter,bufio读写的

// Hijack lets the caller take over the connection. -----翻译Hijack让调用者管理连接

// 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.

------------翻译调用Hijack后,HTTP的server不会对连接做多余的处理让用户自己管理和关闭连接

再看一下docker中对hijack的使用

         dial, err := cli.dial()  //设置TCP keepAlive做长连接// When we set up a TCP connection for hijack, there could be long periods// of inactivity (a long running command with no output) that in certain// network setups may cause ECONNTIMEOUT, leaving the client in an unknown// state. Setting TCP KeepAlive on the socket connection will prohibit// ECONNTIMEOUT unless the socket connection truly is brokenif tcpConn, ok := dial.(*net.TCPConn); ok {tcpConn.SetKeepAlive(true)tcpConn.SetKeepAlivePeriod(30 * time.Second)}if err != nil {if strings.Contains(err.Error(), "connection refused") {
return fmt.Errorf("Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?")}return err}clientconn := httputil.NewClientConn(dial, nil) defer clientconn.Close()// Server hijacks the connection, error 'connection closed' expectedclientconn.Do(req)rwc, br := clientconn.Hijack() //清理掉buffer 这步非常重要,返回这个两个参数就是给用户自己管理连接和数据处理defer rwc.Close()

再看看clientconn.Hijack的实现:

func (cc *ClientConn) Hijack() (c net.Conn, r *bufio.Reader) {cc.lk.Lock()defer cc.lk.Unlock()c = cc.cr = cc.rcc.c = nilcc.r = nilreturn
}
//就是在NewClientConn时候保存的net.Conn和bufio.Reader
func NewClientConn(c net.Conn, r *bufio.Reader) *ClientConn {if r == nil {r = bufio.NewReader(c)}return &ClientConn{c:        c,r:        r,pipereq:  make(map[*http.Request]uint),writeReq: (*http.Request).Write,}
}

总结:hijack就是不用重新建立连接或者重新构造ClientConn设置net.Conn和bufio,然后不断复用net.Conn和bufio,自己管理

golang的hijack篡取劫持相关推荐

  1. Golang 并发爬虫 爬取某著名游戏媒体

    第一次在掘金水文章,有一点点小激动,哈哈 本次使用Golang抓取著名(la ji)游戏媒体 游民星空 主要使用的第三方包是 goquery ,来解析HTML,如果你没有使用过goquery也不要紧, ...

  2. golang中如何抓取panic让程序正常退出

    golang在运行时,出现panic会导致程序立刻崩溃,可以在出panic的方法上加上recover来进行捕捉并让程序安全退出: defer func() {if err := recover(); ...

  3. golang爬虫colly 抓取豆瓣前250电影

    工作中要用到一点爬虫相关的,以前都是用python写的,最近研究golang(主要是工作中一些API需要用golang),才在研究,后续研究完了有可能写个整的文章,这次用colly爬去豆瓣电影 TOP ...

  4. 【Golang】int的取值范围

    背景 GO语言中int类型的大小是不确定的,与具体的平台有关系一般来说,int在32位系统中是4字节,在64位系统中是8字节使用自动推导类型初始化一个整数,默认为int类型. int8: -128 ~ ...

  5. c++除法保留小数_Golang中除法和取模运算与Python3的区别

    Golang中除法和取模运算与Python3的区别 个人主页:[https://polar9527.github.io] 除法的取整分为三类:向上取整.向下取整.向零取整. 向上取整:向+∞ 方向取最 ...

  6. oracle安装 插件的执行方法失败_解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题...

    Google 在今年一月发布了 golang.org 的镜像站 golang.google.cn,中国大陆可直接访问.详情参见 Hello, 中国! | The Go Blog 欢迎点击查看我的博客原 ...

  7. 盘点golang中的开发神器

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用as ...

  8. web网页劫持是如何做到的?

    前几天看到一篇写js文件反劫持的文章,想起15年主导做百度搜索结果页面反劫持项目做得一些研究,整理成文章,跟大家分享. IIS7网站监控可以及时防控网站风险,快速准确监控网站是否遭到各种劫持攻击,网站 ...

  9. BlackArch-Tools

    BlackArch-Tools 简介安装在ArchLinux之上添加存储库从blackarch存储库安装工具替代安装方法BlackArch Linux Complete Tools List 简介 B ...

最新文章

  1. PCL—低层次视觉—点云分割(基于凹凸性)
  2. 论jquery与vuejs结合时的部分问题
  3. js 中对象--属性相关操作
  4. 那些不怕失业的程序员们,都有什么技能?
  5. [HNOI2003]操作系统
  6. Pro *C/C++学习笔记
  7. Linux命令之cd
  8. 20165105第三周学习总结
  9. Cocoa Touch国际化
  10. Linux常出现的面试试题
  11. c语言如何限制数字大小下线,C语言学习Day19
  12. jQuery获取select onChange的值
  13. MySQL安装包下载及配置方法
  14. 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive
  15. 网卡设置不当造成断线
  16. ns手柄pc驱动_颜值、功能、手感同步在线 北通宙斯机械游戏手柄体验
  17. 周杰:推荐只是一个新的信息的传播方式
  18. css页眉标签,CSS – 带页眉和页脚的100%高度
  19. BASE64编码的图片在网页中直接用
  20. 学校热水系统服务认证

热门文章

  1. 浅析Trafodion体系结构
  2. Pacbio测序原理以及SMRT bell文库构建流程简述
  3. 大数据之scala学习(一) 案例操作
  4. 网络线上教育快速发展,CDN高防能否胜任服务器安全防护任务?
  5. CSS3 排版属性盒子模型 第二个模块
  6. MySQL及达梦数据库数字金额转人民币大写
  7. mac安装win7之后鼠标失灵_苹果电脑装WIN7鼠标不能动怎么处理
  8. FC200 长广防盗维修专家
  9. PTA 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  10. 龙族幻想最新东京机器人位置_龙族幻想藤原智坐标位置一览 藤原智任务攻略...