Forum Discussion
Nicolas_Menant
Employee
Mar 31, 2008Session command and any virtual ...
Hi,
i faced an issue when trying to share session data between VS:
here was my code:
when HTTP_REQUEST {
if {[session lookup uie {[IP::client_addr] any virtual}] eq ""} {
log local0. "no session data found"
session add uie {[IP::client_addr] any virtual} "1" 1800
} else {
log local0. "session data found "
}
}
Then if i look at my persistence record i can see that my persistence value is [IP::client_addr] -_-'
I did several manipulation and saw that by doing it through a variable it would work and without the {}
when HTTP_REQUEST {
set line "[IP::client_addr] any virtual"
if {[session lookup uie $line] eq ""} {
log local0. "no session data found"
session add uie $line "1" 1800
} else {
log local0. "session data found "
}
}
Is it some kind of issue ?
Thanks for your help!
I saw this behavior in v9.4.3 and v9.4.4
7 Replies
- Nicolas_Menant
Employee
Out of curiosity i tried this iRule:when HTTP_REQUEST { set line "[IP::client_addr] any virtual" if {[persist lookup uie {[IP::client_addr] any virtual}] eq ""} { log local0. "no session data found" persist add uie {[IP::client_addr] any virtual} 1800 } else { log local0. "session data found " } }
and it works, so here the syntax is fine, it doesn't work only for the session command - rubbishking_110
Nimbostratus
Hi
so should we use command "persist" instead of "session" if we want to store value for sharing between two VS?
- rk - Nicolas_Menant
Employee
No mandatory since my workaround works but i think it may be better to wait for an answer from Devcentral.
I opened a support case anyway i'll keep you updated. - rubbishking_110
Nimbostratus
thanks! - Nicolas_Menant
Employee
Hi,
it seems to be an expected behavior ...
Here is the response coming from support:
The session command expects all of the data and associated "any virtual" commands to be a single argument; in other words, a list.
The documentation uses the most obvious and straight forward way of creating a list, which is to use curly braces ( {} ). However, Tcl deliberately does not expand variables inside curly braces, so the session command as it is written does not add the IP address as the key.
See http://devcentral.f5.com/Default.aspx?tabid=63&articleType=ArticleView&articleId=120 for additional details on TCL and braces..
There are two ways to make this work. The first is to use the "list" command to create the list:
set slist [list [IP::client_addr] any virtual] session lookup uie $slist
The second way is to use a string and let Tcl promote it to a list. This is what you are doing when you set the variable.
session lookup uie "[IP::client_addr] any virtual"
HTH - Lee_Orrick_5554Historic F5 AccountThis also applies to the persist command.
http://devcentral.f5.com/wiki/default.aspx/iRules/persist.html
In the comments section of that link, fancisfcm calls out the same solution.
"francisfcm writes:
To allow variable substituition for in = { [any virtual|service|pool] [pool ] }, double quotes should be used instead of braces." - Nicolas_Menant
Employee
Yes it must definitely apply to the persist command too
Thanks for your remark
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects
