| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке
- package kserv_http_std
- import (
- "fmt"
- "net/http"
- "sync"
- "time"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
- . "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
- )
- // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке
- type kServHttpStd struct {
- kCtx IKernelCtx
- log ILogBuf
- port int
- server *http.Server
- }
- var (
- kServ *kServHttpStd
- mu sync.Mutex
- )
- // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке
- func GetKservHttpStd() IResult[*kServHttpStd] {
- mu.Lock()
- defer mu.Unlock()
- if kServ != nil {
- return NewRes(kServ)
- }
- log := NewLogBuf(OptIsTerm(true), OptPrefix("kServHttpStd"))
- log.Debug("GetKservHttpStd()")
- resPort := NewSafeIntGetenv("SERV_HTTP_STD_PORT")
- resPort.Hassert("in get env SERV_HTTP_STD_PORT")
- resKernCtx := kctx.GetKernelCtx()
- if resKernCtx.IsErr() {
- err := fmt.Errorf("GetKservHttpStd(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
- return NewErr[*kServHttpStd](err)
- }
- kCtx := resKernCtx.Val()
- sf := &kServHttpStd{
- kCtx: kCtx,
- log: log,
- port: resPort.Val().Get(),
- }
- kServ = sf
- return NewRes(sf)
- }
- // Run -- запускает сервер вы работу
- func (sf *kServHttpStd) Run() {
- sf.server = &http.Server{
- Addr: fmt.Sprintf(":%v", sf.port),
- ReadTimeout: 30 * time.Second,
- WriteTimeout: 30 * time.Second,
- IdleTimeout: 75 * time.Second,
- Handler: nil,
- }
- // Запуск сервера в горутине
- go func() {
- sf.log.Debug("Run().fn(): run on http://%v", sf.server.Addr)
- if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- sf.log.Err("Run.fn(): in work, err=\n\t%v", err)
- }
- }()
- go sf.close()
- if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
- sf.log.Debug("Ошибка при graceful shutdown: %v", err)
- }
- sf.log.Info("Сервер остановлен")
- }
- func (sf *kServHttpStd) close() {
- }
|