1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package bootstrap
- import (
- "context"
- "fmt"
- "net/http"
- "os"
- "os/signal"
- "time"
- )
- type hndl func(h http.Handler) http.Handler
- type callback func(w http.ResponseWriter, r *http.Request)
- type bootstrap struct {
- path string
- before callback
- after callback
- }
- func new(path string, before callback, after callback) *bootstrap {
- return &bootstrap{path, before, after}
- }
- func (this *bootstrap) handler(w http.ResponseWriter, r *http.Request) {
- if this.before != nil {
- this.before(w, r)
- }
- if r.URL.Path == "/"+this.path+"/bootstrap.css" {
- w.Header().Set("Cache-Control", "public, max-age=31536000")
- w.Header().Set("Content-Type", "text/css")
- w.Write(resource_bootstrap_css)
- return
- } else if r.URL.Path == "/"+this.path+"/bootstrap.js" {
- w.Header().Set("Cache-Control", "public, max-age=31536000")
- w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
- w.Write(resource_bootstrap_js)
- return
- } else if r.URL.Path == "/"+this.path+"/jquery.js" {
- w.Header().Set("Cache-Control", "public, max-age=31536000")
- w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
- w.Write(resource_jquery_js)
- return
- } else if r.URL.Path == "/"+this.path+"/popper.js" {
- w.Header().Set("Cache-Control", "public, max-age=31536000")
- w.Header().Set("Content-Type", "application/javascript; charset=utf-8")
- w.Write(resource_popper_js)
- return
- }
- if this.after != nil {
- this.after(w, r)
- }
- }
- func Start(h hndl, host string, timeout time.Duration, path string, before callback, after callback) {
- mux := http.NewServeMux()
- mux.HandleFunc("/", new(path, before, after).handler)
- var srv *http.Server
- if h == nil {
- srv = &http.Server{
- Addr: host,
- Handler: mux,
- }
- } else {
- srv = &http.Server{
- Addr: host,
- Handler: h(mux),
- }
- }
- stop := make(chan os.Signal)
- signal.Notify(stop, os.Interrupt)
- go func() {
- fmt.Printf("Starting server at http://%s/\n", host)
- if err := srv.ListenAndServe(); err != nil {
- if err != http.ErrServerClosed {
- fmt.Println(err)
- }
- }
- }()
- <-stop
- fmt.Println("Shutting down server...")
- ctx, cancel := context.WithTimeout(context.Background(), timeout*time.Second)
- defer cancel()
- if err := srv.Shutdown(ctx); err != nil {
- fmt.Println(err)
- }
- }
|