从JMeter HTTPSampler中删除Content-Type标头

时间:2015-01-03 03:01:57

标签: jmeter

我有一个针对Web应用程序的JMeter(2.12 r1636949)测试计划。线程组中的一个有问题的步骤是应用程序中的远程URI的HTTP采样器,它需要没有Content-Type标头的HTTP POST,否则它会因HTTP 500错误而失败。更改Web应用程序不是一个选项 - 使用Fiddler检查流量显示浏览器能够执行此操作。

如何禁止从JMeter HTTPSampler发送HTTP标头Content-Type

我尝试了什么:

  • Content-Type设置为空白(以及“REMOVEME”)的情况下将HTTP标头管理器添加到采样器
  • 使用以下行添加BeanShell预处理器:sampler.getHeaderManager().removeHeaderNamed("Content-Type");
  • 设置HTTPSampler“与浏览器兼容的标题”复选框,因为根据its documentation,这可以取消Content-Type,但显然如果“使用multipart / form-data为POST“已设置。我无法设置此项,因为webapp URI(千叶XForms ...Flux/exec/Flux.fireAction路径)也不接受multipart。该应用程序似乎严格要求换行符分隔的正文数据,但没有Content-Type。

以上都不会导致JMeter成功调用远程资源,或者就此而言,不会发送Content-Type。我将我在“查看结果树”中看到的内容与Fiddler中记录的应用流量进行了比较,我所能看到的只是Content-Type的缺席。

来自Fiddler的原始请求示例我正在尝试在JMeter线程组中重新创建:

POST http://hostname/AppName/Flux/exec/Flux.fireAction HTTP/1.1
Accept: */*
Accept-Language: en-us
Referer: http://...referer url...
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; MS-RTC LM 8)
Host: hostname
Content-Length: 143
DNT: 1
Connection: Keep-Alive
Pragma: no-cache
Cookie: JSESSIONID=0000N1QLLDQCQycbKzkeaYFfCr3:18ujjmvjf

callCount=1
c0-scriptName=Flux
c0-methodName=fireAction
c0-id=9983_1420240552716
c0-param0=string:C187
c0-param1=string:1420240546765
xml=true

更新

我能够通过一点JMeter hack成功调用服务器端URL。按照2.12 source(我将采样器设置为HttpClient 4以确定)并仔细检查HTTP Sampler docs(特别是发送文件的MIME-Type注释)我将采样器切换到参数选项卡,将以前的正文数据内容移动到现在作为文件引用的文本文件,并使用参数名称和内容类型设置为{ {1}}。但是,正文内容需要是动态的,因此静态文件不会 - 我需要引用一些线程组变量。我目前正在研究如何读取/写入一个文件,可能作为PreProcessor以线程安全的方式设置这个内容,但这似乎是一个大规模的黑客攻击。我认为这可能是一个有价值的补丁,允许Body Data没有内容类型,特别是在默认情况下不确定text/plain comment

1 个答案:

答案 0 :(得分:0)

我通过在HTTP Sampler之前添加一个BeanShell Sampler来解决这个问题,它将动态文本(使用vars.get(...))作为其“响应”返回。在该采样器中,我使用a function for the per-virtual-user filename使用“保存响应文件”侦听器,将文件名存储为变量。在HTTP Sampler中,我在File Path字段中使用了此变量,Parameter Name

为空text/plainMIME-Type.

下面是BeanShell脚本,如果这可以帮助任何人,以及解决方法的屏幕截图。

//script for prepping Flux.fireAction request
sb = new StringBuilder();
NL = System.getProperty("line.separator");
sb.append("callCount=1").append(NL);
sb.append("c0-scriptName=Flux").append(NL);
sb.append("c0-methodName=fireAction").append(NL);
sb.append("c0-id=2728_1420218928279").append(NL);
sb.append("c0-param0=string:").append(vars.get("chibaIdFromRetrieveButton")).append(NL);
sb.append("c0-param1=string:").append(vars.get("chibaSessionKey")).append(NL);
sb.append("xml=true");
return sb.toString();

bean shell sampler

enter image description here

enter image description here