blob: 932d53b7a584b4fe48f671e6a82212f473f5fb97 [file] [log] [blame]
iomodob892d072021-02-22 00:23:16 +04001package server
2
3import (
4 "context"
5 "errors"
6 "fmt"
7 "net/http"
8 "os"
9 "time"
10
iomodo5e0dc112021-03-25 20:49:55 +040011 "github.com/giolekva/pcloud/core/kg/api/rest"
iomodo3b0b9512021-03-15 00:13:06 +040012 "github.com/giolekva/pcloud/core/kg/common"
iomodob892d072021-02-22 00:23:16 +040013 "github.com/giolekva/pcloud/core/kg/log"
14 "github.com/giolekva/pcloud/core/kg/model"
iomodob892d072021-02-22 00:23:16 +040015 "github.com/gorilla/mux"
16)
17
18// HTTPServerImpl http server implementation
19type HTTPServerImpl struct {
iomodo5e0dc112021-03-25 20:49:55 +040020 srv *http.Server
iomodoa19d4792021-03-26 00:27:25 +040021 routers *rest.Router
iomodo5e0dc112021-03-25 20:49:55 +040022 config *model.Config
iomodoa19d4792021-03-26 00:27:25 +040023 app common.AppIface
24 logger common.LoggerIface
iomodob892d072021-02-22 00:23:16 +040025}
26
27var _ Server = &HTTPServerImpl{}
28
29// NewHTTPServer creates new HTTP Server
iomodoa19d4792021-03-26 00:27:25 +040030func NewHTTPServer(logger common.LoggerIface, config *model.Config, app common.AppIface) Server {
iomodob892d072021-02-22 00:23:16 +040031 a := &HTTPServerImpl{
iomodoa19d4792021-03-26 00:27:25 +040032 logger: logger,
33 routers: rest.NewRouter(mux.NewRouter(), app, logger),
iomodo5e0dc112021-03-25 20:49:55 +040034 config: config,
iomodoa19d4792021-03-26 00:27:25 +040035 app: app,
iomodob892d072021-02-22 00:23:16 +040036 }
37
38 pwd, _ := os.Getwd()
iomodoa19d4792021-03-26 00:27:25 +040039 a.logger.Info("HTTP server current working", log.String("directory", pwd))
iomodob892d072021-02-22 00:23:16 +040040 return a
41}
42
43// Start method starts a http server
44func (a *HTTPServerImpl) Start() error {
iomodoa19d4792021-03-26 00:27:25 +040045 a.logger.Info("Starting HTTP Server...")
iomodob892d072021-02-22 00:23:16 +040046
47 a.srv = &http.Server{
iomodoc0479a62021-02-22 20:08:36 +040048 Addr: fmt.Sprintf("%s:%d", a.config.HTTP.Host, a.config.HTTP.Port),
iomodo5e0dc112021-03-25 20:49:55 +040049 Handler: a.routers.Root,
iomodoc0479a62021-02-22 20:08:36 +040050 ReadTimeout: time.Duration(a.config.HTTP.ReadTimeout) * time.Second,
51 WriteTimeout: time.Duration(a.config.HTTP.WriteTimeout) * time.Second,
52 IdleTimeout: time.Duration(a.config.HTTP.IdleTimeout) * time.Second,
iomodob892d072021-02-22 00:23:16 +040053 }
54
iomodoa19d4792021-03-26 00:27:25 +040055 a.logger.Info("HTTP Server is listening on", log.Int("port", a.config.HTTP.Port))
iomodob892d072021-02-22 00:23:16 +040056 if err := a.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
iomodoa19d4792021-03-26 00:27:25 +040057 a.logger.Error("Failed to listen and serve: %v", log.Err(err))
iomodob892d072021-02-22 00:23:16 +040058 return err
59 }
60 return nil
61}
62
63// Shutdown method shuts http server down
64func (a *HTTPServerImpl) Shutdown() error {
iomodoa19d4792021-03-26 00:27:25 +040065 a.logger.Info("Stopping HTTP Server...")
iomodob892d072021-02-22 00:23:16 +040066 if a.srv == nil {
iomodoc0479a62021-02-22 20:08:36 +040067 return errors.New("No http server present")
iomodob892d072021-02-22 00:23:16 +040068 }
69
70 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
71 defer cancel()
72 if err := a.srv.Shutdown(ctx); err != nil {
iomodoa19d4792021-03-26 00:27:25 +040073 a.logger.Error("Unable to shutdown server", log.Err(err))
iomodob892d072021-02-22 00:23:16 +040074 }
75
76 // a.srv.Close()
77 // a.srv = nil
iomodoa19d4792021-03-26 00:27:25 +040078 a.logger.Info("HTTP Server stopped")
iomodob892d072021-02-22 00:23:16 +040079 return nil
80}