kserv_http_std.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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"
  9. mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
  15. )
  16. // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке.
  17. type kServHttpStd struct {
  18. kCtx kspec.IKernelCtx
  19. log comp_spec.ILogBuf
  20. port lev0.LInt
  21. server *http.Server
  22. }
  23. var (
  24. kServ *kServHttpStd
  25. mu sync.Mutex
  26. )
  27. // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
  28. func GetKservHttpStd() *lev0.Result[*kServHttpStd] {
  29. mu.Lock()
  30. defer mu.Unlock()
  31. if kServ != nil {
  32. return lev0.ResOk(kServ)
  33. }
  34. logBufParam := &log_buf.LogBufParam{
  35. IsTerm_: safe_bool.NewSafeBool(true),
  36. Prefix_: lev0.LetTxt("kServHttpStd"),
  37. }
  38. log := mL1.NewLogBuf(logBufParam)
  39. log.Debug("GetKservHttpStd()")
  40. resPort := mL1.NewSafeIntGetenv(lev0.LetTxt("SERV_HTTP_STD_PORT"))
  41. resPort.Hassert("in get env SERV_HTTP_STD_PORT")
  42. sf := &kServHttpStd{
  43. kCtx: kctx.GetKernelCtx(),
  44. log: log,
  45. port: resPort.Ok(),
  46. }
  47. kServ = sf
  48. return lev0.ResOk(sf)
  49. }
  50. // Run -- запускает сервер вы работу.
  51. func (sf *kServHttpStd) Run() {
  52. sf.server = &http.Server{
  53. Addr: fmt.Sprintf(":%v", sf.port),
  54. ReadTimeout: 30 * time.Second,
  55. WriteTimeout: 30 * time.Second,
  56. IdleTimeout: 75 * time.Second,
  57. Handler: nil,
  58. }
  59. // Запуск сервера в горутине
  60. go func() {
  61. msg := lev0.LetTxt("kServHttpStd.Run().fn(): run on http://%v", sf.server.Addr)
  62. sf.log.Debug(msg.Get())
  63. if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  64. err := lev0.LetErr("kServHttpStd.Run.fn(): in work, err=\n\t%v", err)
  65. sf.log.Err(err)
  66. }
  67. }()
  68. go sf.close()
  69. if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
  70. sf.log.Debug("kServHttpStd.Run(): ошибка при graceful shutdown, err=\n\t%v", err)
  71. }
  72. sf.log.Info("Сервер остановлен")
  73. }
  74. func (sf *kServHttpStd) close() {
  75. }