diff options
| author | 2023-11-27 14:00:57 +0000 | |
|---|---|---|
| committer | 2023-11-27 14:00:57 +0000 | |
| commit | 74700cc8034980334e7df466f313287a41d2b8a6 (patch) | |
| tree | 63ab8912c813eefba8a492e0d0489f4e5fe59446 /internal/api/activitypub | |
| parent | [chore]: Bump codeberg.org/gruf/go-mutexes from 1.3.0 to 1.3.1 (#2387) (diff) | |
| download | gotosocial-74700cc8034980334e7df466f313287a41d2b8a6.tar.xz | |
[performance] http response encoding / writing improvements (#2374)
Diffstat (limited to 'internal/api/activitypub')
| -rw-r--r-- | internal/api/activitypub/emoji/emojiget.go | 18 | ||||
| -rw-r--r-- | internal/api/activitypub/publickey/publickeyget.go | 20 | ||||
| -rw-r--r-- | internal/api/activitypub/users/featured.go | 13 | ||||
| -rw-r--r-- | internal/api/activitypub/users/followers.go | 13 | ||||
| -rw-r--r-- | internal/api/activitypub/users/following.go | 13 | ||||
| -rw-r--r-- | internal/api/activitypub/users/inboxpost.go | 3 | ||||
| -rw-r--r-- | internal/api/activitypub/users/outboxget.go | 13 | ||||
| -rw-r--r-- | internal/api/activitypub/users/outboxget_test.go | 2 | ||||
| -rw-r--r-- | internal/api/activitypub/users/repliesget.go | 14 | ||||
| -rw-r--r-- | internal/api/activitypub/users/repliesget_test.go | 9 | ||||
| -rw-r--r-- | internal/api/activitypub/users/statusget.go | 13 | ||||
| -rw-r--r-- | internal/api/activitypub/users/userget.go | 13 | 
12 files changed, 49 insertions, 95 deletions
| diff --git a/internal/api/activitypub/emoji/emojiget.go b/internal/api/activitypub/emoji/emojiget.go index c291a500a..5a9f0db72 100644 --- a/internal/api/activitypub/emoji/emojiget.go +++ b/internal/api/activitypub/emoji/emojiget.go @@ -18,7 +18,6 @@  package emoji  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -36,7 +35,7 @@ func (m *Module) EmojiGetHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return @@ -48,11 +47,12 @@ func (m *Module) EmojiGetHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	// Encode JSON HTTP response. +	apiutil.EncodeJSONResponse( +		c.Writer, +		c.Request, +		http.StatusOK, +		contentType, +		resp, +	)  } diff --git a/internal/api/activitypub/publickey/publickeyget.go b/internal/api/activitypub/publickey/publickeyget.go index a7de4efad..083a31961 100644 --- a/internal/api/activitypub/publickey/publickeyget.go +++ b/internal/api/activitypub/publickey/publickeyget.go @@ -18,7 +18,6 @@  package publickey  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -42,13 +41,13 @@ func (m *Module) PublicKeyGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// redirect to the user's profile  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername)  		return @@ -60,11 +59,12 @@ func (m *Module) PublicKeyGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	// Encode JSON HTTP response. +	apiutil.EncodeJSONResponse( +		c.Writer, +		c.Request, +		http.StatusOK, +		contentType, +		resp, +	)  } diff --git a/internal/api/activitypub/users/featured.go b/internal/api/activitypub/users/featured.go index 7a2b73a6f..f256c1e75 100644 --- a/internal/api/activitypub/users/featured.go +++ b/internal/api/activitypub/users/featured.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -67,13 +66,13 @@ func (m *Module) FeaturedCollectionGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// This isn't an ActivityPub request;  		// redirect to the user's profile.  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) @@ -86,11 +85,5 @@ func (m *Module) FeaturedCollectionGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/followers.go b/internal/api/activitypub/users/followers.go index e93ef8d4d..956cdc71e 100644 --- a/internal/api/activitypub/users/followers.go +++ b/internal/api/activitypub/users/followers.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -39,13 +38,13 @@ func (m *Module) FollowersGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// This isn't an ActivityPub request;  		// redirect to the user's profile.  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) @@ -68,11 +67,5 @@ func (m *Module) FollowersGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/following.go b/internal/api/activitypub/users/following.go index 54fb3b676..d01b55b57 100644 --- a/internal/api/activitypub/users/following.go +++ b/internal/api/activitypub/users/following.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -39,13 +38,13 @@ func (m *Module) FollowingGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// This isn't an ActivityPub request;  		// redirect to the user's profile.  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) @@ -68,11 +67,5 @@ func (m *Module) FollowingGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/inboxpost.go b/internal/api/activitypub/users/inboxpost.go index c2d3d79c4..03ba5c5a6 100644 --- a/internal/api/activitypub/users/inboxpost.go +++ b/internal/api/activitypub/users/inboxpost.go @@ -47,6 +47,5 @@ func (m *Module) InboxPOSTHandler(c *gin.Context) {  		return  	} -	// Inbox POST body was Accepted for processing. -	c.JSON(http.StatusAccepted, gin.H{"status": http.StatusText(http.StatusAccepted)}) +	apiutil.Data(c, http.StatusAccepted, apiutil.AppJSON, apiutil.StatusAcceptedJSON)  } diff --git a/internal/api/activitypub/users/outboxget.go b/internal/api/activitypub/users/outboxget.go index e4617ba90..7dcc354ac 100644 --- a/internal/api/activitypub/users/outboxget.go +++ b/internal/api/activitypub/users/outboxget.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"fmt"  	"net/http" @@ -93,13 +92,13 @@ func (m *Module) OutboxGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// This isn't an ActivityPub request;  		// redirect to the user's profile.  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) @@ -135,11 +134,5 @@ func (m *Module) OutboxGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/outboxget_test.go b/internal/api/activitypub/users/outboxget_test.go index 4829a8946..31b7e8e9b 100644 --- a/internal/api/activitypub/users/outboxget_test.go +++ b/internal/api/activitypub/users/outboxget_test.go @@ -209,7 +209,7 @@ func (suite *OutboxGetTestSuite) TestGetOutboxNextPage() {  	suite.NoError(err)  	suite.Equal(`{    "@context": "https://www.w3.org/ns/activitystreams", -  "id": "http://localhost:8080/users/the_mighty_zork/outbox?page=true\u0026maxID=01F8MHAMCHF6Y650WCRSCP4WMY", +  "id": "http://localhost:8080/users/the_mighty_zork/outbox?page=true&maxID=01F8MHAMCHF6Y650WCRSCP4WMY",    "orderedItems": [],    "partOf": "http://localhost:8080/users/the_mighty_zork/outbox",    "type": "OrderedCollectionPage" diff --git a/internal/api/activitypub/users/repliesget.go b/internal/api/activitypub/users/repliesget.go index 3ac4ccbbb..2d3472f35 100644 --- a/internal/api/activitypub/users/repliesget.go +++ b/internal/api/activitypub/users/repliesget.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -107,13 +106,13 @@ func (m *Module) StatusRepliesGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// redirect to the status  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername+"/statuses/"+requestedStatusID)  		return @@ -161,12 +160,5 @@ func (m *Module) StatusRepliesGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		errWithCode := gtserror.NewErrorInternalError(err) -		apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/repliesget_test.go b/internal/api/activitypub/users/repliesget_test.go index ac25f3617..d20d8c6c0 100644 --- a/internal/api/activitypub/users/repliesget_test.go +++ b/internal/api/activitypub/users/repliesget_test.go @@ -266,11 +266,16 @@ func toJSON(a any) string {  		}  		a = m  	} -	b, err := json.MarshalIndent(a, "", "  ") +	var dst bytes.Buffer +	enc := json.NewEncoder(&dst) +	enc.SetIndent("", "  ") +	enc.SetEscapeHTML(false) +	err := enc.Encode(a)  	if err != nil {  		panic(err)  	} -	return string(b) +	dst.Truncate(dst.Len() - 1) // drop new-line +	return dst.String()  }  // indentJSON will return indented JSON from raw provided JSON. diff --git a/internal/api/activitypub/users/statusget.go b/internal/api/activitypub/users/statusget.go index f7b5ccfd1..27af9c6b4 100644 --- a/internal/api/activitypub/users/statusget.go +++ b/internal/api/activitypub/users/statusget.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -46,13 +45,13 @@ func (m *Module) StatusGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// redirect to the status  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername+"/statuses/"+requestedStatusID)  		return @@ -64,11 +63,5 @@ func (m *Module) StatusGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } diff --git a/internal/api/activitypub/users/userget.go b/internal/api/activitypub/users/userget.go index 61be69836..2deca0fa4 100644 --- a/internal/api/activitypub/users/userget.go +++ b/internal/api/activitypub/users/userget.go @@ -18,7 +18,6 @@  package users  import ( -	"encoding/json"  	"errors"  	"net/http"  	"strings" @@ -46,13 +45,13 @@ func (m *Module) UsersGETHandler(c *gin.Context) {  		return  	} -	format, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...) +	contentType, err := apiutil.NegotiateAccept(c, apiutil.ActivityPubOrHTMLHeaders...)  	if err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1)  		return  	} -	if format == string(apiutil.TextHTML) { +	if contentType == string(apiutil.TextHTML) {  		// redirect to the user's profile  		c.Redirect(http.StatusSeeOther, "/@"+requestedUsername)  		return @@ -64,11 +63,5 @@ func (m *Module) UsersGETHandler(c *gin.Context) {  		return  	} -	b, err := json.Marshal(resp) -	if err != nil { -		apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) -		return -	} - -	c.Data(http.StatusOK, format, b) +	apiutil.JSONType(c, http.StatusOK, contentType, resp)  } | 
