about summary refs log tree commit diff stats
path: root/internal/server/mux.go
diff options
context:
space:
mode:
authorAlan Pearce2024-05-15 20:17:06 +0200
committerAlan Pearce2024-05-15 20:19:39 +0200
commit5521173ea0e05bda93096b51f67c5e813cb1d87e (patch)
tree79f066b3396b19f1b76a1e544a359b9b4088df82 /internal/server/mux.go
parent9437f522c2ed21950acde884cafc369ca45f4b7b (diff)
downloadsearchix-5521173ea0e05bda93096b51f67c5e813cb1d87e.tar.lz
searchix-5521173ea0e05bda93096b51f67c5e813cb1d87e.tar.zst
searchix-5521173ea0e05bda93096b51f67c5e813cb1d87e.zip
feat: add browser search engines via opensearch description
https://developer.mozilla.org/en-US/docs/Web/OpenSearch
Diffstat (limited to 'internal/server/mux.go')
-rw-r--r--internal/server/mux.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/internal/server/mux.go b/internal/server/mux.go
index f9eaf03..e15535f 100644
--- a/internal/server/mux.go
+++ b/internal/server/mux.go
@@ -229,6 +229,42 @@ func NewMux(
 		}
 	})
 
+	mux.HandleFunc(
+		"/options/{source}/opensearch.xml",
+		func(w http.ResponseWriter, r *http.Request) {
+			type openSearchData struct {
+				BaseURL string
+				Source  *config.Source
+			}
+
+			sourceKey := r.PathValue("source")
+			source := cfg.Importer.Sources[sourceKey]
+			if source == nil {
+				errorHandler(w, r, "Source not found", http.StatusNotFound)
+
+				return
+			}
+
+			w.Header().Set("Content-Type", "application/opensearchdescription+xml")
+			err := templates["opensearch.xml"].ExecuteTemplate(
+				w,
+				"opensearch.xml.gotmpl",
+				openSearchData{
+					BaseURL: cfg.Web.BaseURL.String(),
+					Source:  source,
+				},
+			)
+			if err != nil {
+				// no errorHandler; HTML does not make sense here
+				http.Error(
+					w,
+					fmt.Sprintf("Template render error: %v", err),
+					http.StatusInternalServerError,
+				)
+			}
+		},
+	)
+
 	mux.Handle("/static/", http.FileServer(http.FS(frontend.Files)))
 
 	if liveReload {