[PATCH] substring matching in std

Rogier 'DocWilco' Mulhuijzen varnish at bsdchicks.com
Sat Sep 20 11:30:34 CEST 2014


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 <perbu at varnish-software.com>
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
> varnish-dev at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-dev/attachments/20140920/7cc7df25/attachment-0001.html>


More information about the varnish-dev mailing list