For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Forum Discussion

Shripaty's avatar
Shripaty
Icon for Cirrus rankCirrus
Dec 26, 2019

How to use a Datagroup of URI Strings to compare and select pool based on HTTP :: Path

HI ,

 

I have a scenario , I am trying to use do pool selection by comparing the starts_with part of the http::path with consecutive URI included in a Datagroup .

 

More over , when i try to do the compare with http:uri starts_with , I am getting a tcl error with class match .

 

Error :

 

TCL error: /Common/xyz...-irule <HTTP_REQUEST> - bad action "match/a/b/x": must be match, search, lookup, element, type, exists, size, names, get, startsearch, nextelement, anymore, or donesearch   while executing "class match[string tolower [HTTP::path]] equals "URI_datagroup""

 

My condition is the URI startswith /a/b/ is fixed whereas the next part of URI is a variable which can be x or y

 

I have to select the pool based on x or y prior to that /a/b is fixed

 

 

 

 

 

 

5 Replies

  • Hi Shripaty,

    This error is caused by no space after "match".

    if { [class match [string tolower [HTTP::path]] equals URI_datagroup] } {
    • Shripaty's avatar
      Shripaty
      Icon for Cirrus rankCirrus

      Thanks , for the hint , but still i am not able to match the consecutive http path with the URI listed in the datagroup

       

      I am trying to match

       

      when HTTP_REQUEST {

       

      if { ([string tolower [HTTP::uri]] starts_with "/a/b") and ([class match [string tolower [HTTP::path]] eq x_URI_list) } {

       

      pool x_pool

       

      }elseif {([string tolower [HTTP::uri]] starts_with "/a/b") and ([class match [string tolower [HTTP::path]] eq y_uri_list]) } {

       

      pool y_pool

       

      }else {

       

      reject

       

      }

       

      }

       

      }

       

  • Can you try this iRule?

    when HTTP_REQUEST {
    	if { [string tolower [HTTP::path]] starts_with "/a/b" } {
    		set newPath [string map {"/a/b" ""} [HTTP::path]]
    		# log local0. "Path without /a/b: $newPath"
    		
    		if { [class match [string tolower $newPath] equals x_uri_list] } {
    			pool x_pool
    		}
    		elseif { [class match [string tolower $newPath] equals y_uri_list] } {
    			pool y_pool
    		}
    		else {
    			# reject
    		}
    	}
    	else {
    		# reject
    	}
    }