no more q
parent
f87cd725c3
commit
0d80d2ea3c
12
go.mod
12
go.mod
|
|
@ -2,14 +2,4 @@ module echo-server
|
||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require golang.org/x/crypto v0.8.0
|
||||||
gitlab-app.eng.qops.net/golang/jwt v1.3.0
|
|
||||||
golang.org/x/crypto v0.8.0
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/alexcesaro/statsd v2.0.0+incompatible // indirect
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.4.1 // indirect
|
|
||||||
gitlab-app.eng.qops.net/golang/metrics/v2 v2.0.0 // indirect
|
|
||||||
gitlab-app.eng.qops.net/golang/qtoken v1.0.1 // indirect
|
|
||||||
)
|
|
||||||
|
|
|
||||||
12
go.sum
12
go.sum
|
|
@ -1,14 +1,2 @@
|
||||||
github.com/alexcesaro/statsd v2.0.0+incompatible h1:HG17k1Qk8V1F4UOoq6tx+IUoAbOcI5PHzzEUGeDD72w=
|
|
||||||
github.com/alexcesaro/statsd v2.0.0+incompatible/go.mod h1:vNepIbQAiyLe1j480173M6NYYaAsGwEcvuDTU3OCUGY=
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ=
|
|
||||||
github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
|
||||||
gitlab-app.eng.qops.net/golang/jwt v1.3.0 h1:+DPpWuz1qLcAT3HhcTyrbKF35Z310U0sb7EL68K2X/s=
|
|
||||||
gitlab-app.eng.qops.net/golang/jwt v1.3.0/go.mod h1:z6jtur6CCEknerWN+TMrzjdblbqbe7Xoeg8Egsyuh/c=
|
|
||||||
gitlab-app.eng.qops.net/golang/metrics/v2 v2.0.0 h1:bZ8sE1e/+Q6j/5hk8UvLRsg7RDo6GYH3s96dMXMbyCM=
|
|
||||||
gitlab-app.eng.qops.net/golang/metrics/v2 v2.0.0/go.mod h1:3t9G/KnpMPKci08VpOUzPj7oSk7V1iLCM6yV6/PQZss=
|
|
||||||
gitlab-app.eng.qops.net/golang/qtoken v1.0.1 h1:JP0TeZssYXZvPWrxahQVnklrmLcUXLasnWAXvlRjZvE=
|
|
||||||
gitlab-app.eng.qops.net/golang/qtoken v1.0.1/go.mod h1:7Hd83PrhqrStQf3RDcI8AYZo0iNaGOo11Faf/U45yBA=
|
|
||||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||||
gopkg.in/alexcesaro/statsd.v2 v2.0.0 h1:FXkZSCZIH17vLCO5sO2UucTHsH9pc+17F6pl3JVCwMc=
|
|
||||||
gopkg.in/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU=
|
|
||||||
|
|
|
||||||
30
main.go
30
main.go
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitlab-app.eng.qops.net/golang/jwt"
|
|
||||||
"golang.org/x/crypto/pkcs12"
|
"golang.org/x/crypto/pkcs12"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -34,7 +33,6 @@ func main() {
|
||||||
block := flag.Int("block", 0, "seconds to block connections")
|
block := flag.Int("block", 0, "seconds to block connections")
|
||||||
status := flag.Int("status", http.StatusOK, "status to always return")
|
status := flag.Int("status", http.StatusOK, "status to always return")
|
||||||
body := flag.String("body", "", "body to always return")
|
body := flag.String("body", "", "body to always return")
|
||||||
jwt := flag.String("jwt", envOrDefault("SECRET", ""), "secret for JWT")
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
// start server
|
// start server
|
||||||
|
|
@ -43,7 +41,7 @@ func main() {
|
||||||
} else if *tcp {
|
} else if *tcp {
|
||||||
startTCP(*port, *fail, *block)
|
startTCP(*port, *fail, *block)
|
||||||
} else {
|
} else {
|
||||||
startHTTP(*port, *fail, *block, *jwt, *crt, *key, *status, *body)
|
startHTTP(*port, *fail, *block, *crt, *key, *status, *body)
|
||||||
}
|
}
|
||||||
|
|
||||||
// catch stop
|
// catch stop
|
||||||
|
|
@ -99,10 +97,10 @@ func startTCP(port string, fail bool, block int) {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func startHTTP(port string, fail bool, block int, secret, crt, key string, status int, body string) {
|
func startHTTP(port string, fail bool, block int, crt, key string, status int, body string) {
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Addr: ":" + port,
|
Addr: ":" + port,
|
||||||
Handler: makeHTTPHandler(fail, block, secret, status, body),
|
Handler: makeHTTPHandler(fail, block, status, body),
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
if crt == "" || key == "" {
|
if crt == "" || key == "" {
|
||||||
|
|
@ -143,20 +141,20 @@ func startHTTP(port string, fail bool, block int, secret, crt, key string, statu
|
||||||
log.Println("Listening on", srv.Addr)
|
log.Println("Listening on", srv.Addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeHTTPHandler(fail bool, block int, secret string, status int, body string) http.HandlerFunc {
|
func makeHTTPHandler(fail bool, block int, status int, body string) http.HandlerFunc {
|
||||||
if block > 0 {
|
if block > 0 {
|
||||||
return blockH(block, fail, secret, status, body)
|
return blockH(block, fail, status, body)
|
||||||
} else if fail {
|
} else if fail {
|
||||||
return http.HandlerFunc(failH)
|
return http.HandlerFunc(failH)
|
||||||
}
|
}
|
||||||
return echoH(secret, status, body)
|
return echoH(status, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
func failH(w http.ResponseWriter, r *http.Request) {
|
func failH(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
func blockH(block int, fail bool, secret string, status int, body string) http.HandlerFunc {
|
func blockH(block int, fail bool, status int, body string) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Second * time.Duration(block)):
|
case <-time.After(time.Second * time.Duration(block)):
|
||||||
|
|
@ -169,26 +167,16 @@ func blockH(block int, fail bool, secret string, status int, body string) http.H
|
||||||
if fail {
|
if fail {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
} else {
|
} else {
|
||||||
echoH(secret, status, body)(w, r)
|
echoH(status, body)(w, r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func echoH(secret string, status int, body string) http.HandlerFunc {
|
func echoH(status int, body string) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Println("METHOD:", r.Method)
|
log.Println("METHOD:", r.Method)
|
||||||
log.Println("URL:", r.URL.String())
|
log.Println("URL:", r.URL.String())
|
||||||
log.Println("HEADER:", r.Header)
|
log.Println("HEADER:", r.Header)
|
||||||
if secret != "" {
|
|
||||||
verifier := jwt.Verifier{Key: []byte(secret)}
|
|
||||||
_, err := verifier.Verify(r)
|
|
||||||
if err != nil {
|
|
||||||
w.WriteHeader(http.StatusUnauthorized)
|
|
||||||
fmt.Fprintln(w, "ERR: failed verifying jwt:", err)
|
|
||||||
log.Println("ERR: failed verifying jwt:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b, err := ioutil.ReadAll(r.Body)
|
b, err := ioutil.ReadAll(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue