“invalid character ‘\x1f‘ looking for beginning of value“ 报错解决方法

2023-05-16

目录

问题背景

分析方法

问题原因


问题背景

这个问题来源于我在开启kubectl proxy代理的时候,通过kubectl apply -f xxx.yaml向代理提交一个configMap对象,返回了 "Error while proxying request: invalid character '\x1f' looking for beginning of value" 的报错。

分析方法

我通过打印请求,得到了 kubectl apply -f xxx.yaml 的基本流程:

  • 首先,会发起一个 GET /openapi/v2 的请求
  • 然后会发起一个 POST 请求,并且 body 中内容就是 yaml 文件的内容。

通过查询这个问题出现的原因得知,出现的原因是解析接口返回的字节符切片错误,出现了一堆乱码。解析失败是因为请求在 Header 里加入了Accept-Encoding: gzip,导致返回的结果被 gzip 压缩,然后返回的结果无法通过正常的 ioUtil.ReadAll(rsp.Body) 取出的内容去反序列化。

具体的解决手法参考见 invalid character '\x1f' looking for beginning of value

问题原因

沿着这个思路,我在开启的代理代码里面发现了一段返回结果的拦截

func (mtp *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
	rsp, err := mtp.RoundTripper.RoundTrip(req)
	if err != nil {
		return nil, err
	}

	defer rsp.Body.Close()

	b, err := ioutil.ReadAll(rsp.Body) //读取后,rsp body内容将就空了。需要重新赋值回去
	if err != nil {
		return nil, err
	}
	//序列化对象
	obj := unstructured.Unstructured{}
	if err = obj.UnmarshalJSON(b); err == nil {
		addCustomColumn(&obj, req)
		b, err = obj.MarshalJSON()
		if err != nil {
			return nil, err
		}
	} else {
		return nil, err
	}
	rsp.Body = ioutil.NopCloser(bytes.NewReader(b)) //tips 给body赋值的方法
	fmt.Println("响应对象类型:" + obj.GetKind())
	rsp.Header.Set("Content-Length", strconv.Itoa(len(b))) //这个很重要,如果修改了body内容需要重新计算长度
	return rsp, nil
}

原因是因为我需要在 kubectl get xxx 的时候对返回的结果反序列后修订内容,再序列化后返回。

参考网上的解决方法,方法一是删除 Header 中的 Accept-Encoding: gzip,方法二是添加一段读取 gzip 压缩内容 Body 的代码

if req.Header.Get("Accept-Encoding") == "gzip" {
	gr, err = gzip.NewReader(rsp.Body)
	if err != nil {
		return nil, err
	}
}

两种方法都没能成功,同样返回 "invalid character '\x03' looking for beginning of value"。

最后想到了,我其实并不需要为 /openapi/v2 这类的请求加工处理返回结果,所以只要跳过反序列化就可以,因此在 RoundTrip 中加入

//针对openapi做处理
if regexp.MustCompile(OpenApiPattern).MatchString(req.RequestURI) {
	return rsp, nil
}

最后 kubectl apply -f xxx.yaml 测试 ,通过。

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

