[feature] add worker task serialization logic (#2989)

* improved server shutdown with more precise shutdown of modules + deferring of ALL of it

* move delivery and workers into separate files

* add worker task model and Serialize() / Deserialize() methods for message types

* start adding message serialize / deserialize tests

* start adding test cases

* update body rewinding to rely on standard library mechanism of r.GetBody()

* remove request rewinding (http.Client{} should already handle this)

* standard library already handles rewinding

* improved code comment

* move the newPOST() function contents to prepare(), fits better with current API

* add Serialize() / Deserialize() implementations for Delivery{} type

* finish writing FromClientAPI sserialize / deserialize tests

* start adding FromFediAPI{} serialize / deserialize test cases

* fix FromFediAPI{} tests

* add tests for delivery message type

* fix repeat code

* missing license header

* use testrig status and accounts for marshal / unmarshaling tests

* add a specific test for checking account RSA keys are preserved
This commit is contained in:
kim 2024-06-20 17:06:20 +00:00 committed by GitHub
commit 7b1ccbd65a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 6318 additions and 457 deletions

View file

@ -18,12 +18,12 @@
package transport
import (
"bytes"
"context"
"encoding/json"
"net/http"
"net/url"
"codeberg.org/gruf/go-byteutil"
apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util"
"github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/gtscontext"
@ -130,25 +130,28 @@ func (t *transport) prepare(
*delivery.Delivery,
error,
) {
url := to.String()
// Use rewindable reader for body.
var body byteutil.ReadNopCloser
body.Reset(data)
// Prepare POST signer.
sign := t.signPOST(data)
// Use *bytes.Reader for request body,
// as NewRequest() automatically will
// set .GetBody and content-length.
// (this handles necessary rewinding).
body := bytes.NewReader(data)
// Update to-be-used request context with signing details.
ctx = gtscontext.SetOutgoingPublicKeyID(ctx, t.pubKeyID)
ctx = gtscontext.SetHTTPClientSignFunc(ctx, sign)
// Prepare a new request with data body directed at URL.
r, err := http.NewRequestWithContext(ctx, "POST", url, &body)
r, err := http.NewRequestWithContext(ctx, "POST", to.String(), body)
if err != nil {
return nil, gtserror.Newf("error preparing request: %w", err)
}
// Set our predefined controller user-agent.
r.Header.Set("User-Agent", t.controller.userAgent)
// Set the standard ActivityPub content-type + charset headers.
r.Header.Add("Content-Type", string(apiutil.AppActivityLDJSON))
r.Header.Add("Accept-Charset", "utf-8")