mirror of
https://github.com/hay-kot/homebox.git
synced 2024-11-26 10:35:40 +00:00
refactor server to support variable options
This commit is contained in:
parent
245591cb23
commit
1143246816
6 changed files with 89 additions and 21 deletions
|
@ -119,7 +119,11 @@ func run(cfg *config.Config) error {
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
// Start Server
|
// Start Server
|
||||||
app.server = server.NewServer(app.conf.Web.Host, app.conf.Web.Port)
|
app.server = server.NewServer(
|
||||||
|
server.WithHost(app.conf.Web.Host),
|
||||||
|
server.WithPort(app.conf.Web.Port),
|
||||||
|
)
|
||||||
|
|
||||||
routes := app.newRouter(app.repos)
|
routes := app.newRouter(app.repos)
|
||||||
|
|
||||||
if app.conf.Mode != config.ModeDevelopment {
|
if app.conf.Mode != config.ModeDevelopment {
|
||||||
|
|
|
@ -21,7 +21,7 @@ func Respond(w http.ResponseWriter, statusCode int, data interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the content type and headers once we know marshaling has succeeded.
|
// Set the content type and headers once we know marshaling has succeeded.
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", ContentJSON)
|
||||||
|
|
||||||
// Write the status code to the response.
|
// Write the status code to the response.
|
||||||
w.WriteHeader(statusCode)
|
w.WriteHeader(statusCode)
|
||||||
|
|
|
@ -12,29 +12,44 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: #2 Implement Go routine pool/job queue
|
var (
|
||||||
|
ErrServerNotStarted = errors.New("server not started")
|
||||||
var ErrServerNotStarted = errors.New("server not started")
|
ErrServerAlreadyStarted = errors.New("server already started")
|
||||||
var ErrServerAlreadyStarted = errors.New("server already started")
|
)
|
||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
Host string
|
Host string
|
||||||
Port string
|
Port string
|
||||||
|
|
||||||
Worker Worker
|
Worker Worker
|
||||||
wg sync.WaitGroup
|
|
||||||
|
wg sync.WaitGroup
|
||||||
|
|
||||||
started bool
|
started bool
|
||||||
activeServer *http.Server
|
activeServer *http.Server
|
||||||
|
|
||||||
|
idleTimeout time.Duration
|
||||||
|
readTimeout time.Duration
|
||||||
|
writeTimeout time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer(host, port string) *Server {
|
func NewServer(opts ...Option) *Server {
|
||||||
return &Server{
|
s := &Server{
|
||||||
Host: host,
|
Host: "localhost",
|
||||||
Port: port,
|
Port: "8080",
|
||||||
wg: sync.WaitGroup{},
|
Worker: NewSimpleWorker(),
|
||||||
Worker: NewSimpleWorker(),
|
idleTimeout: 30 * time.Second,
|
||||||
|
readTimeout: 10 * time.Second,
|
||||||
|
writeTimeout: 10 * time.Second,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
err := opt(s)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) Shutdown(sig string) error {
|
func (s *Server) Shutdown(sig string) error {
|
||||||
|
@ -68,9 +83,9 @@ func (s *Server) Start(router http.Handler) error {
|
||||||
s.activeServer = &http.Server{
|
s.activeServer = &http.Server{
|
||||||
Addr: s.Host + ":" + s.Port,
|
Addr: s.Host + ":" + s.Port,
|
||||||
Handler: router,
|
Handler: router,
|
||||||
IdleTimeout: time.Minute,
|
IdleTimeout: s.idleTimeout,
|
||||||
ReadTimeout: 10 * time.Second,
|
ReadTimeout: s.readTimeout,
|
||||||
WriteTimeout: 10 * time.Second,
|
WriteTimeout: s.writeTimeout,
|
||||||
}
|
}
|
||||||
|
|
||||||
shutdownError := make(chan error)
|
shutdownError := make(chan error)
|
||||||
|
|
47
backend/pkgs/server/server_options.go
Normal file
47
backend/pkgs/server/server_options.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Option = func(s *Server) error
|
||||||
|
|
||||||
|
func WithWorker(w Worker) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.Worker = w
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithHost(host string) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.Host = host
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithPort(port string) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.Port = port
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithReadTimeout(seconds int) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.readTimeout = time.Duration(seconds) * time.Second
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithWriteTimeout(seconds int) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.writeTimeout = time.Duration(seconds) * time.Second
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithIdleTimeout(seconds int) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.idleTimeout = time.Duration(seconds) * time.Second
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,7 +10,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func testServer(t *testing.T, r http.Handler) *Server {
|
func testServer(t *testing.T, r http.Handler) *Server {
|
||||||
svr := NewServer("127.0.0.1", "19245")
|
svr := NewServer(WithHost("127.0.0.1"), WithPort("19245"))
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
err := svr.Start(r)
|
err := svr.Start(r)
|
||||||
|
@ -33,7 +33,7 @@ func testServer(t *testing.T, r http.Handler) *Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_ServerShutdown_Error(t *testing.T) {
|
func Test_ServerShutdown_Error(t *testing.T) {
|
||||||
svr := NewServer("127.0.0.1", "19245")
|
svr := NewServer(WithHost("127.0.0.1"), WithPort("19245"))
|
||||||
|
|
||||||
err := svr.Shutdown("test")
|
err := svr.Shutdown("test")
|
||||||
assert.ErrorIs(t, err, ErrServerNotStarted)
|
assert.ErrorIs(t, err, ErrServerNotStarted)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
|
// TODO: #2 Implement Go routine pool/job queue
|
||||||
|
|
||||||
type Worker interface {
|
type Worker interface {
|
||||||
Add(func())
|
Add(func())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue