@ -1,6 +1,12 @@
package handler
package handler
import "net/http"
import (
"fmt"
"net/http"
"os"
)
var fs = http . FileServer ( http . Dir ( "static/" ) )
// Index is the handler that displays the index page.
// Index is the handler that displays the index page.
func Index ( w http . ResponseWriter , r * http . Request ) {
func Index ( w http . ResponseWriter , r * http . Request ) {
@ -13,5 +19,45 @@ func Handler(w http.ResponseWriter, r *http.Request) {
Index ( w , r )
Index ( w , r )
return
return
}
}
if r . URL . Path == "/style.css" {
TemplateStyle ( w , r )
return
}
if Static ( w , r ) {
return
}
Post ( w , r )
Post ( w , r )
}
}
// TemplateStyle is a handler that servers the style of the current template.
func TemplateStyle ( w http . ResponseWriter , r * http . Request ) {
if themeCSS == nil {
// 404 if the theme CSS doesn't exist as it's optional.
CurrentTheme . ExecuteTemplate ( w , "404.tmpl" , nil )
return
}
w . Header ( ) . Add ( "Content-Type" , "text/css" )
_ , _ = w . Write ( themeCSS )
}
// Static is a handler that serves static content if available.
// If it has served something (the static file or an error), it returns true.
func Static ( w http . ResponseWriter , r * http . Request ) bool {
fileName := "static" + r . URL . Path
// Check if the file exists and is not a directory.
info , err := os . Stat ( fileName )
if os . IsNotExist ( err ) || ( info != nil && info . IsDir ( ) ) {
return false
}
if err != nil {
w . WriteHeader ( http . StatusInternalServerError )
CurrentTheme . ExecuteTemplate ( w , "500.tmpl" , fmt . Errorf ( "error reading static folder: %w" , err ) )
return true
}
// The file probably exist now. Even if there's a mismatch, the malicious attacker can only get a
// 404 or a directory listing.
fs . ServeHTTP ( w , r )
return true
}