| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке.
- package kserv_http_std
- import (
- "fmt"
- "net/http"
- "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
- block = d0.MutSafeMutex()
- )
- // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
- func GetKservHttpStd() *d0.Result[*kServHttpStd] {
- block.Lock()
- defer block.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() {
- }
|