当前位置: 首页 > news >正文

爬虫请求头Content-Length的计算方法

重点:使用node.js 环境计算,同时要让计算的数据通过JSON.stringify从对象变成string。

1. Blob size

var str = '中国'
new Blob([str]).size // 6

2、Buffer.byteLength

# node
> var str = '中国'
undefined
> Buffer.byteLength(str, 'utf8')
6

原文:Content-Length的计算 - 掘金

在写live-dev-server,向html文件中inject代码片段时,设定Content-Length出现了ERR_CONTENT_LENGTH_MISMATCH

Content-Length

developer.mozilla.org/en-US/docs/…

Content-Length实体标头指示发送给接收者的实体主体的大小(以字节为单位)。用十进制标识的8位字节。

当浏览器接收内容的时候,如果设定了比正确的内容长度小的Content-Length,浏览器接收到内容就会被截断。如下,body,html标签已经被截断了:

如果设定大了,浏览器就会一直处于等待加载更多内容的状态,然后再抛出ERR_CONTENT_LENGTH_MISMATCH。

res.setHeader('Content-Length', len + 200)
复制代码

英文、数字长度计算

服务端在设定Content-Length的时候,可以设置charset,一般设定为UTF-8。我们在计算长度的时候,UTF-8编码下,英文、数字用一字节编码。如下伪代码:

const INJECT_STR = fs.readFileSync('./inject', { encoding: 'utf-8' })
// 在返回的时候
let len = INJECT_STR.length
len += res.getHeader('Content-Length')
res.setHeader('Content-Length', len)
复制代码

这个一般是没有问题的,但是前提是在inject文件里,没有出现中文。如果出现中文,就会有截断的情况出现。

中文长度计算

UTF-8里面,绝大多数中文是3个字节,字符串的length是1,这就造成了结果长度必然小于实际长度,导致内容被截断。 计算的方式可以用下面的方法计算,

参考见 stackoverflow.com/questions/5…

1. Blob size

var str = '中国'
new Blob([str]).size // 6
复制代码

2. charCodeAt

stackoverflow.com/questions/5…

function byteLength(str) {// returns the byte length of an UTF-8 stringvar s = str.length;for (var i=str.length-1; i>=0; i--) {var code = str.charCodeAt(i);if (code > 0x7f && code <= 0x7ff) s++;else if (code > 0x7ff && code <= 0xffff) s+=2;if (code >= 0xDC00 && code <= 0xDFFF) i--; //trail surrogate}return s;
}
byteLength(str) // 6
复制代码

3. Buffer.byteLength

# node
> var str = '中国'
undefined
> Buffer.byteLength(str, 'utf8')
6
复制代码

总结

  1. 在如果中文可以不要的情况下,尽量改用英文。
  2. 使用方法正确计算出Content-Length
  3. node中使用Buffer.byteLengthBlob计算长度。

作者:lceric
链接:https://juejin.cn/post/6919396936382414861
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.lryc.cn/news/60603.html

相关文章:

  • Open Inventor 2023.1 Crack
  • 【华为OD机试真题】查找树中元素(查找二叉树节点)(javaC++python)100%通过率
  • 常用设计模式
  • 时序分析 49 -- 贝叶斯时序预测(一)
  • 从传统管理到智慧水务:数字化转型的挑战与机遇
  • ROS学习第十八节——launch文件(详细介绍)
  • javaweb在校大学生贷款管理系统ns08a9
  • 分布式之搜索解决方案es
  • CSDN 编程竞赛四十六期题解
  • Linux——进程
  • 计及氢能的综合能源优化调度研究(Matlab代码实现)
  • 基于Bert的知识库智能问答系统
  • libapparmor非默认目录构建和安装
  • 2023-04-14 算法面试中常见的查找表问题
  • 从TOP25榜单,看半导体之变
  • [异常]java常见异常
  • gpt4all保姆级使用教程! 不用联网! 本地就能跑的GPT
  • AcWing语法基础班 1.1 变量、输入输出、表达式和顺序语句
  • DC:5靶机通关详解
  • 【测试开发篇9】Junit框架
  • 《Spring MVC》 第五章 实现RESTful
  • Last Week in Milvus
  • Cursor IDE一个GPT4人工智能自动程序编辑器
  • PPO算法-理论篇
  • 【现货】AP6317 同步3A锂电充电芯片 带短温度保护
  • MyBatis详解(2)
  • 2023-04-14 使用纯JS实现一个2048小游戏
  • C++入门(3)
  • 【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案
  • 2023年4月北京/西安/郑州/深圳CDGA/CDGP数据治理认证考试报名