// 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() { }