kserv_http_std.go 1.9 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. "gitp78su.ipnodns.ru/svi/kern/v4"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int"
  11. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  12. )
  13. // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке
  14. type kServHttpStd struct {
  15. ctx IKernelCtx
  16. log 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() *kServHttpStd {
  26. mu.Lock()
  27. defer mu.Unlock()
  28. if kServ != nil {
  29. return kServ
  30. }
  31. log := kern.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttpStd"))
  32. log.Debug("GetKservHttpStd()")
  33. resPort := safe_int.NewSafeIntGetenv("SERV_HTTP_STD_PORT")
  34. resPort.Hassert("in get env SERV_HTTP_STD_PORT")
  35. sf := &kServHttpStd{
  36. ctx: kern.GetKernelCtx(),
  37. log: log,
  38. port: resPort.Val().Get(),
  39. }
  40. kServ = sf
  41. return 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.ctx.Ctx()); err != nil {
  61. sf.log.Debug("Ошибка при graceful shutdown: %v", err)
  62. }
  63. sf.log.Info("Сервер остановлен")
  64. }
  65. func (sf *kServHttpStd) close() {
  66. }