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

eLeCtRoN's avatar
eLeCtRoN
Icon for Cirrus rankCirrus
Feb 12, 2024

F5 iRule for Header insert

Hello,

I create that iRule below, but my header value for the header x-id is still empty, what could be wrong ?

when HTTP_REQUEST {
foreach header_name [HTTP::header names] {
if {([HTTP::header value $header_name] eq "x-id")} {
set VALUE [HTTP::header "XXX#YYYY" ]
HTTP::header insert "x-id" $VALUE
  }
 }
}

 

kind regards

eLeCtRoN

6 Replies

  • it seems you want to replace the header value with something else? What do you want to accomplish exactly?

    You can try this.

    if { [HTTP::header exists x-id] } {
    set VALUE [HTTP::header "XXX#YYYY"]
    #log command to determine if VALUE is set correctly
    log local0. "x-idlog var VALUE=$VALUE"
    # header x-d allready exists -> remove it first.
    HTTP::header remove x-id
    # add header x-id with variable VALUE
    HTTP::header insert x-id $VALUE
    }

     

    The problem might be the var VALUE is not set correctly, and is thus empty.

    • eLeCtRoN's avatar
      eLeCtRoN
      Icon for Cirrus rankCirrus

      Hello Cypher,

      our header x-id is empty per default and the WAF doesen't like that and blocks our request, so I want to set a value

      for the header x-id, now I set your iRule active and the header is still empty, in the system log I got just the messages

      HTTP:header insert x-id $VALUE
      syslog-nglog local0. \"x-idlog var VALUE=$VALUE\"
      • Cypher's avatar
        Cypher
        Icon for Cirrus rankCirrus

        i would troubleshoot 'bottom-up' and use lowercase for variables (not sure if that has an impact, but it is a good practice).

         

        i don't know what XXX#YYYY is, but it needs to exists as a header, or whatever you use instead of XXX#YYYY. so lets see if it exists first in the logs.

        when HTTP_REQUEST {
        foreach header_name [HTTP::header names] {
        log local0. "$header_name"
         }
        if { [HTTP::header exists x-id] } {
        set value [HTTP::header "XXX#YYYY"]
        #log command to determine if VALUE is set correctly
        log local0. "x-idlog var value=${value}"
        # header x-id allready exists -> remove it first.
        HTTP::header remove x-id
        # add header x-id with variable value
        HTTP::header insert x-id $value
        }
        }

        check system > logs > local traffic for errors and logs.

  • Hi eLeCtRoN do you also have a header named XXX#YYYY? If not, then that's going to be an empty value anyway. If you are trying to:

    1. Assure the x-id header exists
    2. Assure that the x-id header has a value

    Then, something like this should work for you:

    when HTTP_REQUEST priority 500 {
        if { [HTTP::header exists x-id] && ([HTTP::header x-id] == "") } { 
            HTTP::header replace x-id "some value here" 
        } else { 
            HTTP::header insert x-id "some value here" 
        } 
    }

    if you don't need the header to be there then you can eliminate the else statement altogether.

    • eLeCtRoN's avatar
      eLeCtRoN
      Icon for Cirrus rankCirrus

      Hi Jason,

      just short tell you what I have, I have form the application the header x-id with no value inside (empty), so my WAF policy don't like that and block the request, what I now want to do is just to set a value inside the header x-id. Thanks for your response

      • JRahm's avatar
        JRahm
        Icon for Admin rankAdmin

        then that should work for you as is, or without the else block.