From 27ecc7f384bbfc98b28dc73881968897fb8c9a8a Mon Sep 17 00:00:00 2001 From: dev Date: Wed, 3 Apr 2019 11:47:27 -0400 Subject: Protocol and Caddyscript matchers * Added matcher to determine what protocol the request is being made by - grpc, tls, http * Added ability to run caddyscript in a matcher to evaluate the http request * Added TLS field to caddyscript request time * Added a library to manipulate and compare a new caddyscript time type * Library for regex in starlark --- internal/caddyscript/lib/regex.go | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 internal/caddyscript/lib/regex.go (limited to 'internal/caddyscript/lib/regex.go') diff --git a/internal/caddyscript/lib/regex.go b/internal/caddyscript/lib/regex.go new file mode 100644 index 0000000..a06a410 --- /dev/null +++ b/internal/caddyscript/lib/regex.go @@ -0,0 +1,50 @@ +package caddyscript + +import ( + "fmt" + "regexp" + + "go.starlark.net/starlark" +) + +// Regexp represents a regexp type for caddyscript. +type Regexp struct{} + +// AttrNames defines what properties and methods are available on the Time type. +func (r Regexp) AttrNames() []string { + return []string{"match_string"} +} + +// Attr defines what happens when props or methods are called on the Time type. +func (r Regexp) Attr(name string) (starlark.Value, error) { + switch name { + case "match_string": + b := starlark.NewBuiltin("match_string", r.MatchString) + b = b.BindReceiver(r) + return b, nil + } + + return nil, nil +} + +// MatchString reports whether the string s contains any match of the regular expression pattern. More complicated queries need to use Compile and the full Regexp interface. +func (r Regexp) MatchString(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { + var pattern, match string + err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 2, &pattern, &match) + if err != nil { + return starlark.None, fmt.Errorf("could not unpack args: %v", err.Error()) + } + + matched, err := regexp.MatchString(pattern, match) + if err != nil { + return starlark.False, fmt.Errorf("matchstring: %v", err.Error()) + } + + return starlark.Bool(matched), nil +} + +func (r Regexp) Freeze() {} +func (r Regexp) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: Regexp") } +func (r Regexp) String() string { return fmt.Sprint(r) } +func (r Regexp) Type() string { return "Regexp" } +func (r Regexp) Truth() starlark.Bool { return true } -- cgit v1.2.3