Files
golib/test/test-httpserver/main.go

196 lines
4.6 KiB
Go

//+build examples
//go:build examples
// +build examples
/***********************************************************************************************************************
*
* MIT License
*
* Copyright (c) 2021 Nicolas JUHEL
*
* 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.
*
*
**********************************************************************************************************************/
package main
import (
"context"
"fmt"
"net/http"
"time"
liblog "github.com/nabbar/golib/logger"
libtls "github.com/nabbar/golib/certificates"
liberr "github.com/nabbar/golib/errors"
libsrv "github.com/nabbar/golib/httpserver"
)
var tlsConfigSrv = libtls.Config{
InheritDefault: true,
VersionMin: "1.2",
}
var cfgSrv01 = libsrv.ServerConfig{
Name: "test-01",
Listen: "0.0.0.0:61001",
Expose: "0.0.0.0:61000",
TLSMandatory: false,
TLS: tlsConfigSrv,
}
var cfgSrv02 = libsrv.ServerConfig{
Name: "test-02",
Listen: "0.0.0.0:61002",
Expose: "0.0.0.0:61000",
TLSMandatory: false,
TLS: tlsConfigSrv,
}
var cfgSrv03 = libsrv.ServerConfig{
Name: "test-03",
Listen: "0.0.0.0:61003",
Expose: "0.0.0.0:61000",
TLSMandatory: true,
TLS: tlsConfigSrv,
}
var (
cfgPool libsrv.PoolServerConfig
ctx context.Context
cnl context.CancelFunc
log liblog.Logger
)
func init() {
liberr.SetModeReturnError(liberr.ErrorReturnCodeErrorTraceFull)
ctx, cnl = context.WithCancel(context.Background())
log = liblog.New(ctx)
log.SetLevel(liblog.DebugLevel)
if err := log.SetOptions(&liblog.Options{
DisableStandard: false,
DisableStack: false,
DisableTimestamp: false,
EnableTrace: true,
TraceFilter: "",
DisableColor: false,
}); err != nil {
panic(err)
}
cfgPool = libsrv.PoolServerConfig{cfgSrv01, cfgSrv02, cfgSrv03}
cfgPool.MapUpdate(func(cfg libsrv.ServerConfig) libsrv.ServerConfig {
cfg.SetParentContext(func() context.Context {
return ctx
})
return cfg
})
}
func main() {
var (
pool libsrv.PoolServer
lerr liberr.Error
)
if pool, lerr = cfgPool.PoolServer(); lerr != nil {
panic(lerr)
} else {
pool.SetLogger(getLogger)
}
mux := http.NewServeMux()
mux.HandleFunc("/hello", hello)
mux.HandleFunc("/headers", headers)
if lerr = pool.Listen(mux); lerr != nil {
panic(lerr)
}
defer func() {
pool.Shutdown()
cnl()
}()
go pool.WaitNotify(ctx, cnl)
go func() {
l := getLogger()
for {
time.Sleep(5 * time.Second)
if ctx.Err() != nil {
return
}
pool.MapRun(func(srv libsrv.Server) {
n, v, _ := srv.StatusInfo()
e := l.Entry(liblog.ErrorLevel, "check status")
e = e.FieldAdd("server_name", n).FieldAdd("server_release", v)
e.ErrorAdd(true, srv.StatusHealth())
e.Check(liblog.InfoLevel)
})
}
}()
var i = 0
for {
l := getLogger()
time.Sleep(5 * time.Second)
if ctx.Err() != nil {
return
}
i++
if i%3 == 0 {
for s := range pool.List(libsrv.FieldBind, libsrv.FieldName, "", ".*") {
l.Entry(liblog.DebugLevel, "Restarting server...").FieldAdd("server_name", s).Log()
l.Entry(liblog.InfoLevel, "Restarting server...").FieldAdd("server_name", s).Log()
}
pool.Restart()
i = 0
}
}
}
func hello(w http.ResponseWriter, req *http.Request) {
_, _ = fmt.Fprintf(w, "hello\n")
}
func headers(w http.ResponseWriter, req *http.Request) {
for name, headers := range req.Header {
for _, h := range headers {
_, _ = fmt.Fprintf(w, "%v: %v\n", name, h)
}
}
}
func getLogger() liblog.Logger {
l, _ := log.Clone()
return l
}