diff options
Diffstat (limited to 'server.go')
| -rw-r--r-- | server.go | 67 |
1 files changed, 45 insertions, 22 deletions
@@ -4,13 +4,13 @@ package lilin import ( + "bytes" "context" - "encoding/json" "fmt" + "html/template" + "log" "net/http" "time" - - libhttp "git.sr.ht/~shulhan/pakakeh.go/lib/http" ) const ( @@ -25,13 +25,21 @@ type Server struct { worker *worker Options ServerOptions + Reports Reports + + pageIndexTmpl *template.Template + pageIndexBody bytes.Buffer } +// NewServer create new server to serve the content of _www and HTTP APIs. func NewServer(opts ServerOptions) (srv *Server, err error) { var logp = `NewServer` srv = &Server{ Options: opts, + Reports: Reports{ + Services: map[string]ServiceReport{}, + }, } err = srv.Options.init() @@ -44,8 +52,23 @@ func NewServer(opts ServerOptions) (srv *Server, err error) { return nil, fmt.Errorf(`%s: %w`, logp, err) } + for name := range srv.worker.Services { + srv.Reports.Services[name] = ServiceReport{ + Name: name, + } + } + + srv.pageIndexTmpl, err = template.ParseFS(wwwFS, `_www/index.tmpl`) + if err != nil { + return nil, err + } + err = srv.pageIndexTmpl.Execute(&srv.pageIndexBody, &srv.Reports) + if err != nil { + return nil, err + } + var mux = http.NewServeMux() - mux.HandleFunc(`GET `+pathAPIServicesSummary, srv.handleServicesSummary) + mux.Handle(`GET /`, srv) srv.httpd = &http.Server{ Addr: srv.Options.Address, @@ -58,6 +81,8 @@ func NewServer(opts ServerOptions) (srv *Server, err error) { // ListenAndServe start handling request on incoming connections. func (srv *Server) ListenAndServe() (err error) { + log.Printf(`lilin: starting HTTP server at %s`, srv.Options.Address) + err = srv.httpd.ListenAndServe() if err != nil { return fmt.Errorf(`ListenAndServe: %w`, err) @@ -75,27 +100,25 @@ func (srv *Server) Shutdown(ctx context.Context) (err error) { return nil } -func (srv *Server) handleServicesSummary(resw http.ResponseWriter, req *http.Request) { - var summary = srv.worker.summary() - var resp = libhttp.EndpointResponse{ - Data: summary, - } - var respBody []byte +func (srv *Server) ServeHTTP(resw http.ResponseWriter, req *http.Request) { var err error - respBody, err = json.Marshal(resp) - if err != nil { - goto fail + switch req.URL.Path { + case `/`, `/index.html`: + _, err = resw.Write(srv.pageIndexBody.Bytes()) + if err != nil { + srv.internalError(resw, err) + } + return } - resw.WriteHeader(http.StatusOK) - resw.Write(respBody) - return -fail: + http.Redirect(resw, req, `/`, http.StatusSeeOther) +} + +func (srv *Server) internalError(resw http.ResponseWriter, err error) { resw.WriteHeader(http.StatusInternalServerError) - respBody = []byte(fmt.Sprintf(responseTemplateJSON, - http.StatusInternalServerError, - `ERR_INTERNAL`, - err.Error())) - resw.Write(respBody) + _, err = resw.Write([]byte(err.Error())) + if err != nil { + log.Println(`internalError:`, err.Error()) + } } |
