123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package middleware
- import (
- "net/http"
- "strings"
- "github.com/owncast/owncast/core/data"
- "github.com/owncast/owncast/utils"
- )
- // RequireActivityPubOrRedirect will validate the requested content types and
- // redirect to the main Owncast page if it doesn't match.
- func RequireActivityPubOrRedirect(handler http.HandlerFunc) http.HandlerFunc {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if !data.GetFederationEnabled() {
- w.WriteHeader(http.StatusMethodNotAllowed)
- return
- }
- handleAccepted := func() {
- handler(w, r)
- }
- acceptedContentTypes := []string{"application/json", "application/json+ld", "application/activity+json", `application/ld+json; profile="https://www.w3.org/ns/activitystreams"`}
- var accept []string
- for _, a := range r.Header.Values("Accept") {
- accept = append(accept, strings.Split(a, ",")...)
- }
- for _, singleType := range accept {
- if _, accepted := utils.FindInSlice(acceptedContentTypes, strings.TrimSpace(singleType)); accepted {
- handleAccepted()
- return
- }
- }
- contentTypeString := r.Header.Get("Content-Type")
- contentTypes := strings.Split(contentTypeString, ",")
- for _, singleType := range contentTypes {
- if _, accepted := utils.FindInSlice(acceptedContentTypes, strings.TrimSpace(singleType)); accepted {
- handleAccepted()
- return
- }
- }
- http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
- })
- }
|