Sunday, June 9, 2013

LoadRunner - how to convert a plain text to URL format

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_"; 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 This is a code of EncodePlainToURL function:/* * 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') 

 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_"; char sOut[100];
 lr_output_message("%s", EncodePlainToURL(sIn, sOut));
 Execute the code, and see the result: 
The input string "t es%d$ + eprst_" was converted to "t%20es%25d%24%20%2B%20eprst%5F".

No comments: