kserv_http_std.go 2.2 KB

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