aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
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())
+ }
}