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