aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2025-07-31 00:27:20 +0700
committerShulhan <ms@kilabit.info>2025-07-31 00:27:20 +0700
commitb6fec02b55a4227b6ecb47c2bc40a5a025af2b8a (patch)
tree36956ce1c9c51027f6af3982c3c6add0cc596f80 /server.go
parent0537c5e094c7b6e5ff376ccdf0dba80adf5c4342 (diff)
downloadlilin-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.go67
1 files changed, 45 insertions, 22 deletions
diff --git a/server.go b/server.go
index bd272ec..620c36f 100644
--- a/server.go
+++ b/server.go
@@ -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())
+ }
}