// package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке. package kserv_http_std import ( "fmt" "net/http" "sync" "time" "gitp78su.ipnodns.ru/svi/kern/v4/d0" "gitp78su.ipnodns.ru/svi/kern/v4/d1" "gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx" ) // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке. type kServHttpStd struct { kCtx *kern_ctx.KernCtx log *d1.LogBuf owner *d0.LOwner port *d0.LNum server *http.Server } var ( kServ *kServHttpStd mu sync.Mutex ) // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке. func GetKservHttpStd() *d0.Result[*kServHttpStd] { mu.Lock() defer mu.Unlock() if kServ != nil { return d0.ResOk(kServ) } owner := d0.LetOwner(1, "isol_serv_http_std") logBufParam := &d1.LogBufParam{ IsTerm_: d0.MutSafeBool(owner, true), Prefix_: d0.LetTxt("kServHttpStd"), } log := d1.NewLogBuf(logBufParam) log.Debug("GetKservHttpStd()") resPort := d0.MutSafeNumFromEnv(owner, d0.LetTxt("SERV_HTTP_STD_PORT")) port := resPort.Hassert("in get env SERV_HTTP_STD_PORT") sf := &kServHttpStd{ owner: owner, kCtx: kern_ctx.GetKernCtx(), log: log, port: d0.LetNum(owner, port.Get()), } kServ = sf return d0.ResOk(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() { msg := d0.LetTxt("kServHttpStd.Run().fn(): run on http://%v", sf.server.Addr) sf.log.Debug(msg.Get()) if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { err := d0.LetErr("kServHttpStd.Run.fn(): in work, err=\n\t%v", err) sf.log.Err(err) } }() go sf.close() if err := sf.server.Shutdown(sf.kCtx.SelfCtx()); err != nil { sf.log.Debug("kServHttpStd.Run(): ошибка при graceful shutdown, err=\n\t%v", err) } sf.log.Info("Сервер остановлен") } func (sf *kServHttpStd) close() { }