记录一次Bug的查找

赶时间的小伙伴直接看结论即可。

结论

  • JMtmer的\r需要进行编码 编码为&#xd

  • POST请求,最好一定要带上Content-Length,Content-Type

  • SP 和 CR 不是一个东西 CR是回车,SP是空格

  • 换行: Windows下为CRLF,Linux下为LF

问题:

Linnx下的JMeter 的发送SSL–RSA的POST请求,无法发送,返回码为 400, 提示 请求头异常,服务端不认识请求头。

环境简介:

Centos7 安装的 JMeter 5.2.1版本。

JMtmer实现SSL请求方式为:JMtmer调用Jar包,Jar包调用.so库实现 SSL。 而此时request请求是作为一个参数传入给Jar包的。

解决思路:

1. 查看请求头

检查了发送的请求头,发现代码里面写了 Content-Type:text的,而服务端需要使用application/json格式,于是我曾尝试加2个Content-Type,但是没有成功。这也引出来一个问题,同一个请求头,重复的字段,到底哪个生效?

2.使用Win下的JMeter测试

使用win下JMtmer 自带的SSL 进行测试—使用方法为:选项–SSL管理器–选择CA。然后http协议直接写https

结果是可以通过的-----说明后台服务不是异常的,错误还是在发送端。

3. 查看JMeter脚本

查看Linux的脚本,发现了在request参数那里,出现了M。出现M是因为linux编码不识别\r,在windows下的 回车换行(\r\n)(CRLF)到linux下就变成了^M/n。

想到应该是M不认识,那么将M去掉,再次执行jmx脚本。发现还是报400。

这时候想起来HTTP的请求标准:需要以/r/n进行结束。

我竟然傻傻的在请求的末尾加上了 space。然后进行测试,结果当然不通过。其实此时 末尾为 SPLF。

这时候 我的排查思路出现了偏差,我怀疑了Jar包是不是出现了问题。于是写Java的Demo放到Linux上跑,结果当时是过了。

Linux下的Java编译和运行

我的是同一个package下多个文件。

编译:

javac -encoding “utf-8” -sourcepath /root/ssl_jni/src/ -classpath /root/ssl_jni/classes/ /root/ssl_jni/src/cn/…/anxxx.java -d /root/ssl_jni/classes/

运行:

java -classpath /root/ssl_jni/classes cn/…/anxxx

这使我更加迷惑了,同样的请求内容,为什么JMeter不行,而Java执行却好用呢?其实仔细看,此时请求结尾都是以\r\n结尾的。

但是当时我很迷惑,明明都是一样的字符串,为啥一个好用,一个不好用呢?

于是我将不好用的字符串和 好用的字符串 挨个比Ascll码,结果我一下子就明白了。

很明显,SP!=CR 直到此时我才明白我犯了错误-----将SP和CR搞混了。

现在就是如何在JMtmer上表达CR了,受限于Linux,我根本不知道如何在Linux下的文本里表达CR。

4.峰回路转

我询问了同事,其中有一个同事说,可以看看xml对CR是怎么处理的。(因为JMeter脚本就是一个XML文件)。

这给了我灵感,我马上看windows下的JMtmer脚本是如何处理CR,忽然发现JMtmer脚本直接对换行做了HTML编码。

于是我在Linux上对脚本同样做了处理。结果请求成功了!(此时响应码为 500)

5.新问题

请求码报500,提示缺少Body。

此时我请求Body是Json字符串,Jmetr也会做编码。于是我查看了Linux下的JMtmer脚本,发现已经编码了。

又使用Java Demo进行请求。发现也会报 500 ,缺少头。

于是开始抓包,由于是SSL,需要wireshark进行解包,可是私钥是jks,需要导出p12格式的私钥。尤其注意,RSA的加密套件不能是ECDHE的算法,否则无法解析出来报文。

抓包查看了失败报文 和成功的报文对比,发现缺少关键请求头Content-Length,Content-Length的长度为Body的length,于是在Java Demo中加入了Content-Length请求可以成功了。

其实这是自己挖的坑,在一开始我会自动添加Content-Type和Content-Length,后来不需要自动添加Content-Type,我就直接也把Content-Length注释掉了。。。。

总结

  • JMtmer的\r需要进行编码 编码为&#xd
  • POST请求,最好一定要带上Content-Length,Content-Type
  • SP 和 CR 不是一个东西 CR是回车,SP是空格
  • 换行: Windows下为CRLF,Linux下为LF

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

