Learn F5 Technologies, Get Answers & Share Community Solutions Join DevCentral

Filter by:
  • Solution
  • Technology
Clear all filters
Answers

findstr

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

0
Rate this Question

Answers to this Question

placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Hi Eric,

Here is the wiki page on findstr:
Click here


findstr <string> <search_string> [<skip_count> [<terminator>]

* Finds the string <search_string> within <string> and returns a sub-string based on the <skip_count> and <terminator> from the matched location. Note the following:
* * The <terminator> argument may be either a character or length.
* * If the <skip_count> argument is not specified, it defaults to zero.
* * If the <terminator> 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
0
Comments on this Answer
Comment made 1 month ago by turki aldosseri 56

really many thanks ,,

0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
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]"
}
}
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
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
}
}
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
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
}
}
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
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-List


when 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!
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Thanks for the reply.
I am not using any Enterprise Application Server .... yet.
Just multiple Tomcats.

Thanks.


Eric
0