landro / TesTcl

when you don't have the balls to test your F5 BIG-IP iRules directly in production
https://testcl.com
BSD 3-Clause "New" or "Revised" License
98 stars 30 forks source link

Overwriting Fields in iRule #49

Open davidpean opened 7 years ago

davidpean commented 7 years ago

I am trying to verify that a URI rewrite is occuring -- Is it expected that you are unable to overwrite a field that you already set in the test with an iRule? For example:

iRule:

rule simple {

  when HTTP_REQUEST {
    HTTP::uri "/foobar"
  }

}

Test:

it "rewrite example" {
  event HTTP_REQUEST
  on HTTP::uri return "/foo"
  verify "URI is rewritten to" "/foobar" eq {HTTP::uri}
  run resources/simple_irule.tcl simple
}

in the debug, it looks like the value is getting set

debug HTTP::uri set: /foobar

However, when the verify executes it goes back to what was set in the on

info Returning value '/foo' for procedure call 'HTTP::uri'

error Verification 'URI is rewritten to' failed - expression: {/foobar} eq {/foo}

I know there is an issue trying to overwrite when using before statements, but wasn't sure if it was possible in the actual iRule. Any help would be much appreciated!

landro commented 7 years ago

Why would you try to mock out the uri when your're actually hardcoding it? That doesn't make any sense to me. Could you please elaborate on the use case for this?

ernst-at-tv2 commented 5 years ago

One use-case that I have is that if a certain HTTP::uri is given we want to rewrite the uri to another value

ernst-at-tv2 commented 5 years ago

@landro hope that this can help elaborate on why it would be a useful feature 🙂

irule.tcl

rule simple {
    when HTTP_REQUEST {
        if {[class match [getfield [HTTP::host] ":" 1][HTTP::uri] equals dg_redirect_map]} {
            set redirect_url [class match -value -- [getfield [HTTP::host] ":" 1][HTTP::uri] equals dg_redirect_map]
            HTTP::uri $redirect_url
            pool pool_traefik
        }
    }
}

test.tcl

package require -exact testcl 1.0.13
namespace import ::testcl::*

it "should rewrite HTTP::uri when matching key of datagroup" {
    class configure dg_redirect_map {
        "sport.blargh.com/video" "/section/video"
    }

    event HTTP_REQUEST
    on HTTP::host return "sport.blargh.com:80"
    on HTTP::uri return "/video"
    on pool pool_traefik return ""
    verify "the URI should be rewritten" "/section/video" eq {HTTP::uri}
    run irule.tcl simple
}
landro commented 5 years ago

Thanks for providing this example @ernst-at-tv2 !

ernst-at-tv2 commented 5 years ago

figured out that I can actually test this if I do HTTP::uri "/video" in the test.tcl file, i.e. if I remove the on and return

I'm a bit puzzled as to what the difference between doing it like this is? I've hit another snag where I'm testing HTTP::path and that only works when I set HTTP::uri "/video" it won't work with on HTTP::uri return "/video" which wrongly returns / instead of /video

It might be a separate issue, just wanted to mention it.