mirror of
https://github.com/yusing/godoxy.git
synced 2025-07-26 21:53:16 +02:00
fix serialization, added benchmark tests, updated next release docs
This commit is contained in:
parent
83ea19dd92
commit
bbc10cb105
7 changed files with 120 additions and 4 deletions
|
@ -7,10 +7,13 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"runtime/debug"
|
||||||
)
|
)
|
||||||
|
|
||||||
func initProfiling() {
|
func initProfiling() {
|
||||||
runtime.GOMAXPROCS(2)
|
runtime.GOMAXPROCS(2)
|
||||||
|
debug.SetMemoryLimit(100 * 1024 * 1024)
|
||||||
|
debug.SetMaxStack(15 * 1024 * 1024)
|
||||||
go func() {
|
go func() {
|
||||||
log.Println(http.ListenAndServe(":7777", nil))
|
log.Println(http.ListenAndServe(":7777", nil))
|
||||||
}()
|
}()
|
||||||
|
|
18
internal/docker/label_test.go
Normal file
18
internal/docker/label_test.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package docker_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/yusing/go-proxy/internal/docker"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BenchmarkParseLabels(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
_, _ = docker.ParseLabels(map[string]string{
|
||||||
|
"proxy.a.host": "localhost",
|
||||||
|
"proxy.a.port": "4444",
|
||||||
|
"proxy.a.scheme": "http",
|
||||||
|
"proxy.a.middlewares.request.hide_headers": "X-Header1,X-Header2",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -111,3 +111,11 @@ func TestFinishMultipleCalls(t *testing.T) {
|
||||||
}
|
}
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkTasks(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
task := testTask()
|
||||||
|
task.Subtask("", true).Finish(nil)
|
||||||
|
task.Finish(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -204,8 +204,13 @@ func Deserialize(src SerializedObject, dst any) E.Error {
|
||||||
}
|
}
|
||||||
if hasValidateTag {
|
if hasValidateTag {
|
||||||
errs.Add(ValidateWithFieldTags(dstV.Interface()))
|
errs.Add(ValidateWithFieldTags(dstV.Interface()))
|
||||||
} else if validator, ok := dstV.Addr().Interface().(CustomValidator); ok {
|
} else {
|
||||||
errs.Add(validator.Validate())
|
if dstV.CanAddr() {
|
||||||
|
dstV = dstV.Addr()
|
||||||
|
}
|
||||||
|
if validator, ok := dstV.Interface().(CustomValidator); ok {
|
||||||
|
errs.Add(validator.Validate())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return errs.Error()
|
return errs.Error()
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
|
@ -222,7 +227,10 @@ func Deserialize(src SerializedObject, dst any) E.Error {
|
||||||
errs.Add(err.Subject(k))
|
errs.Add(err.Subject(k))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if validator, ok := dstV.Addr().Interface().(CustomValidator); ok {
|
if dstV.CanAddr() {
|
||||||
|
dstV = dstV.Addr()
|
||||||
|
}
|
||||||
|
if validator, ok := dstV.Interface().(CustomValidator); ok {
|
||||||
errs.Add(validator.Validate())
|
errs.Add(validator.Validate())
|
||||||
}
|
}
|
||||||
return errs.Error()
|
return errs.Error()
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
. "github.com/yusing/go-proxy/internal/utils/testing"
|
. "github.com/yusing/go-proxy/internal/utils/testing"
|
||||||
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDeserialize(t *testing.T) {
|
func TestDeserialize(t *testing.T) {
|
||||||
|
@ -187,6 +188,20 @@ func TestStringToSlice(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToSlice(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := make([]int, 0)
|
||||||
|
_, _ = ConvertString("- 1\n- 2\n- 3", reflect.ValueOf(&dst))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToSliceYAML(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := make([]int, 0)
|
||||||
|
_ = yaml.Unmarshal([]byte("- 1\n- 2\n- 3"), &dst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestStringToMap(t *testing.T) {
|
func TestStringToMap(t *testing.T) {
|
||||||
t.Run("yaml-like", func(t *testing.T) {
|
t.Run("yaml-like", func(t *testing.T) {
|
||||||
dst := make(map[string]string)
|
dst := make(map[string]string)
|
||||||
|
@ -197,6 +212,20 @@ func TestStringToMap(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToMap(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := make(map[string]string)
|
||||||
|
_, _ = ConvertString(" a: b\n c: d", reflect.ValueOf(&dst))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToMapYAML(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := make(map[string]string)
|
||||||
|
_ = yaml.Unmarshal([]byte(" a: b\n c: d"), &dst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestStringToStruct(t *testing.T) {
|
func TestStringToStruct(t *testing.T) {
|
||||||
t.Run("yaml-like", func(t *testing.T) {
|
t.Run("yaml-like", func(t *testing.T) {
|
||||||
dst := struct {
|
dst := struct {
|
||||||
|
@ -212,3 +241,23 @@ func TestStringToStruct(t *testing.T) {
|
||||||
}{"a", 123})
|
}{"a", 123})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToStruct(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := struct {
|
||||||
|
A string `json:"a"`
|
||||||
|
B int `json:"b"`
|
||||||
|
}{}
|
||||||
|
_, _ = ConvertString(" a: a\n b: 123", reflect.ValueOf(&dst))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkStringToStructYAML(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
dst := struct {
|
||||||
|
A string `yaml:"a"`
|
||||||
|
B int `yaml:"b"`
|
||||||
|
}{}
|
||||||
|
_ = yaml.Unmarshal([]byte(" a: a\n b: 123"), &dst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -36,3 +36,27 @@ func TestSplit(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkSplitRune(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
SplitRune(alphaNumeric, ',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkSplitRuneStdlib(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
strings.Split(alphaNumeric, ",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkJoinRune(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
JoinRune(SplitRune(alphaNumeric, ','), ',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BenchmarkJoinRuneStdlib(b *testing.B) {
|
||||||
|
for range b.N {
|
||||||
|
strings.Join(SplitRune(alphaNumeric, ','), ",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ GoDoxy v0.9.0 expected changes
|
||||||
- Edit dashboard app config (e.g. icon, name, category, etc.)
|
- Edit dashboard app config (e.g. icon, name, category, etc.)
|
||||||
- Toggle show / hide apps
|
- Toggle show / hide apps
|
||||||
- Health bubbles, latency, etc. rich info on dashboard items
|
- Health bubbles, latency, etc. rich info on dashboard items
|
||||||
|
- UI config editor
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
@ -99,14 +100,19 @@ GoDoxy v0.9.0 expected changes
|
||||||
- `GODOXY_OIDC_REDIRECT_URL`
|
- `GODOXY_OIDC_REDIRECT_URL`
|
||||||
- `GODOXY_OIDC_SCOPES` _(optional)_
|
- `GODOXY_OIDC_SCOPES` _(optional)_
|
||||||
- `GODOXY_OIDC_ALLOWED_USERS`
|
- `GODOXY_OIDC_ALLOWED_USERS`
|
||||||
|
- `GODOXY_OIDC_ALLOWED_GROUPS` _(optional)_
|
||||||
|
|
||||||
- Use OpenID Connect to authenticate GoDoxy's WebUI and all your services (SSO)
|
- Use OpenID Connect to authenticate GoDoxy's WebUI and all your services (SSO)
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# default
|
# default
|
||||||
proxy.app.middlewares.oidc:
|
proxy.app.middlewares.oidc:
|
||||||
|
|
||||||
# override allowed users
|
# override allowed users
|
||||||
proxy.app.middlewares.oidc.allowed_users: user1, user2
|
proxy.app.middlewares.oidc.allowed_users: user1, user2
|
||||||
|
|
||||||
|
# override allowed groups
|
||||||
|
proxy.app.middlewares.oidc.allowed_groups: group1, group2
|
||||||
```
|
```
|
||||||
|
|
||||||
- Caddyfile like rules
|
- Caddyfile like rules
|
||||||
|
|
Loading…
Add table
Reference in a new issue