kserv_http_std.go 2.2 KB

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