JMeter的编码与HTTP请求相关推荐

  1. JMeter插件模拟发送UDP请求:UDP sampler

    JMeter安装UDP插件后支持发送UDP协议的请求包,官方介绍安装插件后可以用来测试DNS, NTP, TFTP, Boot servers and many-many other systems. ...

  2. jmeter中控制器3个请求其中一个访问不到_性能测试干货丨盘点JMeter常见的逻辑控制器...

    JMeter提供了不同种类的逻辑控制器,包括循环(Loop),简单(Simple),事务型(Transaction),模块(Module),随机(Random)等.对于刚接触JMeter不久的用户,甚 ...

  3. jmeter校验结果_JMeter(1)--请求内容验证

    样例:使用JMeter验证接口请求的返回内容 从http://zzk.cnblogs.com中搜索1,验证结果页面中是否存在内容:够不断地输出0 请求接口:http://zzk.cnblogs.com ...

  4. jmeter压测学习47-发soap请求测试webservice接口

    前言 jmeter3 的版本可以新建一个SOAP/XML-RPC Request 的请求,直接测试webservice的接口. jmeter5.1.1 版本已经去掉了自带的SOAP/XML-RPC R ...

  5. 使用jMeter构造大量并发HTTP请求进行微服务性能测试

    比如我开发好了一个微服务,想测试其在大并发请求下的性能表现如何. 比较方便的一个做法是使用工具jMeter来构造这些请求. 创建一个新的工程: 创建一个新的Thread Group,下图意思是这个工程 ...

  6. 页面编码和被请求的资源编码如果不一致如何处理

    对于ajax请求传递的参数,如果是get请求,参数传递中文,在有些浏览器会乱码 不同的浏览器对参数编码的处理方式不同,所以对于get请求的参数需要使用 encodeURIComponent函数对参数进 ...

  7. jMeter 模拟 web 高并发请求

    导航 一.jmeter 简介与下载 二.接口压测设置 三.实战演示 一.jmeter 简介与下载 Apache JMeter是Apache组织开发的基于Java的压力测试工具. 最初被设计用于Web应 ...

  8. 「Python 编程」编码实现网络请求库中的 URL 解析器

    相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...

  9. JMeter配置元件【HTTP请求默认值】

    1.HTTP请求默认值介绍 我们在JMeter中编辑测试计划时,如果有多个Sampler(取样器)请求中,参数和设置都是相同的,例如请求服务的IP地址.协议.端口号等,这些信息重复的配置在每个Samp ...

最新文章

  1. MSSQL Sql加密函数 hashbytes 用法简介
  2. ExecutorService(任务调度器)详解
  3. 瑞士银行开户条件有哪些,瑞士银行开户的流程及注意事项是什么?
  4. python中的if not语句_python中使用if not x 语句用法
  5. 用Java对HashMap排序
  6. java写便签_如何编写一个便签程序(用Java语言编写)
  7. PHP实现单件模式的几种方式
  8. 关于Python中的错误与异常,你是否了解的够仔细?
  9. 卷积神经网络——第一周 卷积神经网络基础——第四部分
  10. java使用bks双向认证_android客户端SSL单向双向认证
  11. 论文笔记_S2D.21_2014-CVPR_单张图像的离散-连续深度估计
  12. java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式
  13. 相对论【6】广义相对论简单的几乎无关的讨论
  14. ora-12514TNS 监听程序当前无法识别连接描述符中请求服务的解决
  15. Postman接口测试工具
  16. RTEMS 移植到 sbc2440 的笔记
  17. [学习笔记]马氏链模型
  18. 启动nacos报错:Exception in thread main java.lang.UnsupportedClassVersionError
  19. 内容为王时代,你还在用畅言评论吗?
  20. 什么是寄存器的recovery time和removal time?

热门文章

  1. 在线图像识别相似图片_宋源:图像识别传感器在制桶设备上的应用(附视频)...
  2. 和quicklook相似的软件_细数软件推荐上万热度出现比例较高的10款软件,看看谁出现最多...
  3. 【Python制作小游戏】一篇文章带你做出自己的“大鱼吃小鱼”
  4. 个人计算机多核cpu好处,CPU是多核好还是高主频好?
  5. c#期末考试知识点_c#期末考试复习题及答案
  6. java web 分页_Java Web(十一) 分页功能的实现
  7. Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)
  8. 全自动光电整纬机安装和功能分析
  9. 23个Python爬虫开源项目代码
  10. Spring系统学习--20180613:Spring的AOP开发说明