I'd prefer to keep substr (or rename it to strstr) but returning the substring instead so you can also use the string.
The reason for this is that regex match doesn't work on dynamic strings. On 20 Sep 2014 10:31, "Rogier 'DocWilco' Mulhuijzen" <[email protected]> wrote: > I'm not fond of using "substr" as the function name, as other languages > use this function with start/end or start/length parameters to create a new > string from the existing string. > > I would suggest one of the following: > > - strstr > - instr > - contains > > Also, just out of curiosity, exactly how much faster is this than a regex > match? > > On Sat, Sep 20, 2014 at 11:12 AM, Per Buer <[email protected]> > wrote: > >> bin/varnishtest/tests/m00018.vtc | 34 ++++++++++++++++++++++++++++++++++ >> lib/libvmod_std/vmod.vcc | 12 +++++++++++- >> lib/libvmod_std/vmod_std.c | 14 ++++++++++++++ >> 3 files changed, 59 insertions(+), 1 deletion(-) >> create mode 100644 bin/varnishtest/tests/m00018.vtc >> >> diff --git a/bin/varnishtest/tests/m00018.vtc >> b/bin/varnishtest/tests/m00018.vtc >> new file mode 100644 >> index 0000000..af00716 >> --- /dev/null >> +++ b/bin/varnishtest/tests/m00018.vtc >> @@ -0,0 +1,34 @@ >> +varnishtest "Test substring matching in std" >> + >> +server s1 { >> + rxreq >> + txresp >> + >> + rxreq >> + txresp >> +} -start >> + >> +varnish v1 -vcl+backend { >> + import ${vmod_std}; >> + >> + sub vcl_deliver { >> + if (std.substr(req.url, "foo")) { >> + set resp.http.sub = "found"; >> + } else { >> + set resp.http.sub = "not found"; >> + } >> + >> + } >> +} -start >> + >> +client c1 { >> + txreq -url "/foobar" >> + rxresp >> + expect resp.http.sub == "found" >> + >> + >> + txreq -url "/quux" >> + rxresp >> + expect resp.http.sub == "not found" >> +} -run >> + >> diff --git a/lib/libvmod_std/vmod.vcc b/lib/libvmod_std/vmod.vcc >> index fbc082b..e59c7a4 100644 >> --- a/lib/libvmod_std/vmod.vcc >> +++ b/lib/libvmod_std/vmod.vcc >> @@ -195,7 +195,6 @@ $Function STRING querysort(STRING) >> >> Description >> Sorts the querystring for cache normalization purposes. >> - >> Example >> set req.url = std.querysort(req.url); >> >> @@ -208,6 +207,17 @@ Example >> >> This will cache the req.body if its size is smaller than 1KB. >> >> +$Function BOOL substr(STRING, STRING) >> + >> +Description >> + Returns true if the second string is a substring of the first >> + string. Note that the comparison is case sensitive. You can >> + use the tolower function on both strings if you want case >> + insensitivity. >> +Example >> + if (std.substr(req.url, req.http.x-restrict)) >> + >> + >> >> SEE ALSO >> ======== >> diff --git a/lib/libvmod_std/vmod_std.c b/lib/libvmod_std/vmod_std.c >> index 8872a1c..8a89bb8 100644 >> --- a/lib/libvmod_std/vmod_std.c >> +++ b/lib/libvmod_std/vmod_std.c >> @@ -239,3 +239,17 @@ vmod_cache_req_body(const struct vrt_ctx *ctx, >> VCL_BYTES size) >> result = VRT_CacheReqBody(ctx, size); >> VSLb(ctx->vsl, SLT_Debug,"VRT_CacheReqBody(%zu): %d", (size_t)size, >> result); >> } >> + >> +VCL_BOOL __match_proto__(td_std_substr) >> +vmod_substr(const struct vrt_ctx *ctx, VCL_STRING mstr, VCL_STRING >> msubstr) >> +{ >> + >> + CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); >> + char *match = strstr(mstr, msubstr); >> + >> + if (match) >> + return(1); >> + else >> + return(0); >> +} >> + >> -- >> 1.9.3 (Apple Git-50)+GitX >> >> -- >> *Per Buer* >> CTO | Varnish Software AS >> Cell: +47 95839117 >> We Make Websites Fly! >> www.varnish-software.com >> [image: Register now] >> <http://info.varnish-software.com/varnish-summits-autumn-2014-registration> >> >> _______________________________________________ >> varnish-dev mailing list >> [email protected] >> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev >> > > > _______________________________________________ > varnish-dev mailing list > [email protected] > https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev >
_______________________________________________ varnish-dev mailing list [email protected] https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
