kserv_http_std.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке.
  2. package kserv_http_std
  3. import (
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/d0"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/d1"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
  10. )
  11. // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке.
  12. type kServHttpStd struct {
  13. kCtx *kern_ctx.KernCtx
  14. log *d1.LogBuf
  15. owner *d0.LOwner
  16. port *d0.LNum
  17. server *http.Server
  18. }
  19. var (
  20. kServ *kServHttpStd
  21. block = d0.MutSafeMutex()
  22. )
  23. // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
  24. func GetKservHttpStd() *d0.Result[*kServHttpStd] {
  25. block.Lock()
  26. defer block.Unlock()
  27. if kServ != nil {
  28. return d0.ResOk(kServ)
  29. }
  30. owner := d0.LetOwner(1, "isol_serv_http_std")
  31. logBufParam := &d1.LogBufParam{
  32. IsTerm_: d0.MutSafeBool(owner, true),
  33. Prefix_: d0.LetTxt("kServHttpStd"),
  34. }
  35. log := d1.NewLogBuf(logBufParam)
  36. log.Debug("GetKservHttpStd()")
  37. resPort := d0.MutSafeNumFromEnv(owner, d0.LetTxt("SERV_HTTP_STD_PORT"))
  38. port := resPort.Hassert("in get env SERV_HTTP_STD_PORT")
  39. sf := &kServHttpStd{
  40. owner: owner,
  41. kCtx: kern_ctx.GetKernCtx(),
  42. log: log,
  43. port: d0.LetNum(owner, port.Get()),
  44. }
  45. kServ = sf
  46. return d0.ResOk(sf)
  47. }
  48. // Run -- запускает сервер вы работу.
  49. func (sf *kServHttpStd) Run() {
  50. sf.server = &http.Server{
  51. Addr: fmt.Sprintf(":%v", sf.port),
  52. ReadTimeout: 30 * time.Second,
  53. WriteTimeout: 30 * time.Second,
  54. IdleTimeout: 75 * time.Second,
  55. Handler: nil,
  56. }
  57. // Запуск сервера в горутине
  58. go func() {
  59. msg := d0.LetTxt("kServHttpStd.Run().fn(): run on http://%v", sf.server.Addr)
  60. sf.log.Debug(msg.Get())
  61. if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  62. err := d0.LetErr("kServHttpStd.Run.fn(): in work, err=\n\t%v", err)
  63. sf.log.Err(err)
  64. }
  65. }()
  66. go sf.close()
  67. if err := sf.server.Shutdown(sf.kCtx.SelfCtx()); err != nil {
  68. sf.log.Debug("kServHttpStd.Run(): ошибка при graceful shutdown, err=\n\t%v", err)
  69. }
  70. sf.log.Info("Сервер остановлен")
  71. }
  72. func (sf *kServHttpStd) close() {
  73. }