github.com/gin-contrib/timeout应前置使用

embedded/2024/9/22 14:58:40/

首先,gin中间件是有执行顺序的,就是按照添加的顺序进行的。之前没在意,我把timeout中间件放在了最后面,导致业务一直不正常,后面debug源码总算看明白了:
源码入口:

func(c *gin.Context) {finish := make(chan struct{}, 1)panicChan := make(chan interface{}, 1)w := c.Writerbuffer := bufPool.Get()tw := NewWriter(w, buffer)c.Writer = twbuffer.Reset().....
}

然后这个NewWriter(w, buffer)的实现如下:

func NewWriter(w gin.ResponseWriter, buf *bytes.Buffer) *Writer {return &Writer{ResponseWriter: w, body: buf, headers: make(http.Header)}
}

他这里所做的就是把原始的writer下层一级,然后new了新的body和headers,也就是进行一层封装

这里也就意味着,假如你原来已经在body和header中写入了一些内容,在后续的代码中你就无法获取到原来的内容改了,获取到的是新的header 和body

当然,gin框架自带的中间件,肯定还是考虑得很细的,所以再最后他有把新旧header和body合并的操作:

			dst := tw.ResponseWriter.Header()for k, vv := range tw.Header() {dst[k] = vv}if _, err := tw.ResponseWriter.Write(buffer.Bytes()); err != nil {panic(err)}

tw.Header()就是新headerdst就是旧header,用一个for循环新header中的值合并到旧header中,也就是原始的c *gin.Context中。这里一切看起来都那么的合理是吧!

但是,这里有个bug,假设在dst中,已经包含了keyabctw.Header()也有keyabc,那么旧的key就会被覆盖掉。导致原header信息丢失,这就是我项目中遇到的bug

同理,body也是一样存在丢失的风险。

这里他就没考虑到这个问题,所以,中间件需要放在有业务逻辑的中间件之前执行,这样才能避免出现这个bug


http://www.ppmy.cn/embedded/34307.html

相关文章

dynamic_cast 静态转换

dynamic_cast 静态转换 const_cast 常量转换 重新解释转换(reinterpret_cast) 最不安全

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

GoF之工厂模式

GoF之工厂模式 文章目录 GoF之工厂模式每博一文案1. 简单说明“23种设计模式”1.2 介绍工厂模式的三种形态1.3 简单工厂模式(静态工厂模式)1.3.1 简单工厂模式的优缺点: 1.4 工厂方法模式1.4.1 工厂方法模式的优缺点: 1.5 抽象工厂模式1.6 抽象工厂模式的…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.2 需求预测

目录 一元特征案例:单个神经元1.需求2.单个神经元实现需求3.激活值 多元特征案例:神经网络1.需求2.原始特征生成新特征3.新特征构建多个神经元4.神经元的访问范围5.构建层6.简化激活值 另一种视角查看多元特征案例1.神经网络看成逻辑回归2.自动学习特征 …

【prometheus】Pushgateway安装和使用

目录 一、Pushgateway概述 1.1 Pushgateway简介 1.2 Pushgateway优点 1.3 pushgateway缺点 二、测试环境 三、安装测试 3.1 pushgateway安装 3.2 prometheus添加pushgateway 3.3 推送指定的数据格式到pushgateway 1.添加单条数据 2.添加复杂数据 3.SDk-prometheus-…

SpringBoot+Vue项目实践课程教学管理平台

一、前言介绍 论文主要是对实践课程教学管理平台进行了介绍,包括研究的现状,还有涉及的开发背景,然后还对系统的设计目标进行了论述,还有系统的需求,以及整个的设计方案,对系统的设计以及实现,…

C语言:文件操作(上)

片头 嗨!小伙伴们,今天我们来学习新的知识----文件操作,准备好了吗?我要开始咯! 目录 1. 为什么使用文件? 2. 什么是文件? 3. 二进制文件和文本文件? 4. 文件的打开和关闭 5. 文件顺序读写…

移动网络学习笔记

移动网络 蜂窝通信移动通信系统大区制和小区制频率复用信道分配方式GSM 数字通信系统承载业务电信业务附加业务系统结构信道类型业务信道控制信道多址方式功率控制越区切换位置管理GPRS3GWCDMACDMA 2000TD-SCDMA4G5G三个应用场景5G的技术指标峰值速率体验速率流量密度连接密度端…