github.com/golazy/golazy@v0.0.7-0.20221012133820-968fe65a0b65/lazyview/serve/page.go (about)

     1  package serve
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"net/http/httputil"
     9  	"os"
    10  
    11  	"github.com/golazy/golazy/lazyview/nodes"
    12  	"github.com/gorilla/handlers"
    13  )
    14  
    15  func Page(e nodes.Element) http.HandlerFunc {
    16  	return func(w http.ResponseWriter, r *http.Request) {
    17  		e.WriteTo(w)
    18  	}
    19  }
    20  
    21  func ServePage(e nodes.Element) {
    22  	port := os.Getenv("PORT")
    23  	if port == "" {
    24  		port = "2000"
    25  	}
    26  
    27  	http.Handle("/", Page(e))
    28  
    29  	log.Println("Listening on http://localhost:" + port)
    30  
    31  	err := http.ListenAndServe(":"+port, handlers.CombinedLoggingHandler(os.Stdout, http.DefaultServeMux))
    32  	//err := http.ListenAndServe(":"+port, http.DefaultServeMux)
    33  	//err := http.ListenAndServe(":"+port, logHandler(http.DefaultServeMux.ServeHTTP))
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  
    38  }
    39  
    40  func logHandler(fn http.HandlerFunc) http.HandlerFunc {
    41  	return func(w http.ResponseWriter, r *http.Request) {
    42  		x, err := httputil.DumpRequest(r, true)
    43  		if err != nil {
    44  			http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)
    45  			return
    46  		}
    47  		log.Println(fmt.Sprintf("%q", x))
    48  		rec := httptest.NewRecorder()
    49  		fn(rec, r)
    50  		log.Println(fmt.Sprintf("%q", rec.Body))
    51  
    52  		// this copies the recorded response to the response writer
    53  		for k, v := range rec.HeaderMap {
    54  			w.Header()[k] = v
    55  		}
    56  		w.WriteHeader(rec.Code)
    57  		rec.Body.WriteTo(w)
    58  	}
    59  }