From cdd67270492043818411d70c697f7b8c48788b22 Mon Sep 17 00:00:00 2001
From: Moritz Marquardt <git@momar.de>
Date: Wed, 17 Mar 2021 01:16:57 +0100
Subject: [PATCH] Fix error page not rendering & make it more beautiful

---
 404.html        | 22 +++++++++++++---------
 certificates.go |  2 ++
 handler.go      | 15 ++++++++++-----
 3 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/404.html b/404.html
index 854781d..3b5265c 100644
--- a/404.html
+++ b/404.html
@@ -3,16 +3,16 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width">
-    <title>Not found</title>
+    <title>%status</title>
 
-    <link rel="stylesheet" href="https://design.codeberg.org/design-kit/codeberg.css" />
+    <link rel="stylesheet" href="https://design.codeberg-test.org/design-kit/codeberg.css" />
     <link href="https://fonts.codeberg.org/dist/inter/Inter%20Web/inter.css" rel="stylesheet" />
     <link href="https://fonts.codeberg.org/dist/fontawesome5/css/all.min.css" rel="stylesheet" />
 
     <style>
         body {
             margin: 0; padding: 1rem; box-sizing: border-box;
-            width: 100%; min-height: 100vw;
+            width: 100%; min-height: 100vh;
             display: flex;
             flex-direction: column;
             align-items: center;
@@ -21,12 +21,16 @@
     </style>
 </head>
 <body>
-    <i class="fa fa-bug" style="font-size: 96px"></i>
-    <h1>You found a bug!</h1>
-    <h3>Sorry, this page doesn't exist or is otherwise inaccessible (code %status)</h3>
-    <small>
-        <img src="https://design.codeberg.org/logo-kit/icon.svg">
-        Website powered by <a href="https://codeberg.page">Codeberg Pages</a>
+    <i class="fa fa-bug text-primary" style="font-size: 96px;"></i>
+    <h1 class="mb-0 text-primary">
+    	You found a bug!
+    </h1>
+    <h5 class="text-center" style="max-width: 25em;">
+    	Sorry, this page doesn't exist or is inaccessible for other reasons (%status)
+    </h5>
+    <small class="text-muted">
+        <img src="https://design.codeberg-test.org/logo-kit/icon.svg" class="align-top">
+        Static pages made easy - <a href="https://codeberg.page">Codeberg Pages</a>
     </small>
 </body>
 </html>
diff --git a/certificates.go b/certificates.go
index 78e1110..680fea8 100644
--- a/certificates.go
+++ b/certificates.go
@@ -14,3 +14,5 @@ var tlsConfig = &tls.Config{
 	PreferServerCipherSuites: true,
 	// TODO: optimize cipher suites, minimum TLS version, etc.
 }
+
+// TODO: HSTS header with includeSubdomains & preload for MainDomainSuffix and RawDomain
diff --git a/handler.go b/handler.go
index 02a1a73..97c38ad 100644
--- a/handler.go
+++ b/handler.go
@@ -148,7 +148,8 @@ func handler(ctx *fasthttp.RequestCtx) {
 // with the provided status code.
 func returnErrorPage(ctx *fasthttp.RequestCtx, code int) {
 	ctx.Response.SetStatusCode(code)
-	ctx.Response.SetBody(bytes.ReplaceAll(NotFoundPage, []byte("%status"), []byte(strconv.Itoa(code))))
+	ctx.Response.Header.SetContentType("text/html; charset=utf-8")
+	ctx.Response.SetBody(bytes.ReplaceAll(NotFoundPage, []byte("%status"), []byte(strconv.Itoa(code) + " " + fasthttp.StatusMessage(code))))
 }
 
 // getBranchTimestamp finds the default branch (if branch is "") and returns the last modification time of the branch
@@ -186,10 +187,14 @@ func upstream(ctx *fasthttp.RequestCtx, targetOwner string, targetRepo string, t
 	// Check if the branch exists and when it was modified
 	if options.BranchTimestamp == (time.Time{}) {
 		targetBranch, options.BranchTimestamp = getBranchTimestamp(targetOwner, targetRepo, targetBranch)
-		if options.BranchTimestamp == (time.Time{}) {
-			ctx.Response.SetStatusCode(fasthttp.StatusNotFound)
-			return false
-		}
+	}
+
+	// Handle repositories with no/broken pages setup
+	if options.BranchTimestamp == (time.Time{}) || targetBranch == "" {
+		ctx.Response.SetStatusCode(fasthttp.StatusNotFound)
+		ctx.Response.Header.SetContentType("text/html; charset=utf-8")
+		ctx.Response.SetBody(bytes.ReplaceAll(NotFoundPage, []byte("%status"), []byte("pages not set up for this repo")))
+		return true
 	}
 
 	// Check if the browser has a cached version