“invalid character ‘\x1f‘ looking for beginning of value“ 报错解决方法 的相关文章

  • 字符数组后出现奇怪的字符

    我是 C 的真正初学者 但我正在学习 我以前偶然发现过这个问题 并决定询问其原因是什么 请解释你的答案 以便我学习 我制作了一个程序 允许您输入 5 个字符 然后显示您编写的字符并恢复它们 例如 asdfg gfdsa 奇怪的是 输入的原始
  • “高 ASCII”字符的正确技术术语是什么?

    引用 高 ASCII 或 扩展 ASCII 字符的技术上正确的方法是什么 我指的不仅仅是128 255的范围 而是0 127范围之外的任何字符 它们通常被称为变音符号 重音字母 有时被随意称为 国家 或非英语字符 但这些名称要么不精确 要么
  • UITextField 最大长度

    当我尝试过如何使用 swift 设置可以输入 UITextField 的最大字符数 https stackoverflow com questions 24641982 how to you set the maximum number o
  • javascript 文件附加非法字符

    我认为我的 apache 网络服务器有问题 我无法参考jquery js 我收到以下错误 带镀铬 Uncaught SyntaxError Unexpected token ILLEGAL 使用火狐浏览器 Error illegal cha
  • 字符编码UTF-8支持哪些语言? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 UTF 8 支持哪些语言 UTF 8 支持多少种语言 查看页面支持的脚本 http www unicode org standard supporte
  • Fortran 77 中的字符串数组

    我有一个关于 Fortran 77 的问题 但找不到解决方案 我正在尝试存储定义如下的字符串数组 character matname 255 255 这是一个由 255 个字符串组成的数组 长度为 255 后来我从文件中读取名称列表 并像这
  • 查找R中以逗号分隔的字符串的长度[重复]

    这个问题在这里已经有答案了 我是 R 的新手 我有一个场景来计算 R 中以逗号分隔的每个字符串的长度 我有一个以下数据框 其中有一个列值 我要找出此列中用逗号分隔的每个单元格的长度 我知道这与paste 但无法让它工作 ex DF Valu
  • 如何将汉字一一拆分?

    如果没有特殊字符 如空白 等 在名字和姓氏之间 那么下面如何拆分汉字呢 use strict use warnings use Data Dumper my fh DATA my fname 小三 my lname 张 while my n
  • 将朝鲜文音节分解为字母 (jamo)

    我正在开发一个处理韩语句子的程序 我需要一种方法将音节或块分解为其字母 对于那些不懂韩文的人来说 一个音节由 2 4 个字母 jamo 组成 可以创建数千种不同的组合 我想做的就是将这些音节分解成构成它的字母 我能够通过将其 Unicode
  • php 5.3 CLI 垃圾字符

    我面临的问题是 每当我从命令行运行一个简单的 php 脚本时 它前面都会显示一些垃圾字符 我在 Windows 7 上的 wamp 服务器上使用 php 5 3 9 这是我的脚本代码 这是我在 cli 中得到的 Hi 让我知道是否有其他人遇
  • PHP中如何分割汉字?

    我需要一些关于如何在 PHP 中拆分与英文单词和数字混合的汉字的帮助 例如 如果我读到 FrontPage 2000中文版應用大全 我希望得到 FrontPage 2000 中 文 版 應 用 大 全 or FrontPage 2 0 0
  • 在C#中,将字符串解析为单个字符

    在 C 中 如何将字符串解析为单个字符 Given 词 太棒了 期望的结果 字母 0 W 字母 1 o 字母 2 n 字母 3 d 字母 4 e 字母 5 r 字母 6 f 字母 7 u 字母 8 l Char letters word T
  • 将扰乱的 PDF 字符重新映射为可读文本

    我确实遇到了一个问题 因为 cups PDF 创建的 PDF 文档中的字符被映射到奇怪的符号 在 Ubuntu Linux 14 04 和 16 04 上 我认为它是某种 unicode 即使 Python 告诉我它的字符串类型 type
  • 使用 JAXB Marshaller 处理 XML 转义字符(例如引号)

    我需要使用 JAXB Marshaller JAXB 版本 2 2 将 XML java 对象序列化为 XML 文件 现在在 xml 对象中 我有一个标签 其中包含字符串值这样 lt tagA gt lt YYYYY gt done lt
  • # 符号的 HTML 字符实体是什么?

    符号的 HTML 字符实体是什么 我四处寻找 英镑 不断返回货币 哈希 和 数字 但我尝试的似乎没有变成正确的字符 您可以在以下位置搜索单个字符 文件格式信息 http www fileformat info info unicode ch
  • 如何计算字符串的字符数?

    我是 Scala 的新手 我想计算一个字符在字符串中出现的次数 我该怎么做呢 我开始写这样的东西 但我发现语法很难掌握 有什么帮助吗 var s hello var list s toList distinct list foreach p
  • 删除非英文字符 PHP

    我如何解析字符串以删除 php 中的所有非英文字符 现在我想删除类似的东西 谢谢 str preg replace 00 255 u str
  • JTextArea 中控制字符的 Java 图像

    我正在编写一个由 2 个面板组成的应用程序 一个 JTextArea 用于输入文本 另一个用于显示文本 In these texts I have two special characters namely STX ETX 0x02 0x0
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • C 中的字符计数

    我正在尝试编写一个程序来计算字符串中的所有字符 我本来有它 但后来意识到我无法计算空格 我不明白为什么这不起作用 for m 0 z m 0 m if z m charcount 任何帮助表示赞赏 编辑 如果像这样扫描输入 字符串 会有什么

随机推荐