原文:https://ptfrontline.wordpress.com/2009/12/23/loadrunner-http-401-authentication/
译文(转载请标注smooth的博客):
在笔者最近做的一个项目中,偶然发现了一个HTTP验证机制方面的有趣问题。
本人有一个设备对设备(M2M)的接口,在这个接口上用户(客户端)使用HTTP验证来确认是他们自己向服务器传输数据。在这种情况下,没有收到来自服务器对于HTTP 401的响应,因为该用户(客户端)在初始请求中包含了身份验证的信息。
笔者发现LoadRunner不会出现相同的情况。它会在实际发送验证信息之前,先等待HTTP 401响应。如果我们模拟一个专为使用者服务的网络服务,那么这是一个正确的动作,但是在本次案例中,LoadRunner是执行了一个额外的POST请求,而这导致了灾难性的结果,因为这样我一共执行了两个额外的POST请求!
这带来的后果是,我们向整个网络提交了双倍的数据量、向服务器提交了双倍的请求,并因此使连接到服务器的实际负载和吞吐量加倍!
为了解决这个问题,笔者只能在初始请求中包含验证表头。为实现这一操作,笔者使用了 Base64Encoder ( Base64编码/解码 工具)制作所需的 HTTP 验证基础表头信息,然后使用 web_add_header 功能添加到请求中。 以下是本项目中体现如何创建和使用自定义验证表头的代码段:
// Must remove stdauth mechanism since this causes 2POSTS instead of one
// web_set_user( "{Username}","{Password}", "{Domain}:8000" );
// Create Base64 encoded string
b64_encode_string( "{Username}:{Password}","BasicAuth" ); //b64_encode_string函数在网上能搜索到,在此不另提供
// Add HTTP Authorization header "Authorization:Basic XXXXXXXXXXXXXXXXXX==\r\n"
web_add_header("Authorization",lr_eval_string("Basic {BasicAuth}"));
lr_start_transaction("Custom_HTTP_Auth");
web_custom_request("Custom_HTTP_Auth",
"Method=POST",
"EncType=text/xml;charset=\"UTF-8\"",
"URL=http://{Domain}/{Path}/{Document}"
"BodyFilePath=XML.xml",
LAST);
lr_end_transaction("Custom_HTTP_Auth",LR_AUTO);
此外我还发现了另外一种可能有效的办法。这种方法目前只用LR11.03试验过有效。参见如下:
// Standard Web Set User here
web_set_user( "{Username}","{Password}", "{Domain}:8000" );
// Set UNDOCUMENTED socket option to make LR sendAuthentication headers with every request to the domain
web_set_sockets_option("INITIAL_BASIC_AUTH","1");
lr_start_transaction("Custom_HTTP_Auth");
// Now the HTTP request adds the Authentication headerautomatically without receiving
// a HTTP 401 first and then sending the auth header.
web_custom_request("Custom_HTTP_Auth",
"Method=POST",
"EncType=text/xml;charset=\"UTF-8\"",
"URL=http://{Domain}/{Path}/{Document}"
"BodyFilePath=XML.xml",
LAST);
lr_end_transaction("Custom_HTTP_Auth",LR_AUTO);