如何在JMeter中使用Brotli?

rqqzpn5f  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在设置一个负载测试,在该测试中,我需要在请求的主体中向后端发送一个压缩的brotli csv文件。
我尝试将来自前端的压缩数据直接添加到请求的主体中。在python中压缩数据并将其添加到请求的主体中。将未压缩的数据插入到请求主体中并添加Content-Encoding: br标头。没有任何效果,服务器响应,错误的压缩数据。
有没有办法在jmeter中使用brotli将预压缩的数据发送到jmeter/compress?

guz6ccqo

guz6ccqo1#

正文可以用jmeter预处理器压缩。这有一个好处,你的文件是纯文本可读和可编辑的格式, -当发送请求时,它会被压缩。另请参见,how to gzip request body
至于brotli压缩,应该使用第三方库(与gzip相反,java中没有默认的brotli支持)。因此,首先需要将brotli lib添加到jmeter:

mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:get \
-DrepoUrl=http://download.java.net/maven/2/ \
-Dartifact=com.nixxcode.jvmbrotli:jvmbrotli:0.2.0

mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:get \
-DrepoUrl=http://download.java.net/maven/2/ \
-Dartifact=com.nixxcode.jvmbrotli:jvmbrotli-linux-x86-amd64:0.2.0

cp ~/.m2/repository/com/nixxcode/jvmbrotli/jvmbrotli-linux-x86-amd64/0.2.0/jvmbrotli-linux-x86-amd64-0.2.0.jar  $jmeter_home/lib/
cp ~/.m2/repository/com/nixxcode/jvmbrotli/jvmbrotli/0.2.0/jvmbrotli-0.2.0.jar $jmeter_home/lib/

正如你所看到的,我使用了com.nixxcode.jvmbrotli:jvmbrotli:0.2.0库。这个库没有实现压缩逻辑,它依赖于C语言中的JNI和压缩逻辑,这就是为什么它在一个单独的jar中有平台相关的部分。选择正确的那个。
Setup groovy jmeter preprocessor,并将brotli主体压缩代码放入:

import com.nixxcode.jvmbrotli.enc.BrotliOutputStream;
import com.nixxcode.jvmbrotli.enc.Encoder;
import com.nixxcode.jvmbrotli.common.BrotliLoader;

String bodyString = sampler.getArguments().getArgument(0).getValue();
byte[] bodyBytes = bodyString.getBytes();

log.info("Attempt to load brotli: ${BrotliLoader.isBrotliAvailable()}");
ByteArrayOutputStream compressedBodyBytes = new ByteArrayOutputStream(bodyBytes.length);
OutputStream brotliOutput = new BrotliOutputStream(compressedBodyBytes, new Encoder.Parameters().setQuality(6).setWindow(22));
brotliOutput.write(bodyBytes);
brotliOutput.close();

sampler.getArguments().getArgument(0).setValue(compressedBodyBytes.toString(0));

它会得到你的请求体,压缩它,并在运行中替换,这样请求就会被brotli压缩。
如果您真的想使用预压缩数据,请参阅how to send byte array in jmeter

相关问题