/* * SPDX-FileCopyrightText: 2023 jordi fita mas * SPDX-License-Identifier: AGPL-3.0-only */ package http import ( "encoding/json" "net/http" ) const ( HxLocation = "HX-Location" HxRedirect = "HX-Redirect" HxRequest = "HX-Request" HxTriggerAfterSettle = "HX-Trigger-After-Settle" ) func Relocate(w http.ResponseWriter, r *http.Request, url string, code int) { if IsHTMxRequest(r) { w.Header().Set(HxLocation, MustMarshalHTMxLocation(&HTMxLocation{ Path: url, Target: "main", })) w.WriteHeader(http.StatusNoContent) } else { http.Redirect(w, r, url, code) } } func Redirect(w http.ResponseWriter, r *http.Request, url string, code int) { if IsHTMxRequest(r) { w.Header().Set(HxRedirect, url) w.WriteHeader(http.StatusNoContent) } else { http.Redirect(w, r, url, code) } } func TriggerAfterSettle(w http.ResponseWriter, trigger string) { w.Header().Set(HxTriggerAfterSettle, trigger) } func IsHTMxRequest(r *http.Request) bool { return r.Header.Get(HxRequest) == "true" } type HTMxLocation struct { Path string `json:"path"` Target string `json:"target"` } func MustMarshalHTMxLocation(location *HTMxLocation) string { data, err := json.Marshal(location) if err != nil { panic(err) } return string(data) }