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