Forum Discussion
Eric_Waite_1046
Nimbostratus
Jan 08, 2007findstr
What does the following mean exactly?
set jsess [findstr [HTTP::uri] "jsessionid" 11 "?"]
What would it set the jsess variable in the following request?
http://users.readingplus.com/readingplus/loginSchool.do;jsessionid=F8E2C6F9B4CB4FA10EB277639AD77E96
I am confused with the syntax of findstr.
Thanks in advance
-Eric
6 Replies
- hoolio
Cirrostratus
Hi Eric,
Here is the wiki page on findstr:Click here
findstr [ []
* Finds the string within and returns a sub-string based on the and from the matched location. Note the following:
* * The argument may be either a character or length.
* * If the argument is not specified, it defaults to zero.
* * If the argument is not specified, it defaults to the end of the string.
To test this, you can create a test rule that logs the results of the findstr command when the rule is initialized. As the HTTP::uri value won't exist at that point, you can save the URI value you want to test as a string in a variable.when RULE_INIT { set uri "/readingplus/loginSchool.do;jsessionid=F8E2C6F9B4CB4FA10EB277639AD77E96" set jsess [findstr $uri "jsessionid" 11 "?"] log local0. "\$jsess: $jsess" }
Here is the output from /var/log/ltm:
Jan 8 17:38:21 tmm tmm[1233]: Rule : $jsess: F8E2C6F9B4CB4FA10EB277639AD77E96
So findstr is searching the URI for "jsessionid", skipping 11 characters (the length of jsessionid plus the '=', and returning everything up to the '?' if there is one. If the terminator of '?' isn't found, the entire string after the skip count is returned.
Using a '?' as the terminator here accounts for the possibility of a query string in the URI.
Holler if you have any questions.
Aaron - Eric_Waite_1046
Nimbostratus
Thanks for you help, my problem stems from the following iRule that I am using for persistence. On some of my requests the persistence is not holding and its going to another server in the pool. I am at a loss.
I am correct to assume that the response is not what is not controlling what server the request gets sent to?
Any help would be appreciated.
- Eri
when HTTP_RESPONSE {
if { [HTTP::cookie exists "JID"] } {
set resPers [HTTP::cookie "JID"]
log "lookup for $resPers in table = >[persist lookup uie $resPers]<"
if { [persist lookup uie $resPers] equals "" } {
persist add uie $resPers 3700
log "NEW PERSIST - added response entry *$resPers* for server [LB::server addr]"
} else {
log "FOUND PERSIST - continued sessionId *$resPers* for server [LB::server addr]"
}
}
}
when HTTP_REQUEST {
set jsess [findstr [HTTP::uri] "jsessionid" 11 "?"]
if { $jsess != "" } {
persist uie $jsess 3700
log "USING PERSIST - used URI value is *$jsess*, server [LB::server addr]"
}
} - JRahm
Admin
I could never get a 100% solution with only the persist command. Probably my flawed coding, but rather than spin my wheels I switched to the session flavor of persistence so I could store the serverIP. If I get a match, I send the connection directly to the pool member serverIP stored in the session table:when HTTP_RESPONSE { if { [HTTP::cookie exists "JSESSIONID"] } { set trimID [lindex [split [HTTP::cookie "JSESSIONID"] "!" ] 0 ] if { [session lookup uie $trimID] equals "" } { session add uie $trimID [IP::server_addr] 1800 } } } when HTTP_REQUEST { if { [findstr [HTTP::uri] "jsessionid" 11 "!"] != ""} { pool MyPool member [session lookup uie [findstr [HTTP::uri] "jsessionid" 11 "!"] ] } else { pool MyPool } } - Eric_Waite_1046
Nimbostratus
I am now using the following and the persistenc edoes not allways hold, its almost as if the table is removing the entry on BIG_IP.
BTW could the "?" be throwing it off, I want to parse up until there is a ? in the URL. To handle passed in request vars.
Why do you use "!" in your parsing of jsessionid?
- Eric
when HTTP_RESPONSE {
if { [HTTP::cookie exists "JID"] } {
set resPers [HTTP::cookie "JID"]
if { [persist lookup uie $resPers] equals "" } {
session add uie $resPers [IP::server_addr] 3700
}
}
}
when HTTP_REQUEST {
set jsess [findstr [HTTP::uri] "jsessionid" 11 "?"]
if { $jsess != "" } {
pool test_pool member [session lookup uie [findstr [HTTP::uri] "jsessionid" 11 "?"] ]
} else {
pool test_pool
}
} - JRahm
Admin
I trim at the ! so I only get the session ID. If you trim at the ? you also get the unique weblogic server identifiers, which I have noticed occasionally change.
If you want to discover these unique identifiers real time, you can insert the header X-Weblogic-Request-ClusterInfo towards the application:when CLIENT_ACCEPTED { set get_server_mappings 1 } when HTTP_REQUEST { if { $get_server_mappings } { HTTP::header insert "X-Weblogic-Request-ClusterInfo" "true" set get_server_mappings 0 } }
Then on the next response, extract the information from the header X-WebLogic-Cluster-Listwhen HTTP_RESPONSE { if { [HTTP::header exists "X-WebLogic-Cluster-List"] }{ set server_mappings [split [HTTP::header "X-WebLogic-Cluster-List"] "|" ] Remove header before returning to client HTTP::header remove "X-WebLogic-Cluster-List" } }
I'll leave it to you to discover what to do with this information, weblogic returns a lot of useful information! - Eric_Waite_1046
Nimbostratus
Thanks for the reply.
I am not using any Enterprise Application Server .... yet.
Just multiple Tomcats.
Thanks.
Eric
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
