kserv_http_std.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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/kspec"
  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.IResult[*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. sf := &kServHttpStd{
  36. kCtx: kctx.GetKernelCtx(),
  37. log: log,
  38. port: resPort.Ok().Get(),
  39. }
  40. kServ = sf
  41. return mL0.NewRes(sf)
  42. }
  43. // Run -- запускает сервер вы работу.
  44. func (sf *kServHttpStd) Run() {
  45. sf.server = &http.Server{
  46. Addr: fmt.Sprintf(":%v", sf.port),
  47. ReadTimeout: 30 * time.Second,
  48. WriteTimeout: 30 * time.Second,
  49. IdleTimeout: 75 * time.Second,
  50. Handler: nil,
  51. }
  52. // Запуск сервера в горутине
  53. go func() {
  54. sf.log.Debug("Run().fn(): run on http://%v", sf.server.Addr)
  55. if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  56. sf.log.Err("Run.fn(): in work, err=\n\t%v", err)
  57. }
  58. }()
  59. go sf.close()
  60. if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
  61. sf.log.Debug("Ошибка при graceful shutdown: %v", err)
  62. }
  63. sf.log.Info("Сервер остановлен")
  64. }
  65. func (sf *kServHttpStd) close() {
  66. }