cerrado @ b1ad6e98445cf7dafa6fec1e2e769051fe7cb748

 1package worker
 2
 3import (
 4	"context"
 5	"net/http"
 6)
 7
 8type ServerTask struct {
 9	server *http.Server
10}
11
12func NewServerTask(server *http.Server) *ServerTask {
13	return &ServerTask{
14		server: server,
15	}
16}
17
18func (self *ServerTask) Start(ctx context.Context) error {
19	done := make(chan error)
20
21	go func() {
22		done <- self.server.ListenAndServe()
23	}()
24
25	select {
26	// if ListenAndServe error for something other than context.Canceled
27	//(e.g.: address already in use) it trigger done to return sonner with
28	// the return error
29	case err := <-done:
30		return err
31
32	// in case of context canceled it will manually trigger the server to
33	// shutdown, and return its error, which is most cases, but not limited, is
34	// context.Canceled.
35	case <-ctx.Done():
36		return self.server.Shutdown(ctx)
37	}
38}