diff options
Diffstat (limited to 'pkg/caddyscript')
-rw-r--r-- | pkg/caddyscript/lib/http.go | 111 | ||||
-rw-r--r-- | pkg/caddyscript/lib/regex.go | 64 | ||||
-rw-r--r-- | pkg/caddyscript/lib/time.go | 144 | ||||
-rw-r--r-- | pkg/caddyscript/matcherenv.go | 32 |
4 files changed, 0 insertions, 351 deletions
diff --git a/pkg/caddyscript/lib/http.go b/pkg/caddyscript/lib/http.go deleted file mode 100644 index 5e47d94..0000000 --- a/pkg/caddyscript/lib/http.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2015 Matthew Holt and The Caddy Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package caddyscript - -import ( - "fmt" - "net/http" - - "github.com/starlight-go/starlight/convert" - "go.starlark.net/starlark" -) - -// HTTPRequest represents an http request type in caddyscript. -type HTTPRequest struct{ Req *http.Request } - -// AttrNames defines what properties and methods are available on the HTTPRequest type. -func (r HTTPRequest) AttrNames() []string { - return []string{"header", "query", "url", "method", "host", "tls", "redirect"} -} - -func (r HTTPRequest) Freeze() {} -func (r HTTPRequest) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: HTTPRequest") } -func (r HTTPRequest) String() string { return fmt.Sprint(r.Req) } -func (r HTTPRequest) Type() string { return "HTTPRequest" } -func (r HTTPRequest) Truth() starlark.Bool { return true } - -// Header handles returning a header key. -func (r HTTPRequest) Header(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - var key string - err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 1, &key) - if err != nil { - return starlark.None, fmt.Errorf("get request header: %v", err.Error()) - } - - return starlark.String(r.Req.Header.Get(key)), nil -} - -// Redirect handles an http redirect from starlark code. -func (r HTTPRequest) Redirect(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - var w starlark.Value - var req HTTPRequest - var newURL string - err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 3, &w, &req, &newURL) - if err != nil { - return starlark.None, fmt.Errorf("unpacking arguments: %v", err.Error()) - } - - writer := convert.FromValue(w) - if w, ok := writer.(http.ResponseWriter); ok { - http.Redirect(w, req.Req, newURL, http.StatusSeeOther) - return starlark.None, nil - } - - return starlark.None, fmt.Errorf("first provided argument is not http.ResponseWriter") -} - -// Attr defines what happens when props or methods are called on the HTTPRequest type. -func (r HTTPRequest) Attr(name string) (starlark.Value, error) { - switch name { - case "redirect": - b := starlark.NewBuiltin("Redirect", r.Redirect) - b = b.BindReceiver(r) - - return b, nil - case "tls": - tls := new(starlark.Dict) - tls.SetKey(starlark.String("cipher_suite"), starlark.MakeUint(uint(r.Req.TLS.CipherSuite))) - tls.SetKey(starlark.String("did_resume"), starlark.Bool(r.Req.TLS.DidResume)) - tls.SetKey(starlark.String("handshake_complete"), starlark.Bool(r.Req.TLS.HandshakeComplete)) - tls.SetKey(starlark.String("negotiated_protocol"), starlark.String(r.Req.TLS.NegotiatedProtocol)) - tls.SetKey(starlark.String("negotiated_protocol_is_mutual"), starlark.Bool(r.Req.TLS.NegotiatedProtocolIsMutual)) - tls.SetKey(starlark.String("server_name"), starlark.String(r.Req.TLS.ServerName)) - tls.SetKey(starlark.String("version"), starlark.String(r.Req.TLS.Version)) - - return tls, nil - case "header": - b := starlark.NewBuiltin("Header", r.Header) - b = b.BindReceiver(r) - - return b, nil - case "query": - qVals := r.Req.URL.Query() - query := starlark.NewDict(len(qVals)) - - for k, v := range qVals { - query.SetKey(starlark.String(k), starlark.String(v[0])) - } - - return query, nil - case "url": - return starlark.String(r.Req.URL.Path), nil - case "method": - return starlark.String(r.Req.Method), nil - case "host": - return starlark.String(r.Req.Host), nil - } - - return nil, nil -} diff --git a/pkg/caddyscript/lib/regex.go b/pkg/caddyscript/lib/regex.go deleted file mode 100644 index cc69a36..0000000 --- a/pkg/caddyscript/lib/regex.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 Matthew Holt and The Caddy Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -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 "Regexp" } -func (r Regexp) Type() string { return "Regexp" } -func (r Regexp) Truth() starlark.Bool { return true } diff --git a/pkg/caddyscript/lib/time.go b/pkg/caddyscript/lib/time.go deleted file mode 100644 index 0e2f4e4..0000000 --- a/pkg/caddyscript/lib/time.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2015 Matthew Holt and The Caddy Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package caddyscript - -import ( - "fmt" - ti "time" - - "go.starlark.net/starlark" -) - -// Time represents a time type for caddyscript. -type Time struct { - value int64 // time since epoch in nanoseconds -} - -// AttrNames defines what properties and methods are available on the Time type. -func (r Time) AttrNames() []string { - return []string{"now", "parse", "add", "subtract", "minute", "hour", "day", "value"} -} - -// Attr defines what happens when props or methods are called on the Time type. -func (r Time) Attr(name string) (starlark.Value, error) { - switch name { - case "now": - b := starlark.NewBuiltin("now", r.Now) - b = b.BindReceiver(r) - return b, nil - case "parse_duration": - b := starlark.NewBuiltin("parse_duration", r.ParseDuration) - b = b.BindReceiver(r) - return b, nil - case "add": - b := starlark.NewBuiltin("add", r.Add) - b = b.BindReceiver(r) - return b, nil - case "subtract": - b := starlark.NewBuiltin("subtract", r.Subtract) - b = b.BindReceiver(r) - return b, nil - case "minute": - b := starlark.NewBuiltin("minute", r.Minute) - b = b.BindReceiver(r) - return b, nil - case "hour": - b := starlark.NewBuiltin("hour", r.Hour) - b = b.BindReceiver(r) - return b, nil - case "day": - b := starlark.NewBuiltin("day", r.Day) - b = b.BindReceiver(r) - return b, nil - case "value": - return starlark.MakeInt64(r.value), nil - } - - return nil, nil -} - -func (r Time) Freeze() {} -func (r Time) Hash() (uint32, error) { return 0, fmt.Errorf("unhashable: Time") } -func (r Time) String() string { return fmt.Sprint(r.value) } -func (r Time) Type() string { return "Time" } -func (r Time) Truth() starlark.Bool { return true } - -// Hour returns the current hour of a unix timestamp in range [0, 23]. -func (r Time) Hour(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - t := ti.Unix(0, r.value) - return starlark.MakeInt(t.Hour()), nil -} - -// Minute returns the current minute of the hour for a unix timestamp in range [0, 59]. -func (r Time) Minute(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - t := ti.Unix(0, r.value) - return starlark.MakeInt(t.Minute()), nil -} - -// Day returns the current day in a week of a unix timestamp... [Sunday = 0...] -func (r Time) Day(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - t := ti.Unix(0, r.value) - return starlark.MakeInt(int(t.Weekday())), nil -} - -// Now returns the current time as a unix timestamp. -func (r Time) Now(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - val := ti.Now().UnixNano() - r.value = val - return r, nil -} - -// ParseDuration parses a go duration string to a time type. -func (r Time) ParseDuration(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - var dur string - err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 1, &dur) - if err != nil { - return starlark.None, fmt.Errorf("could not unpack args: %v", err.Error()) - } - - if parsed, err := ti.ParseDuration(dur); err == nil { - val := parsed.Nanoseconds() - r.value = val - return r, nil - } - - return starlark.None, fmt.Errorf("time.parse_duration: argument cannot be parsed as a valid go time duration") -} - -// Add adds time to a time type. -func (r Time) Add(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - var t Time - err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 1, &t) - if err != nil { - return starlark.None, fmt.Errorf("could not unpack args: %v", err.Error()) - } - - val := r.value + t.value - r.value = val - return r, nil -} - -// Subtract adds time to a time type. -func (r Time) Subtract(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { - var t Time - err := starlark.UnpackPositionalArgs(fn.Name(), args, kwargs, 1, &t) - if err != nil { - return starlark.None, fmt.Errorf("could not unpack args: %v", err.Error()) - } - - val := r.value - t.value - r.value = val - return r, nil -} diff --git a/pkg/caddyscript/matcherenv.go b/pkg/caddyscript/matcherenv.go deleted file mode 100644 index 6c9fb50..0000000 --- a/pkg/caddyscript/matcherenv.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 Matthew Holt and The Caddy Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package caddyscript - -import ( - "net/http" - - caddyscript "github.com/caddyserver/caddy/v2/pkg/caddyscript/lib" - "go.starlark.net/starlark" -) - -// MatcherEnv sets up the global context for the matcher caddyscript environment. -func MatcherEnv(r *http.Request) starlark.StringDict { - env := make(starlark.StringDict) - env["req"] = caddyscript.HTTPRequest{Req: r} - env["time"] = caddyscript.Time{} - env["regexp"] = caddyscript.Regexp{} - - return env -} |