Fix activitystream path manipulation

This commit is contained in:
Jan-Lukas Else 2020-09-25 19:23:01 +02:00
parent b96424f886
commit d1e0916342
5 changed files with 31 additions and 38 deletions

View File

@ -2,12 +2,23 @@ package main
import ( import (
"encoding/json" "encoding/json"
"github.com/araddon/dateparse"
"net/http" "net/http"
"strings" "strings"
"time" "time"
"github.com/araddon/dateparse"
) )
func manipulateAsPath(next http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if lowerAccept := strings.ToLower(r.Header.Get("Accept")); (strings.Contains(lowerAccept, "application/activity+json") || strings.Contains(lowerAccept, "application/ld+json")) && !strings.Contains(lowerAccept, "text/html") {
// Is ActivityStream, add ".as" to differentiate cache and also trigger as function
r.URL.Path += ".as"
}
next.ServeHTTP(rw, r)
})
}
type asPost struct { type asPost struct {
Context []string `json:"@context"` Context []string `json:"@context"`
To []string `json:"to"` To []string `json:"to"`
@ -19,14 +30,14 @@ type asPost struct {
Attachment []*asAttachment `json:"attachment,omitempty"` Attachment []*asAttachment `json:"attachment,omitempty"`
Published string `json:"published"` Published string `json:"published"`
Updated string `json:"updated,omitempty"` Updated string `json:"updated,omitempty"`
Id string `json:"id"` ID string `json:"id"`
Url string `json:"url"` URL string `json:"url"`
AttributedTo string `json:"attributedTo"` AttributedTo string `json:"attributedTo"`
} }
type asAttachment struct { type asAttachment struct {
Type string `json:"type"` Type string `json:"type"`
Url string `json:"url"` URL string `json:"url"`
} }
func servePostActivityStreams(w http.ResponseWriter, r *http.Request) { func servePostActivityStreams(w http.ResponseWriter, r *http.Request) {
@ -46,8 +57,8 @@ func servePostActivityStreams(w http.ResponseWriter, r *http.Request) {
Context: []string{"https://www.w3.org/ns/activitystreams"}, Context: []string{"https://www.w3.org/ns/activitystreams"},
To: []string{"https://www.w3.org/ns/activitystreams#Public"}, To: []string{"https://www.w3.org/ns/activitystreams#Public"},
MediaType: "text/html", MediaType: "text/html",
Id: appConfig.Server.PublicAddress + post.Path, ID: appConfig.Server.PublicAddress + post.Path,
Url: appConfig.Server.PublicAddress + post.Path, URL: appConfig.Server.PublicAddress + post.Path,
AttributedTo: appConfig.Server.PublicAddress, AttributedTo: appConfig.Server.PublicAddress,
} }
// Name and Type // Name and Type
@ -69,7 +80,7 @@ func servePostActivityStreams(w http.ResponseWriter, r *http.Request) {
for _, image := range images { for _, image := range images {
as.Attachment = append(as.Attachment, &asAttachment{ as.Attachment = append(as.Attachment, &asAttachment{
Type: "Image", Type: "Image",
Url: image, URL: image,
}) })
} }
} }

View File

@ -16,25 +16,13 @@ func initCache() {
cacheMutexes = map[string]*sync.Mutex{} cacheMutexes = map[string]*sync.Mutex{}
} }
func cacheWithCheckMiddleware(cache func(r *http.Request) bool) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
if cache(request) {
cacheMiddleware(next).ServeHTTP(writer, request)
} else {
next.ServeHTTP(writer, request)
}
})
}
}
func cacheMiddleware(next http.Handler) http.Handler { func cacheMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestUrl, _ := url.ParseRequestURI(r.RequestURI) requestURL, _ := url.ParseRequestURI(r.RequestURI)
path := slashTrimmedPath(r) path := slashTrimmedPath(r)
if appConfig.Cache.Enable && if appConfig.Cache.Enable &&
// check bypass query // check bypass query
!(requestUrl != nil && requestUrl.Query().Get("cache") == "0") { !(requestURL != nil && requestURL.Query().Get("cache") == "0") {
// Check cache mutex // Check cache mutex
if cacheMutexes[path] == nil { if cacheMutexes[path] == nil {
cacheMutexes[path] = &sync.Mutex{} cacheMutexes[path] = &sync.Mutex{}

4
go.mod
View File

@ -40,9 +40,9 @@ require (
go.uber.org/zap v1.16.0 // indirect go.uber.org/zap v1.16.0 // indirect
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect
golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
golang.org/x/net v0.0.0-20200923182212-328152dc79b1 // indirect golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321 // indirect
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d // indirect golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d // indirect
golang.org/x/tools v0.0.0-20200923182640-463111b69878 // indirect golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce // indirect
gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect
gopkg.in/ini.v1 v1.61.0 // indirect gopkg.in/ini.v1 v1.61.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect

8
go.sum
View File

@ -362,8 +362,8 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200923182212-328152dc79b1 h1:Iu68XRPd67wN4aRGGWwwq6bZo/25jR6uu52l/j2KkUE= golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321 h1:lleNcKRbcaC8MqgLwghIkzZ2JBQAb7QQ9MiwRt1BisA=
golang.org/x/net v0.0.0-20200923182212-328152dc79b1/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200925080053-05aa5d4ee321/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -426,8 +426,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200923182640-463111b69878 h1:VUw1+Jf6KJPf82mbTQMia6HCnNMv2BbAipkEZ4KTcqQ= golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce h1:XRr763sMfaUSNR4EsxbddvVEqYFa9picrx6ks9pJkKw=
golang.org/x/tools v0.0.0-20200923182640-463111b69878/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20200924224222-8d73f17870ce/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=

16
http.go
View File

@ -1,13 +1,14 @@
package main package main
import ( import (
"github.com/caddyserver/certmagic"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"github.com/caddyserver/certmagic"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
) )
const contentTypeHTML = "text/html; charset=utf-8" const contentTypeHTML = "text/html; charset=utf-8"
@ -76,14 +77,7 @@ func buildHandler() (http.Handler, error) {
} }
for _, path := range allPostPaths { for _, path := range allPostPaths {
if path != "" { if path != "" {
r.With(cacheWithCheckMiddleware(func(r *http.Request) bool { r.With(manipulateAsPath, cacheMiddleware, minifier.Middleware).Get(path, servePost)
if lowerAccept := strings.ToLower(r.Header.Get("Accept")); (strings.Contains(lowerAccept, "application/activity+json") || strings.Contains(lowerAccept, "application/ld+json")) &&
!strings.Contains(lowerAccept, "text/html") {
// Is ActivityStream, add ".as" to differentiate cache and also trigger as function
r.URL.Path += ".as"
}
return true
}), minifier.Middleware).Get(path, servePost)
} }
} }