Skip to content

Commit

Permalink
trim() function (#605)
Browse files Browse the repository at this point in the history
* trim() function

* table format

* changelog entry

Co-authored-by: Joe Afflerbach <joe.afflerbach@avenga.com>
  • Loading branch information
johakoch and afflerbach authored Oct 10, 2022
1 parent a3f5d65 commit 8574c90
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 3 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

Unreleased changes are available as `avenga/couper:edge` container.

* **Added**
* [`trim()` function](https://docs.couper.io/configuration/functions) ([#605](https://github.com/avenga/couper/pull/605))

* **Fixed**
* Aligned the evaluation of [`beta_oauth2`](https://docs.couper.io/configuration/block/oauth2_ac)/[`oidc`](https://docs.couper.io/configuration/block/oidc) `redirect_uri` to `saml` `sp_acs_url` ([#589](https://github.com/avenga/couper/pull/589))
* Proper handling of empty [`beta_oauth2`](https://docs.couper.io/configuration/block/oauth2_ac)/[`oidc`](https://docs.couper.io/configuration/block/oidc) `scope` ([#593](https://github.com/avenga/couper/pull/593))
Expand Down
7 changes: 4 additions & 3 deletions docs/website/content/2.configuration/6.functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,21 @@
| `join` | string | Concatenates together the string elements of one or more lists with a given separator. | `sep` (string), `lists...` (tuples or lists) | `join("-", [0,1,2,3])` |
| `json_decode` | various | Parses the given JSON string and, if it is valid, returns the value it represents. | `encoded` (string) | `json_decode("{\"foo\": 1}")` |
| `json_encode` | string | Returns a JSON serialization of the given value. | `val` (various) | `json_encode(request.context.myJWT)` |
| `jwt_sign` | string | jwt_sign creates and signs a JSON Web Token (JWT) from information from a referenced [JWT Signing Profile Block](block/jwt_signing_profile) (or [JWT Block](block/jwt) with `signing_ttl`) and additional claims provided as a function parameter. | `label` (string), `claims` (object) | `jwt_sign("myJWT")` |
| `jwt_sign` | string | jwt_sign creates and signs a JSON Web Token (JWT) from information from a referenced [JWT Signing Profile Block](block/jwt_signing_profile) (or [JWT Block](block/jwt) with `signing_ttl`) and additional claims provided as a function parameter. | `label` (string), `claims` (object) | `jwt_sign("myJWT")` |
| `keys` | list | Takes a map and returns a sorted list of the map keys. | `inputMap` (object or map) | `keys(request.headers)` |
| `length` | integer | Returns the number of elements in the given collection. | `collection` (tuple, list or map; **no object**) | `length([0,1,2,3])` |
| `lookup` | various | Performs a dynamic lookup into a map. The default (third argument) is returned if the key (second argument) is not found in the inputMap (first argument). | `inputMap` (object or map), `key` (string), `default` (various) | `lookup({a = 1}, "b", "def")` |
| `merge` | object or tuple | Deep-merges two or more of either objects or tuples. `null` arguments are ignored. An attribute value with a different type than the current value is set as the new value. `merge()` with no parameters returns `null`. | `arg...` (object or tuple) | `merge(request.headers, { x-additional = "myval" })` |
| `oauth2_authorization_url` | string | Creates an OAuth2 authorization URL from a referenced [OAuth2 AC Block](block/oauth2) or [OIDC Block](block/oidc). | `label` (string) | `oauth2_authorization_url("myOAuth2")` |
| `oauth2_authorization_url` | string | Creates an OAuth2 authorization URL from a referenced [OAuth2 AC Block](block/oauth2) or [OIDC Block](block/oidc). | `label` (string) | `oauth2_authorization_url("myOAuth2")` |
| `oauth2_verifier` | string | Creates a cryptographically random key as specified in RFC 7636, applicable for all verifier methods; e.g. to be set as a cookie and read into `verifier_value`. Multiple calls of this function in the same client request context return the same value. | | `oauth2_verifier()` |
| `relative_url` | string | Returns a relative URL by retaining `path`, `query` and `fragment` components. The input URL `s` must begin with `/<path>`, `//<authority>`, `http://` or `https://`, otherwise an error is thrown. | s (string) | `relative_url("https://httpbin.org/anything?query#fragment") // returns "/anything?query#fragment"` |
| `saml_sso_url` | string | Creates a SAML SingleSignOn URL (including the `SAMLRequest` parameter) from a referenced [SAML Block](block/saml). | `label` (string) | `saml_sso_url("mySAML")` |
| `saml_sso_url` | string | Creates a SAML SingleSignOn URL (including the `SAMLRequest` parameter) from a referenced [SAML Block](block/saml). | `label` (string) | `saml_sso_url("mySAML")` |
| `set_intersection` | list or tuple | Returns a new set containing the elements that exist in all of the given sets. | `sets...` (tuple or list) | `set_intersection(["A", "B", "C"], ["B", D"])` |
| `split` | tuple | Divides a given string by a given separator, returning a list of strings containing the characters between the separator sequences. | `sep` (string), `str` (string) | `split(" ", "foo bar qux")` |
| `substr` | string | Extracts a sequence of characters from another string and creates a new string. The "`offset`" index may be negative, in which case it is relative to the end of the given string. The "`length`" may be `-1`, in which case the remainder of the string after the given offset will be returned. | `str` (string), `offset` (integer), `length` (integer) | `substr("abcdef", 3, -1)` |
| `to_lower` | string | Converts a given string to lowercase. | `s` (string) | `to_lower(request.cookies.name)` |
| `to_number` | number | Converts its argument to a number value. Only numbers, `null`, and strings containing decimal representations of numbers can be converted to number. All other values will produce an error. | `num` (string or number) | `to_number("1,23")`, `to_number(env.PI)` |
| `to_upper` | string | Converts a given string to uppercase. | `s` (string) | `to_upper("CamelCase")` |
| `trim` | string | Removes any whitespace characters from the start and end of the given string. | `str` (string) | `trim(" foo ")` |
| `unixtime` | integer | Retrieves the current UNIX timestamp in seconds. | | `unixtime()` |
| `url_encode` | string | URL-encodes a given string according to RFC 3986. | `s` (string) | `url_encode("abc%&,123")` |
1 change: 1 addition & 0 deletions eval/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,7 @@ func newFunctionsMap() map[string]function.Function {
"to_lower": stdlib.LowerFunc,
"to_number": stdlib.MakeToFunc(cty.Number),
"to_upper": stdlib.UpperFunc,
"trim": stdlib.TrimSpaceFunc,
"unixtime": lib.UnixtimeFunc,
"url_encode": lib.URLEncodeFunc,
}
Expand Down
3 changes: 3 additions & 0 deletions server/http_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4163,6 +4163,9 @@ func TestFunctions(t *testing.T) {
"X-Lookup-3": "Go-http-client/1.1",
"X-Lookup-4": "default",
}, http.StatusOK},
{"trim", "/v1/trim", map[string]string{
"X-Trim": "foo \tbar",
}, http.StatusOK},
} {
t.Run(tc.path[1:], func(subT *testing.T) {
helper := test.New(subT)
Expand Down
8 changes: 8 additions & 0 deletions server/testdata/integration/functions/01_couper.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,14 @@ server "api" {
}
}
}

endpoint "/trim" {
response {
headers = {
x-trim = trim(" \tfoo \tbar \t")
}
}
}
}
}

Expand Down

0 comments on commit 8574c90

Please sign in to comment.