Newer
Older
package gatcaddyfile
import (
"encoding/json"
"strings"
"github.com/caddyserver/caddy/v2/caddyconfig"
"gfx.cafe/gfx/pggat/lib/gat/matchers"
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
)
func MatcherFromConnectionStrings(strs []string, warnings *[]caddyconfig.Warning) json.RawMessage {
var or matchers.Or
for _, str := range strs {
val := MatcherFromConnectionString(str, warnings)
if val != nil {
or.Or = append(or.Or, val)
}
}
if len(or.Or) == 0 {
return nil
}
if len(or.Or) == 1 {
return or.Or[0]
}
return caddyconfig.JSONModuleObject(
or,
"matcher",
"and",
warnings,
)
}
// MatcherFromConnectionString converts from the postgres connection string format to a bunch of matchers.
// Example: postgres://user@address:port/database?parameter_key=parameter_value
func MatcherFromConnectionString(str string, warnings *[]caddyconfig.Warning) json.RawMessage {
// strip optional postgres://
str = strings.TrimPrefix(str, "postgres://")
if str == "" {
return nil
}
var and matchers.And
var parametersString string
var parameters matchers.StartupParameters
parameters.Parameters = make(map[string]string)
kvs := strings.Split(parametersString, "&")
for _, kv := range kvs {
k, v, _ := strings.Cut(kv, "=")
parameters.Parameters[k] = v
}
and.And = append(
and.And,
caddyconfig.JSONModuleObject(
parameters,
"matcher",
"startup_parameters",
warnings,
),
)
}
var database matchers.Database
str, database.Database, _ = strutil.CutRight(str, "/")
if database.Database != "" && database.Database != "*" {
and.And = append(
and.And,
caddyconfig.JSONModuleObject(
database,
"matcher",
"database",
warnings,
),
)
}
user.User, address.Address, _ = strutil.CutLeft(str, "@")
if user.User != "" && user.User != "*" {
and.And = append(
and.And,
caddyconfig.JSONModuleObject(
user,
"matcher",
"user",
warnings,
),
)
}
if address.Address != "" && address.Address != "*" {
if strings.HasPrefix(address.Address, "/") {
address.Network = "unix"
} else {
address.Network = "tcp"
}
and.And = append(
and.And,
caddyconfig.JSONModuleObject(
address,
"matcher",
"local_address",
warnings,
),
)
}
if len(and.And) == 0 {
return nil
}
if len(and.And) == 1 {
return and.And[0]
}
return caddyconfig.JSONModuleObject(
and,
"matcher",
"and",
warnings,
)
}