golang的hijack篡取劫持

2023-11-05

一直不太明白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 broken
	if 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' expected
	clientconn.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.c
	r = cc.r
	cc.c = nil
	cc.r = nil
	return
}
//就是在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,自己管理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang的hijack篡取劫持 的相关文章

  • 学习笔记(01):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • Go基础(复杂类型):函数的闭包

    函数的闭包 Go 函数可以是一个闭包 闭包是一个函数值 它引用了其函数体之外的变量 该函数可以访问并赋予其引用的变量的值 换句话说 该函数被 绑定 在了这些变量上 例如 函数 adder 返回一个闭包 每个闭包都被绑定在其各自的 sum 变
  • CentOS 7下go环境配置(超多问题)

    文章目录 1 安装Visual Code 2 获得golang安装包并安装 3 第一个GO语言程序 hello go 4 安装必要工具与插件 1 安装Visual Code 在终端中安装VScode 使用以下命令 sudo rpm impo
  • Sublime Text 3配置Go语言开发环境

    Sublime Text 3配置Go语言开发环境 1 Go语言环境搭建 2 GoSublime安装和配置 2 1 安装步骤 2 2 代码开发 2 3 编译运行 1 Go语言环境搭建 本篇博文是在读者Go自身环境已经搭好 Sublime Te
  • 在win10上安装go语言环境

    1 下载go环境安装包 由于官方的安装包可能很多人没办法下载到 但是可以在https golang google cn dl 下载 2 选择windows64位版下载 3 安装go 一直next 可以改文件路径 4 设置开发环境变量 右键此
  • 玩好go的切片

    go的slice 入门就会遇到 但这个东西大多数人都是停留在简单的使用 一些干了好几年的老程序员都说不明白里面的道道 这里面坑不少 恰巧今天有空 好好整理下 永不踩坑 1 为什么要用切片 其他语言大多用的都是数组 在go中 数组的长度是不可
  • Go语言学习17-功能测试

    功能测试 引言 功能测试 1 编写功能测试函数 2 常规记录 3 错误记录 4 致命错误记录 5 失败标记 6 立即失败标记 7 失败判断 8 忽略测试 9 并行运行 10 功能测试的运行 11 关于测试运行的时间 12 测试的并发执行 结
  • Go 获取10分钟前的时间,一天前的时间。。。

    time Now Add time Minute 10 golang的time包里面有个AddDate方法 nTime time Now yesTime nTime AddDate 0 0 1 logDay yesTime Format 2
  • fabric2.X以上系统用test-network环境测试自己的链码

    首先 我们需要安装好fabric2 X的环境 具体参考我之前的文章 这里默认已经有了fabric2 X的环境 进入test network文件夹 在开始测试之前 先把gopath项目路径全部解锁 sudo chmod R 777 GOPAT
  • go语言的常见函数

    1 make函数 创建数组切片 Go语言提供的内置函数make 可以用于灵活地创建数组切片 创建一个初始元素个数为5的数组切片 元素初始值为0 mySlice1 make int 5 创建一个初始元素个数为5的数组切片 元素初始值为0 并预
  • go语言学习笔记1--flag代码包

    flag代码包用于接收和解析命令参数 我们以hello world代码作为示例 package main import fmt func main fmt Println hello world 现在 我们想要根据输入定制hello的对象
  • go-libp2p中文文档

    GO LIBP2P入门 这是有关使用libp2p的Go实现go libp2p的一系列教程中的第一篇 我们将介绍安装Go 设置新的Go模块 启动libp2p节点以及在它们之间发送ping消息 安装Go go libp2p建议使用包含模块功能的
  • go : GoLand安装及环境配置

    前因后果 新学期新气象 开学的第一节课是zw老师的区块链技术与应用领域 congratulations 涉及编程实验 使用Go语言 需要安装GoLand软件进行下一步 Go语言下载地址 golang下载链接 进去之后选择对应的版本下载 这里
  • Go解析yaml和yml文件

    Go解析yaml和yml文件 文章目录 Go解析yaml和yml文件 1 yaml概述 2 功能 3 示例 4 语言的构成元素 1 清单 数组 2 关系数组 3 区块的字符 4 保留换行 Newlines preserved 5 折叠换行
  • Gin的使用

    Gin框架 gin框架路由使用前缀树 路由注册的过程是构造前缀树的过程 路由匹配的过程就是查找前缀树的过程 gin框架的中间件函数和处理函数是以切片形式的调用链条存在的 我们可以顺序调用也可以借助c Next 方法实现嵌套调用 借助c Se
  • 使用Go Hijack和jQuery轻松实现异步推送服务

    使用Go Hijack和jQuery轻松实现异步推送服务 首先要说明的是 这里实现的异步推送服务采用的是Long Polling方式 并不是Comet 如果想用Comet来实现的话 可以参考这个开源项目 http cometd org 不过
  • go添加国内镜像加速

    添加国内镜像加速 七牛云 七牛云镜像 全球CDN加速 全球CDN加速 打开你的命令终端输入Go 1 13 及以上 推荐 go env w GO111MODULE on go env w GOPROXY https goproxy cn di
  • Go语言学习18-基准测试

    基准测试 引言 基准测试 1 编写基准测试函数 2 计时器 3 内存分配统计 4 基准测试的运行 结语 引言 所谓基准测试 Benchmark Test 简称BMT 是指 通过一些科学的手段实现对一类测试对象的某项性能指标进行可测量 可重复
  • Go语言实现区块链与加密货币-Part1(基本原型、工作量证明、持久化)

    区块链 Blockchain 是21世纪最具革命性的技术之一 它仍然处于不断成长的阶段 而且还有很多潜力尚未显现 作为比特币的底层技术 它本质上只是一个分布式数据库 不过使它独一无二的是 区块链是一个公开的而不是私人的数据库 每个使用它的人
  • Go语言学习路线

    gogogo git 地址 Go 学习 学习路线 2 基础知识 3 开发工具安装地址 下载 Go基础知识 链接为gitee地址 放心查看 基础结构 learn1 go 基础语法 learn2 go 数据类型 learn3 go 变量 lea

