|
- package http
-
- import (
- "context"
- "crypto/tls"
- "net/http"
-
- "github.com/gin-gonic/gin"
- "gitlink.org.cn/cloudream/common/pkgs/async"
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/auth"
- "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types"
- v1 "gitlink.org.cn/cloudream/jcs-pub/client/internal/http/v1"
- "gitlink.org.cn/cloudream/jcs-pub/client/internal/services"
- )
-
- type ServerEventChan = async.UnboundChannel[ServerEvent]
-
- type ServerEvent interface {
- IsServerEvent() bool
- }
-
- type ExitEvent struct {
- ServerEvent
- Err error
- }
-
- type Server struct {
- cfg types.Config
- httpSrv *http.Server
- svc *services.Service
- eventChan *ServerEventChan
- auth *auth.Auth
- v1Svr *v1.Server
- }
-
- func NewServer(cfg types.Config, svc *services.Service) *Server {
- return &Server{
- cfg: cfg,
- svc: svc,
- eventChan: async.NewUnboundChannel[ServerEvent](),
- v1Svr: v1.NewServer(&cfg, svc),
- }
- }
-
- func (s *Server) Start() *ServerEventChan {
- go func() {
- if !s.cfg.Enabled {
- return
- }
-
- engine := gin.New()
- s.httpSrv = &http.Server{
- Addr: s.cfg.Listen,
- Handler: engine,
- }
- s.auth = auth.New(&s.cfg)
- s.httpSrv.TLSConfig = &tls.Config{
- GetConfigForClient: s.auth.TLSConfigSelector,
- }
-
- s.v1Svr.InitRouters(engine.Group("/v1"), s.auth)
-
- logger.Infof("start serving http at: %s", s.cfg.Listen)
-
- err := s.httpSrv.ListenAndServeTLS("", "")
- s.eventChan.Send(ExitEvent{Err: err})
- }()
- return s.eventChan
- }
-
- func (s *Server) Stop() {
- if s.httpSrv == nil {
- s.eventChan.Send(ExitEvent{})
- return
- }
-
- s.httpSrv.Shutdown(context.Background())
- }
|