kserv_http_std.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке.
  2. package kserv_http_std
  3. import (
  4. "fmt"
  5. "net/http"
  6. "sync"
  7. "time"
  8. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  9. . "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  11. )
  12. // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке.
  13. type kServHttpStd struct {
  14. kCtx IKernelCtx
  15. log ILogBuf
  16. port int
  17. server *http.Server
  18. }
  19. var (
  20. kServ *kServHttpStd
  21. mu sync.Mutex
  22. )
  23. // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
  24. func GetKservHttpStd() IResult[*kServHttpStd] {
  25. mu.Lock()
  26. defer mu.Unlock()
  27. if kServ != nil {
  28. return NewRes(kServ)
  29. }
  30. log := NewLogBuf(OptIsTerm(true), OptPrefix("kServHttpStd"))
  31. log.Debug("GetKservHttpStd()")
  32. resPort := NewSafeIntGetenv("SERV_HTTP_STD_PORT")
  33. resPort.Hassert("in get env SERV_HTTP_STD_PORT")
  34. resKernCtx := kctx.GetKernelCtx()
  35. if resKernCtx.IsErr() {
  36. err := fmt.Errorf("GetKservHttpStd(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
  37. return NewErr[*kServHttpStd](err)
  38. }
  39. kCtx := resKernCtx.Val()
  40. sf := &kServHttpStd{
  41. kCtx: kCtx,
  42. log: log,
  43. port: resPort.Val().Get(),
  44. }
  45. kServ = sf
  46. return NewRes(sf)
  47. }
  48. // Run -- запускает сервер вы работу.
  49. func (sf *kServHttpStd) Run() {
  50. sf.server = &http.Server{
  51. Addr: fmt.Sprintf(":%v", sf.port),
  52. ReadTimeout: 30 * time.Second,
  53. WriteTimeout: 30 * time.Second,
  54. IdleTimeout: 75 * time.Second,
  55. Handler: nil,
  56. }
  57. // Запуск сервера в горутине
  58. go func() {
  59. sf.log.Debug("Run().fn(): run on http://%v", sf.server.Addr)
  60. if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  61. sf.log.Err("Run.fn(): in work, err=\n\t%v", err)
  62. }
  63. }()
  64. go sf.close()
  65. if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
  66. sf.log.Debug("Ошибка при graceful shutdown: %v", err)
  67. }
  68. sf.log.Info("Сервер остановлен")
  69. }
  70. func (sf *kServHttpStd) close() {
  71. }