blob: e4a7688804c5401cacd3667bf5d6120ba6c7212c [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{
47 Addr: fmt.Sprintf("%s:%d", a.config.HTTPSettings.Host, a.config.HTTPSettings.Port),
48 Handler: a.root,
49 ReadTimeout: time.Duration(a.config.HTTPSettings.ReadTimeout) * time.Second,
50 WriteTimeout: time.Duration(a.config.HTTPSettings.WriteTimeout) * time.Second,
51 IdleTimeout: time.Duration(a.config.HTTPSettings.IdleTimeout) * time.Second,
52 }
53
54 a.Log.Info("HTTP Server is listening on", log.Int("port", a.config.HTTPSettings.Port))
55 if err := a.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
56 a.Log.Error("failed to listen and serve: %v", log.Err(err))
57 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 {
66 return errors.New("no http server present")
67 }
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}