// package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке. package kserv_http_std import ( "fmt" "net/http" "sync" "time" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec" mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx" ) // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке. type kServHttpStd struct { kCtx mKs.IKernelCtx log mKs.ILogBuf port int server *http.Server } var ( kServ *kServHttpStd mu sync.Mutex ) // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке. func GetKservHttpStd() mL0.IResult[*kServHttpStd] { mu.Lock() defer mu.Unlock() if kServ != nil { return mL0.NewRes(kServ) } log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kServHttpStd")) log.Debug("GetKservHttpStd()") resPort := mL1.NewSafeIntGetenv("SERV_HTTP_STD_PORT") resPort.Hassert("in get env SERV_HTTP_STD_PORT") sf := &kServHttpStd{ kCtx: kctx.GetKernelCtx(), log: log, port: resPort.Ok().Get(), } kServ = sf return mL0.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() { }