// package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке package kserv_http_std import ( "fmt" "net/http" "sync" "time" "gitp78su.ipnodns.ru/svi/kern/v4" "gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf" "gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" ) // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке type kServHttpStd struct { ctx IKernelCtx log ILogBuf port int server *http.Server } var ( kServ *kServHttpStd mu sync.Mutex ) // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке func GetKservHttpStd() *kServHttpStd { mu.Lock() defer mu.Unlock() if kServ != nil { return kServ } log := kern.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttpStd")) log.Debug("GetKservHttpStd()") resPort := safe_int.NewSafeIntGetenv("SERV_HTTP_STD_PORT") resPort.Hassert("in get env SERV_HTTP_STD_PORT") sf := &kServHttpStd{ ctx: kern.GetKernelCtx(), log: log, port: resPort.Val().Get(), } kServ = sf return 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.ctx.Ctx()); err != nil { sf.log.Debug("Ошибка при graceful shutdown: %v", err) } sf.log.Info("Сервер остановлен") } func (sf *kServHttpStd) close() { }