Compare commits
4 Commits
hwsauth/v0
...
hws/v0.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c2ca4d79a | |||
| 3726ad738a | |||
| 423a9ee26d | |||
| 9f98bbce2d |
2
hws/.gitignore
vendored
2
hws/.gitignore
vendored
@@ -17,3 +17,5 @@ coverage.html
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
.claude/
|
||||
|
||||
21
hws/LICENSE
Normal file
21
hws/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 haelnorr
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
119
hws/README.md
Normal file
119
hws/README.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# HWS (H Web Server)
|
||||
|
||||
[](https://pkg.go.dev/git.haelnorr.com/h/golib/hws)
|
||||
|
||||
A lightweight, opinionated HTTP web server framework for Go built on top of the standard library's `net/http`.
|
||||
|
||||
## Features
|
||||
|
||||
- 🚀 Built on Go 1.22+ routing patterns with method and path matching
|
||||
- 🎯 Structured error handling with customizable error pages
|
||||
- 📝 Integrated logging with zerolog via hlog
|
||||
- 🔧 Middleware support with predictable execution order
|
||||
- 🗜️ GZIP compression support
|
||||
- 🔒 Safe static file serving (prevents directory listing)
|
||||
- ⚙️ Environment variable configuration
|
||||
- ⏱️ Request timing and logging middleware
|
||||
- 💚 Graceful shutdown support
|
||||
- 🏥 Built-in health check endpoint
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
go get git.haelnorr.com/h/golib/hws
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"git.haelnorr.com/h/golib/hws"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Load configuration from environment variables
|
||||
config, _ := hws.ConfigFromEnv()
|
||||
|
||||
// Create server
|
||||
server, _ := hws.NewServer(config)
|
||||
|
||||
// Define routes
|
||||
routes := []hws.Route{
|
||||
{
|
||||
Path: "/",
|
||||
Method: hws.MethodGET,
|
||||
Handler: http.HandlerFunc(homeHandler),
|
||||
},
|
||||
{
|
||||
Path: "/api/users/{id}",
|
||||
Method: hws.MethodGET,
|
||||
Handler: http.HandlerFunc(getUserHandler),
|
||||
},
|
||||
}
|
||||
|
||||
// Add routes and middleware
|
||||
server.AddRoutes(routes...)
|
||||
server.AddMiddleware()
|
||||
|
||||
// Start server
|
||||
ctx := context.Background()
|
||||
server.Start(ctx)
|
||||
|
||||
// Wait for server to be ready
|
||||
<-server.Ready()
|
||||
}
|
||||
|
||||
func homeHandler(w http.ResponseWriter, r *http.Request) {
|
||||
w.Write([]byte("Hello, World!"))
|
||||
}
|
||||
|
||||
func getUserHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id := r.PathValue("id")
|
||||
w.Write([]byte("User ID: " + id))
|
||||
}
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
Comprehensive documentation is available in the [Wiki](https://git.haelnorr.com/h/golib/wiki/hws).
|
||||
|
||||
### Key Topics
|
||||
|
||||
- [Configuration](https://git.haelnorr.com/h/golib/wiki/hws#configuration)
|
||||
- [Routing](https://git.haelnorr.com/h/golib/wiki/hws#routing)
|
||||
- [Middleware](https://git.haelnorr.com/h/golib/wiki/hws#middleware)
|
||||
- [Error Handling](https://git.haelnorr.com/h/golib/wiki/hws#error-handling)
|
||||
- [Logging](https://git.haelnorr.com/h/golib/wiki/hws#logging)
|
||||
- [Static Files](https://git.haelnorr.com/h/golib/wiki/hws#static-files)
|
||||
- [Graceful Shutdown](https://git.haelnorr.com/h/golib/wiki/hws#graceful-shutdown)
|
||||
- [Complete Examples](https://git.haelnorr.com/h/golib/wiki/hws#complete-production-example)
|
||||
|
||||
## Environment Variables
|
||||
|
||||
| Variable | Description | Default |
|
||||
|----------|-------------|---------|
|
||||
| `HWS_HOST` | Host to listen on | `127.0.0.1` |
|
||||
| `HWS_PORT` | Port to listen on | `3000` |
|
||||
| `HWS_TRUSTED_HOST` | Trusted hostname/domain | Same as Host |
|
||||
| `HWS_GZIP` | Enable GZIP compression | `false` |
|
||||
| `HWS_READ_HEADER_TIMEOUT` | Header read timeout (seconds) | `2` |
|
||||
| `HWS_WRITE_TIMEOUT` | Write timeout (seconds) | `10` |
|
||||
| `HWS_IDLE_TIMEOUT` | Idle connection timeout (seconds) | `120` |
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please feel free to submit a Pull Request.
|
||||
|
||||
## Related Projects
|
||||
|
||||
- [HWSAuth](https://git.haelnorr.com/h/golib/hwsauth) - JWT authentication middleware for HWS
|
||||
- [hlog](https://git.haelnorr.com/h/golib/hlog) - Structured logging with zerolog
|
||||
- [jwt](https://git.haelnorr.com/h/golib/jwt) - JWT token generation and validation
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
type Config struct {
|
||||
Host string // ENV HWS_HOST: Host to listen on (default: 127.0.0.1)
|
||||
Port uint64 // ENV HWS_PORT: Port to listen on (default: 3000)
|
||||
TrustedHost string // ENV HWS_TRUSTED_HOST: Domain/Hostname to accept as trusted (default: same as Host)
|
||||
GZIP bool // ENV HWS_GZIP: Flag for GZIP compression on requests (default: false)
|
||||
ReadHeaderTimeout time.Duration // ENV HWS_READ_HEADER_TIMEOUT: Timeout for reading request headers in seconds (default: 2)
|
||||
WriteTimeout time.Duration // ENV HWS_WRITE_TIMEOUT: Timeout for writing requests in seconds (default: 10)
|
||||
@@ -18,13 +17,9 @@ type Config struct {
|
||||
|
||||
// ConfigFromEnv returns a Config struct loaded from the environment variables
|
||||
func ConfigFromEnv() (*Config, error) {
|
||||
host := env.String("HWS_HOST", "127.0.0.1")
|
||||
trustedHost := env.String("HWS_TRUSTED_HOST", host)
|
||||
|
||||
cfg := &Config{
|
||||
Host: host,
|
||||
Host: env.String("HWS_HOST", "127.0.0.1"),
|
||||
Port: env.UInt64("HWS_PORT", 3000),
|
||||
TrustedHost: trustedHost,
|
||||
GZIP: env.Bool("HWS_GZIP", false),
|
||||
ReadHeaderTimeout: time.Duration(env.Int("HWS_READ_HEADER_TIMEOUT", 2)) * time.Second,
|
||||
WriteTimeout: time.Duration(env.Int("HWS_WRITE_TIMEOUT", 10)) * time.Second,
|
||||
|
||||
@@ -15,7 +15,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
// Clear any existing env vars
|
||||
os.Unsetenv("HWS_HOST")
|
||||
os.Unsetenv("HWS_PORT")
|
||||
os.Unsetenv("HWS_TRUSTED_HOST")
|
||||
os.Unsetenv("HWS_GZIP")
|
||||
os.Unsetenv("HWS_READ_HEADER_TIMEOUT")
|
||||
os.Unsetenv("HWS_WRITE_TIMEOUT")
|
||||
@@ -27,7 +26,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
|
||||
assert.Equal(t, "127.0.0.1", config.Host)
|
||||
assert.Equal(t, uint64(3000), config.Port)
|
||||
assert.Equal(t, "127.0.0.1", config.TrustedHost)
|
||||
assert.Equal(t, false, config.GZIP)
|
||||
assert.Equal(t, 2*time.Second, config.ReadHeaderTimeout)
|
||||
assert.Equal(t, 10*time.Second, config.WriteTimeout)
|
||||
@@ -41,7 +39,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
config, err := hws.ConfigFromEnv()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "192.168.1.1", config.Host)
|
||||
assert.Equal(t, "192.168.1.1", config.TrustedHost) // Should match host by default
|
||||
})
|
||||
|
||||
t.Run("Custom port", func(t *testing.T) {
|
||||
@@ -53,18 +50,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
assert.Equal(t, uint64(8080), config.Port)
|
||||
})
|
||||
|
||||
t.Run("Custom trusted host", func(t *testing.T) {
|
||||
os.Setenv("HWS_HOST", "127.0.0.1")
|
||||
os.Setenv("HWS_TRUSTED_HOST", "example.com")
|
||||
defer os.Unsetenv("HWS_HOST")
|
||||
defer os.Unsetenv("HWS_TRUSTED_HOST")
|
||||
|
||||
config, err := hws.ConfigFromEnv()
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "127.0.0.1", config.Host)
|
||||
assert.Equal(t, "example.com", config.TrustedHost)
|
||||
})
|
||||
|
||||
t.Run("GZIP enabled", func(t *testing.T) {
|
||||
os.Setenv("HWS_GZIP", "true")
|
||||
defer os.Unsetenv("HWS_GZIP")
|
||||
@@ -92,7 +77,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
t.Run("All custom values", func(t *testing.T) {
|
||||
os.Setenv("HWS_HOST", "0.0.0.0")
|
||||
os.Setenv("HWS_PORT", "9000")
|
||||
os.Setenv("HWS_TRUSTED_HOST", "myapp.com")
|
||||
os.Setenv("HWS_GZIP", "true")
|
||||
os.Setenv("HWS_READ_HEADER_TIMEOUT", "3")
|
||||
os.Setenv("HWS_WRITE_TIMEOUT", "15")
|
||||
@@ -100,7 +84,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
defer func() {
|
||||
os.Unsetenv("HWS_HOST")
|
||||
os.Unsetenv("HWS_PORT")
|
||||
os.Unsetenv("HWS_TRUSTED_HOST")
|
||||
os.Unsetenv("HWS_GZIP")
|
||||
os.Unsetenv("HWS_READ_HEADER_TIMEOUT")
|
||||
os.Unsetenv("HWS_WRITE_TIMEOUT")
|
||||
@@ -111,7 +94,6 @@ func Test_ConfigFromEnv(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "0.0.0.0", config.Host)
|
||||
assert.Equal(t, uint64(9000), config.Port)
|
||||
assert.Equal(t, "myapp.com", config.TrustedHost)
|
||||
assert.Equal(t, true, config.GZIP)
|
||||
assert.Equal(t, 3*time.Second, config.ReadHeaderTimeout)
|
||||
assert.Equal(t, 15*time.Second, config.WriteTimeout)
|
||||
|
||||
@@ -149,7 +149,7 @@ func Test_Start_Errors(t *testing.T) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
err = server.Start(nil)
|
||||
err = server.Start(t.Context())
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "Context cannot be nil")
|
||||
})
|
||||
@@ -163,7 +163,7 @@ func Test_Shutdown_Errors(t *testing.T) {
|
||||
startTestServer(t, server)
|
||||
<-server.Ready()
|
||||
|
||||
err := server.Shutdown(nil)
|
||||
err := server.Shutdown(t.Context())
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "Context cannot be nil")
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# hwsauth
|
||||
# HWSAuth
|
||||
|
||||
[](https://pkg.go.dev/git.haelnorr.com/h/golib/hwsauth)
|
||||
|
||||
JWT-based authentication middleware for the [hws](https://git.haelnorr.com/h/golib/hws) web framework.
|
||||
JWT-based authentication middleware for the [HWS](https://git.haelnorr.com/h/golib/hws) web framework.
|
||||
|
||||
## Features
|
||||
|
||||
@@ -65,8 +65,9 @@ func main() {
|
||||
return user, err
|
||||
}
|
||||
|
||||
// Create HWS server
|
||||
server := hws.NewServer(":8080", logger)
|
||||
// Create server
|
||||
serverCfg, _ := hws.ConfigFromEnv()
|
||||
server, _ := hws.NewServer(serverCfg)
|
||||
|
||||
// Create authenticator
|
||||
auth, _ := hwsauth.NewAuthenticator[User, *sql.Tx](
|
||||
@@ -78,17 +79,28 @@ func main() {
|
||||
errorPageFunc,
|
||||
)
|
||||
|
||||
// Define routes
|
||||
routes := []hws.Route{
|
||||
{
|
||||
Path: "/dashboard",
|
||||
Method: hws.MethodGET,
|
||||
Handler: auth.LoginReq(http.HandlerFunc(dashboardHandler)),
|
||||
},
|
||||
}
|
||||
|
||||
server.AddRoutes(routes...)
|
||||
|
||||
// Add authentication middleware
|
||||
server.AddMiddleware(auth.Authenticate())
|
||||
|
||||
// Optionally ignore public paths
|
||||
auth.IgnorePaths("/", "/login", "/register", "/static")
|
||||
|
||||
// Protect routes
|
||||
protectedHandler := auth.LoginReq(http.HandlerFunc(dashboardHandler))
|
||||
server.AddRoute("GET", "/dashboard", protectedHandler)
|
||||
// Start server
|
||||
ctx := context.Background()
|
||||
server.Start(ctx)
|
||||
|
||||
server.Start()
|
||||
<-server.Ready()
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -2,26 +2,24 @@ module git.haelnorr.com/h/golib/hwsauth
|
||||
|
||||
go 1.25.5
|
||||
|
||||
replace git.haelnorr.com/h/golib/hws => ../hws
|
||||
|
||||
require (
|
||||
git.haelnorr.com/h/golib/cookies v0.9.0
|
||||
git.haelnorr.com/h/golib/env v0.9.1
|
||||
git.haelnorr.com/h/golib/hws v0.1.0
|
||||
git.haelnorr.com/h/golib/hws v0.2.0
|
||||
git.haelnorr.com/h/golib/jwt v0.10.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/rs/zerolog v1.34.0
|
||||
)
|
||||
|
||||
require (
|
||||
git.haelnorr.com/h/golib/hlog v0.9.0 // indirect
|
||||
git.haelnorr.com/h/golib/hlog v0.9.1 // indirect
|
||||
github.com/go-logr/logr v1.4.3 // indirect
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||
golang.org/x/sys v0.12.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
golang.org/x/sys v0.40.0 // indirect
|
||||
k8s.io/apimachinery v0.35.0 // indirect
|
||||
k8s.io/klog/v2 v2.130.1 // indirect
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect
|
||||
k8s.io/utils v0.0.0-20260108192941-914a6e750570 // indirect
|
||||
)
|
||||
|
||||
@@ -2,8 +2,10 @@ git.haelnorr.com/h/golib/cookies v0.9.0 h1:Vf+eX1prHkKuGrQon1BHY87yaPc1H+HJFRXDO
|
||||
git.haelnorr.com/h/golib/cookies v0.9.0/go.mod h1:y1385YExI9gLwckCVDCYVcsFXr6N7T3brJjnJD2QIuo=
|
||||
git.haelnorr.com/h/golib/env v0.9.1 h1:2Vsj+mJKnO5f1Md1GO5v9ggLN5zWa0baCewcSHTjoNY=
|
||||
git.haelnorr.com/h/golib/env v0.9.1/go.mod h1:glUQVdA1HMKX1avTDyTyuhcr36SSxZtlJxKDT5KTztg=
|
||||
git.haelnorr.com/h/golib/hlog v0.9.0 h1:ib8n2MdmiRK2TF067p220kXmhDe9aAnlcsgpuv+QpvE=
|
||||
git.haelnorr.com/h/golib/hlog v0.9.0/go.mod h1:oOlzb8UVHUYP1k7dN5PSJXVskAB2z8EYgRN85jAi0Zk=
|
||||
git.haelnorr.com/h/golib/hlog v0.9.1 h1:9VmE/IQTfD8LAEyTbUCZLy/+8PbcHA1Kob/WQHRHKzc=
|
||||
git.haelnorr.com/h/golib/hlog v0.9.1/go.mod h1:oOlzb8UVHUYP1k7dN5PSJXVskAB2z8EYgRN85jAi0Zk=
|
||||
git.haelnorr.com/h/golib/hws v0.2.0 h1:MR2Tu2qPaW+/oK8aXFJLRFaYZIHgKiex3t3zE41cu1U=
|
||||
git.haelnorr.com/h/golib/hws v0.2.0/go.mod h1:6ZlRKnt8YMpv5XcMXmyBGmD1/euvBo3d1azEvHJjOLo=
|
||||
git.haelnorr.com/h/golib/jwt v0.10.0 h1:8cI8mSnb8X+EmJtrBO/5UZwuBMtib0IE9dv85gkm94E=
|
||||
git.haelnorr.com/h/golib/jwt v0.10.0/go.mod h1:fbuPrfucT9lL0faV5+Q5Gk9WFJxPlwzRPpbMQKYZok4=
|
||||
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
||||
@@ -18,11 +20,13 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
@@ -34,13 +38,14 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
|
||||
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8=
|
||||
k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck=
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
k8s.io/utils v0.0.0-20260108192941-914a6e750570 h1:JT4W8lsdrGENg9W+YwwdLJxklIuKWdRm+BC+xt33FOY=
|
||||
k8s.io/utils v0.0.0-20260108192941-914a6e750570/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
|
||||
|
||||
Reference in New Issue
Block a user