[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