feat: Added init code

This commit is contained in:
Nathan Woodburn 2024-06-17 14:38:43 +10:00
parent ce5d474cda
commit 9c5189071a
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
7 changed files with 188 additions and 0 deletions

131
main.go Normal file
View File

@ -0,0 +1,131 @@
package main
import (
"fmt"
"html/template"
"log"
"net/http"
"path/filepath"
)
func main() {
http.HandleFunc("/", mainHandler)
http.HandleFunc("/assets/", assetHandler)
fmt.Println("Starting server on :3000 ...")
log.Fatal(http.ListenAndServe(":3000", nil))
}
func mainHandler(w http.ResponseWriter, r *http.Request) {
// Sanitize the path to prevent directory traversal attacks
relPath := r.URL.Path
if relPath == "/" {
relPath = "/index"
}
// Check method
switch r.Method {
case http.MethodGet:
getHandler(relPath, w, r)
case http.MethodPost:
postHandler(relPath, w, r)
default:
errorPage(405, w, r)
}
}
func getHandler(relPath string, w http.ResponseWriter, r *http.Request) {
tmplPath := filepath.Join("templates", filepath.Clean(relPath)+".html")
// Parse the template
tmpl, err := template.ParseFiles(tmplPath)
if err != nil {
errorPage(404, w, r)
return
}
// Execute the template
err = tmpl.Execute(w, nil)
if err != nil {
http.Error(w, "Error rendering template", http.StatusInternalServerError)
}
}
func postHandler(relPath string, w http.ResponseWriter, r *http.Request) {
switch relPath {
case "/index":
indexPostHandler(w, r)
default:
errorPage(405, w, r)
}
}
func indexPostHandler(w http.ResponseWriter, r *http.Request) {
// Parse the form data
err := r.ParseForm()
if err != nil {
errorPage(500, w, r)
return
}
// Get the form data
message := r.FormValue("message")
// Print the message to the console
log.Printf("Message: %s", message)
// Create a map to hold the data
requestData := map[string]interface{}{
"message": message,
}
// Return a page with message
tmpl, err := template.ParseFiles("templates/index.html")
if err != nil {
errorPage(500, w, r)
return
}
err = tmpl.Execute(w, requestData)
}
func errorPage(errorCode int, w http.ResponseWriter, r *http.Request) {
w.WriteHeader(errorCode)
tmpl, err := template.ParseFiles("templates/error.html")
if err != nil {
log.Printf("Error loading error page template: %v", err)
http.Error(w, "Error loading error page", http.StatusInternalServerError)
return
}
errorMsgs := map[int]string{
404: "Page not found for " + r.URL.Path,
405: "Method not allowed",
500: "Internal server error",
}
// Check if errorcode isn't in the map
if _, ok := errorMsgs[errorCode]; !ok {
errorCode = 500
}
// Correcting the initialization of the errorData map
errorData := map[string]interface{}{
"short": errorCode,
"long": errorMsgs[errorCode],
}
err = tmpl.Execute(w, errorData)
if err != nil {
log.Printf("Error executing error page template: %v", err)
http.Error(w, "Error rendering error page", http.StatusInternalServerError)
}
}
func assetHandler(w http.ResponseWriter, r *http.Request) {
// Serve static files from templates/assets
http.ServeFile(w, r, filepath.Join("templates", filepath.Clean(r.URL.Path)))
}

13
templates/about.html Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Go HTML Template</title>
<link rel="stylesheet" href="/assets/css/index.css">
<link rel="icon" href="/assets/img/favicon.png">
</head>
<body>
<h1>About page</h1>
</body>
</html>

View File

@ -0,0 +1,5 @@
html {
background-color: black;
color: white;
text-align: center;
}

View File

@ -0,0 +1,4 @@
html {
background-color: black;
color: white;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

14
templates/error.html Normal file
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Error {{.short}}</title>
<link rel="stylesheet" href="/assets/css/error.css">
<link rel="icon" href="/assets/img/favicon.png">
</head>
<body>
<h1>Error {{.short}}</h1>
<p>{{.long}}</p>
</body>
</html>

21
templates/index.html Normal file
View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Go HTML Template</title>
<link rel="stylesheet" href="/assets/css/index.css">
<link rel="icon" href="/assets/img/favicon.png">
</head>
<body>
<h1>Hello, World!</h1>
{{if .message}}
<p>{{.message}}</p>
{{end}}
<form action="/" method="post">
<input type="text" name="message" placeholder="Enter your message">
<button type="submit">Submit</button>
</form>
</body>
</html>