The task - How to convert a plain text string to URL-format in LoadRunner?
Several days ago I faced with a simple task - it was needed to convert a passed parameter (which was in a plain text form) to URL-format. In other words, I had to convert:
- string "ab" to the same string "ab"
- string "a b" to the string "a%20b"
- string "a b_c%" to "a%20b%5Fc%25"
- and so on ...
The cause - Why it was needed?
LoadRunner script contained parameters, which should be passed to URL directly. Some my parameters contained special characters like spaces (" "), quotes ("), percentage ("%"), asterisks ("*") and others. To be processed correctly by a browser and a web server, these characters should be translated and passed as their hex-codes.
For example:
- a space character (" ") has hex-code 0x20, so it should be passed as "%20"
- underline character (" ") has hex-code 0x5F, so it should be passed as "%5F"
The ways on how to perform the task.
To perform this task I decided to use LoadRunner's web_convert_param function. I didn't know at that time that this function does not satisfy my requirements. So, I was reluctant to write my own function EncodePlainToURL. Well, let's see both solutions.
- web_convert_param function.
As Help says, web_convert_param function converts HTML to a URL or plain text.
So, I wrote this code:char sIn[] = "t es%d$ + eprst_"
Press F5 to execute the code, and.... H'm....;
lr_save_string(sIn, "InputParam");
web_convert_param("InputParam", "SourceEncoding=PLAIN",
"TargetEncoding=URL", LAST);
lr_output_message("%s", lr_eval_string("{InputParam}"));
The input string "t es%d$ + eprst_" was converted to "t+es%25d%24+%2B+eprst_".That means that space (" ") was converted to a plus ("+"). I expected to see "%20" instead of a plus character.
Actually, it seems that "+" and "%20" are twins. For example Google uses a plus to encode a space within a search query. For example, if the query is "some text", then the URL will be: http://www.google.com/search?hl=en&q=some+text&btnG=Google+Search
I was tried to encode spaces (and others special characters) to their hex-codes.
That's why the following function was written: - EncodePlainToURL function.
The logic is simple enough:- If the current character is a digits or an alphabetic letter, then pass it "as is"
- Otherwise the current character is a special one. So, hex-code should be written in this case
/*
* EncodePlainToURL converts a plain text string to an URL-form string.
*
* Parameters: sIn - input string to be encoded to URL format
* sOut - output buffer
* Note: the size of "sOut" parameter should be at least equal to triple size
* of "sIn" parameter plus one character(for end-terminator '\0')
*
* Author: Dmitry Motevich
*
* Examples: "a" -> "a"
* "a b" -> "a%20b"
* "a b_cc:\/c%" -> "a%20b%5Fcc%3A%2Fc%25"
*/
char *EncodePlainToURL(const char *sIn, char *sOut)
{
int i;
char cCurChar;
char sCurStr[4] = {0};
sOut[0] = '\0';
for (i = 0; cCurChar = sIn[i]; i++)
{
// if this is a digit or an alphabetic letter
if (isdigit(cCurChar) || isalpha(cCurChar))
{
// then write the current character "as is"
sprintf(sCurStr, "%c", cCurChar);
}
else
{
// else convert it to hex-form. "_" -> "%5F"
sprintf(sCurStr, "%%%X", cCurChar);
}
// append current item to the output string
strcat(sOut, sCurStr);
}
return sOut;
}
The example of usage is:char sIn[] = "t es%d$ + eprst_
Execute the code, and see the result:";
char sOut[100];
lr_output_message("%s", EncodePlainToURL(sIn, sOut));
The input string "t es%d$ + eprst_" was converted to "t%20es%25d%24%20%2B%20eprst%5F".
Yeah! :)
All special characters (including spaces) were converted to hex-code, i.e. to URL-format!
Dmitry Motevich
3 comments:
Thanks for putting useful info here. Can you post some information on USER HANDLERS and also handling soap compression message in load runner.
Thanks
Ram
Hi, Dmitry
Very good and useful example how to convert plain text to URL format.
But I encountered with problem when text has symbols like ()-.
So I added in your function the next validation ->
if (isdigit(cCurChar) || isalpha(cCurChar) || cCurChar == '(' || cCurChar == ')' || cCurChar == '-')
and now it converts correct.
I suppose that existed several additional symbols that don't need convert to hex-form.
Thank you
Yuri
Hi,
I am scripting in LR 8.1 for a SAP Portal application.
The scripting mode is - HTML.
In one of the web_url request -
web_url("pcd!3aportal_content!2fnag!2fDesktops!2fAusDesktop1!2fframeworkPages!2fframeworkpage!2fcom.sap.portal.innerpage",
"URL=http://xxxxx.bb.ccccc.com:8100/irj/servlet/prt/portal/prtroot/pcd!3aportal_content!2fnag!2fDesktops!2fAusDesktop1!2fframeworkPages!2fframeworkpage!2fcom.sap.portal.innerpage?windowId=WID1217486606312",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html","Referer=http://wstestsap4.au.thenational.com:8100/sap/irj/portal",
"Snapshot=t9.inf",
"Mode=HTML",
LAST);
There is a window id in the URL, eg- WIDXXXXXXXXXXX , which is created based on the timestamp.
This is the first request where this wID ID is appearing and later on in the script it is occuring multiple times.
This id is changing every time a user logs in.
I tried the following code-
char winname[16];
char tstamp1[13];
web_save_timestamp_param("tstamp", LAST);
strcpy(tstamp1,lr_eval_string("{tstamp}"));
sprintf(winname, "WID%s", tstamp1);
This {winname}, I am using in the entire script instead of WIDXXXXX -
web_url("pcd!3aportal_content!2fnag!2fDesktops!2fAusDesktop1!2fframeworkPages!2fframeworkpage!2fcom.sap.portal.innerpage",
"URL=http://xxxxx.aa.bbbbb.com:8100/irj/servlet/prt/portal/prtroot/pcd!3aportal_content!2fnag!2fDesktops!2fAusDesktop1!2fframeworkPages!2fframeworkpage!2fcom.sap.portal.innerpage?windowId={winname}",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://wstestsap4.au.thenational.com:8100/sap/irj/portal",
"Snapshot=t9.inf",
"Mode=HTML",
LAST);
By doing so half of the times this request is passing. But, half of the times i am gettin error HTTP code=500.
Please suggest.
Post a Comment