随机推荐

  • 一个动态添加panel 和 删除panel的例子

    unit Unit1 interface uses Windows Messages SysUtils Variants Classes Graphics Controls Forms Dialogs StdCtrls ExtCtrls t
  • python中.item()的讲解

    在pytorch训练时 一般用到 item 比如loss item 我们可以做个简单测试代码看看它的区别 import torch x torch randn 2 2 print x print x 1 1 print x 1 1 item
  • python倒序遍历字符串

    Hello大家好 今天我想和大家分享一个小tips 就是快速倒序遍历字符串 比如现在有一个小需求 是让我们找到一个长字符串里面的最后一个单词 并且返回这个单词的长度 每个单词用空格隔开 那么我们会如何去做这道题呢 我觉得使用倒序遍历 当如果
  • VS2017学习C++问题二(没有与这些操作数匹配的 “<<“ 运算符)

    添加要在此处预编译的标头 ifndef GZDEMO H define GZDEMO H pragma once include
  • 【javascript】2048小游戏

    目录 什么是2048 游戏状态机 游戏界面绘制 3 1 界面 3 2 数字的背景颜色 分数逻辑 4 1 加分 4 2 更新最高分 方向控制逻辑 5 1 数组 5 2 随机数 5 3 初始化 5 4 判断数组是否全部填满 5 5 判断方格是否
  • vue img video src动态设置

    图片存放位置 前端 img data中 url created中 created this select method中 async select var data res await this axios get select this
  • 手写Spring框架(二)

    目录 IOC相关类 BeanDefinitionReader BeanDefinition ApplicationContext BeanWrapper 简化后的DispatcherServlet 本章源码 https github com
  • nodejs require() of ES Module xxxxx not supported.

    某些 npm 库在 typescript 中使用时会存在这种情况 说一个解决方法 就是在 npm 官网中查看对应库的 version 看看是否有 cjs 版本 或者回退到上一个大版本
  • Java面试面经大合集(含答案),大厂越来越简单进了,

    Java面试笔记 尝到甜头的他开始得寸进尺 说5K的工资在北京根本生活不下去 没办法 我这人就是心软 在他一顿苦苦哀求后就答应再帮他想想办法 开会的时候灵光一闪想到了在阿里内部给他找两份大佬写的面试笔记 于是就有了最开始的一幕 被大佬逮到的
  • 前缀和实例4(和可被k整除的子数组)

    题目 给定一个整数数组 nums 和一个整数 k 返回其中元素之和可被 k 整除的 连续 非空 子数组 的数目 子数组 是数组的 连续 部分 示例 1 输入 nums 4 5 0 2 3 1 k 5 输出 7 解释 有 7 个子数组满足其元
  • 三个方法解决php并发问题

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 解决php并发问题的方法有很多 具体可以使用MySQL的行级锁 乐观锁和Redis的分布式锁等技术来解决 此外 还可以使用消息队列 多进程 多线程等技术来解决php并发问题
  • 人机交互-2-交互设计的原则与方法

    交互设计的原则与方法 交互设计中的问题 尽量减少用户需要记忆的部分 缺乏反馈 1 目标Goal vs 意图Intention 单个目标可对应多个意图 举例 删除文档中的部分内容的目标 意图1 通过编辑菜单删除 意图2 通过删除按钮删除 每个
  • CTF_Web_[GXYCTF2019]Ping Ping Ping

    一 题目 Ping Ping Ping 二 靶机信息链接 靶机信息 剩余时间 10072s http 70284b15 7c4e 4548 8b04 aadbc6e669f5 node4 buuoj cn 81 三 靶机链接页面 四 分析
  • Hector-SLAM初使用

    Hector SLAM初使用 首先把二维雷达的包拷贝到笔记本上 编译一次通过 连接也没有问题 rviz中可以看到原始激光 想演示一下二维激光雷达的SLAM建图 Hector SLAM相对比较容易 主要参考了下面的几篇博客 SLAM hect
  • 如何使用PowerDesigner软件进行数据库设计(多对多关系)

    如何使用PowerDesigner软件进行数据库设计 多对多关系 1 多对多关系示例 2 创建CDM 3 建立实体之间的联系 4 检查CDM 5 将CDM转换成PDM 6 由PDM生成sql文件 1 多对多关系示例 1 表名和字段 学生表
  • Spark Schema、Hive和Python的数据类型关系,以及Pyspark数据类型详解

    文章目录 1 概念阐述 1 1 Spark中支持的数据类型 1 2 Spark中的基本类型与Python数据类型 Hive表数据类型的对应关系 1 3 Hive中数字类型各自的表示范围 2 分类型介绍每种数据类型的详情 2 1 数字类型 B
  • 程序员保命技能,Mysql bin_log数据恢复,你还不知道吗?

    大家好我是迷途 一个在互联网行业 摸爬滚打的学子 热爱学习 热爱代码 热爱技术 热爱互联网的一切 无论你是正在路上的旅人 还是背上行囊 整装待发的学子 都可以点赞关注一下帅途的动态 当然如果帅途拿到比较好的学习资料或者看见比较好的文章也会第
  • 创建型模式(二):抽象工厂模式

    前面介绍的 工厂方法模式 中考虑的是一类产品的生产 如畜牧场只养动物 电视机厂只生产电视机 计算机软件学院只培养计算机软件专业的学生等 同种类称为同等级 也就是说 工厂方法模式 只考虑生产同等级的产品 但是在现实生活中许多工厂是综合型的工厂
  • [助兴篇]失业的程序员第八章-白话版

    http www shenyisyn org 2013 04 17 sycxy8 2 htm 博主昨天更新了 the jobless programmer 第八章 结果正评和负评参半 博主昨天在外地向我求助 希望我整个观后感 看在博主这么萌
  • golang的hijack篡取劫持

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