diff options
| author | Shulhan <ms@kilabit.info> | 2025-07-31 00:27:20 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2025-07-31 00:27:20 +0700 |
| commit | b6fec02b55a4227b6ecb47c2bc40a5a025af2b8a (patch) | |
| tree | 36956ce1c9c51027f6af3982c3c6add0cc596f80 /server.go | |
| parent | 0537c5e094c7b6e5ff376ccdf0dba80adf5c4342 (diff) | |
| download | lilin-b6fec02b55a4227b6ecb47c2bc40a5a025af2b8a.tar.xz | |
all: refactoring web page to render using template
Instead of using HTML and JavaScript, generate the web page using
template.
This minimize number of works we do in the future (creating client
in JavaScript and HTTP APIs).
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()) + } } |
