blob: 68023321e6b5f4b0cd7c26afa7dd44764978c7ed [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
11 "github.com/giolekva/pcloud/core/kg/log"
12 "github.com/giolekva/pcloud/core/kg/model"
13 "github.com/giolekva/pcloud/core/kg/store"
14 "github.com/gorilla/mux"
15)
16
17// HTTPServerImpl http server implementation
18type HTTPServerImpl struct {
19 Log *log.Logger
20 srv *http.Server
21 root *mux.Router
22 config *model.Config
23 store store.Store
24}
25
26var _ Server = &HTTPServerImpl{}
27
28// NewHTTPServer creates new HTTP Server
29func NewHTTPServer(logger *log.Logger, config *model.Config, store store.Store) Server {
30 a := &HTTPServerImpl{
31 Log: logger,
32 root: mux.NewRouter(),
33 config: config,
34 store: store,
35 }
36
37 pwd, _ := os.Getwd()
38 a.Log.Info("HTTP server current working", log.String("directory", pwd))
39 return a
40}
41
42// Start method starts a http server
43func (a *HTTPServerImpl) Start() error {
44 a.Log.Info("Starting HTTP Server...")
45
46 a.srv = &http.Server{
iomodoc0479a62021-02-22 20:08:36 +040047 Addr: fmt.Sprintf("%s:%d", a.config.HTTP.Host, a.config.HTTP.Port),
iomodob892d072021-02-22 00:23:16 +040048 Handler: a.root,
iomodoc0479a62021-02-22 20:08:36 +040049 ReadTimeout: time.Duration(a.config.HTTP.ReadTimeout) * time.Second,
50 WriteTimeout: time.Duration(a.config.HTTP.WriteTimeout) * time.Second,
51 IdleTimeout: time.Duration(a.config.HTTP.IdleTimeout) * time.Second,
iomodob892d072021-02-22 00:23:16 +040052 }
53
iomodoc0479a62021-02-22 20:08:36 +040054 a.Log.Info("HTTP Server is listening on", log.Int("port", a.config.HTTP.Port))
iomodob892d072021-02-22 00:23:16 +040055 if err := a.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
iomodoc0479a62021-02-22 20:08:36 +040056 a.Log.Error("Failed to listen and serve: %v", log.Err(err))
iomodob892d072021-02-22 00:23:16 +040057 return err
58 }
59 return nil
60}
61
62// Shutdown method shuts http server down
63func (a *HTTPServerImpl) Shutdown() error {
64 a.Log.Info("Stopping HTTP Server...")
65 if a.srv == nil {
iomodoc0479a62021-02-22 20:08:36 +040066 return errors.New("No http server present")
iomodob892d072021-02-22 00:23:16 +040067 }
68
69 ctx, cancel := context.WithTimeout(context.Background(), time.Second)
70 defer cancel()
71 if err := a.srv.Shutdown(ctx); err != nil {
72 a.Log.Error("Unable to shutdown server", log.Err(err))
73 }
74
75 // a.srv.Close()
76 // a.srv = nil
77 a.Log.Info("HTTP Server stopped")
78 return nil
79}