From a4621a1d4ee2c307dded842d5866ac9de76a40b4 Mon Sep 17 00:00:00 2001 From: FChannel <> Date: Tue, 14 Jun 2022 16:43:11 -0700 Subject: set retry on fail POST req. might be pointless though since other parts require requests that cannont be delayed --- activitypub/activity.go | 163 +++++++++++++++++++++++++----------------------- 1 file changed, 84 insertions(+), 79 deletions(-) (limited to 'activitypub') diff --git a/activitypub/activity.go b/activitypub/activity.go index 71f2d5c..ef25b5d 100644 --- a/activitypub/activity.go +++ b/activitypub/activity.go @@ -51,7 +51,7 @@ func (activity Activity) AddFollowersTo() (Activity, error) { bFollowers, err := reqActivity.GetCollection() if err != nil { - return activity, util.MakeError(err, "AddFollowersTo") + continue } // get followers of activity actor followers @@ -336,36 +336,6 @@ func (activity Activity) SetActorFollowing() (Activity, error) { return activity, nil } -func (activity Activity) MakeFollowingReq() (bool, error) { - actor, err := GetActor(activity.Object.Id) - - if err != nil { - return false, util.MakeError(err, "MakeFollowingReq") - } - - req, err := http.NewRequest("POST", actor.Inbox, nil) - - if err != nil { - return false, util.MakeError(err, "MakeFollowingReq") - } - - resp, err := util.RouteProxy(req) - - if err != nil { - return false, util.MakeError(err, "MakeFollowingReq") - } - - defer resp.Body.Close() - - body, _ := ioutil.ReadAll(resp.Body) - - var respActivity Activity - - err = json.Unmarshal(body, &respActivity) - - return respActivity.Type == "Accept", util.MakeError(err, "MakeFollowingReq") -} - func (activity Activity) MakeRequestInbox() error { j, _ := json.MarshalIndent(activity, "", "\t") @@ -381,35 +351,50 @@ func (activity Activity) MakeRequestInbox() error { _, instance := GetActorAndInstance(actor.Id) if actor.Inbox != "" { - req, err := http.NewRequest("POST", actor.Inbox, bytes.NewBuffer(j)) + go func(actor Actor, activity Activity) error { + var status int + var try int + + for try != 5 && status != 200 { + time.Sleep(time.Duration(try) * time.Minute) + + req, err := http.NewRequest("POST", actor.Inbox, bytes.NewBuffer(j)) + + if err != nil { + return util.MakeError(err, "MakeRequest") + } - if err != nil { - return util.MakeError(err, "MakeRequest") - } + date := time.Now().UTC().Format(time.RFC1123) + path := strings.Replace(actor.Inbox, instance, "", 1) + re := regexp.MustCompile("https?://(www.)?") + path = re.ReplaceAllString(path, "") + sig := fmt.Sprintf("(request-target): %s %s\nhost: %s\ndate: %s", "post", path, instance, date) + encSig, err := activity.Actor.ActivitySign(sig) - date := time.Now().UTC().Format(time.RFC1123) - path := strings.Replace(actor.Inbox, instance, "", 1) - re := regexp.MustCompile("https?://(www.)?") - path = re.ReplaceAllString(path, "") - sig := fmt.Sprintf("(request-target): %s %s\nhost: %s\ndate: %s", "post", path, instance, date) - encSig, err := activity.Actor.ActivitySign(sig) + if err != nil { + return util.MakeError(err, "MakeRequest") + } - if err != nil { - return util.MakeError(err, "MakeRequest") - } + signature := fmt.Sprintf("keyId=\"%s\",headers=\"(request-target) host date\",signature=\"%s\"", activity.Actor.PublicKey.Id, encSig) - signature := fmt.Sprintf("keyId=\"%s\",headers=\"(request-target) host date\",signature=\"%s\"", activity.Actor.PublicKey.Id, encSig) + req.Header.Set("Content-Type", config.ActivityStreams) + req.Header.Set("Date", date) + req.Header.Set("Signature", signature) + req.Host = instance - req.Header.Set("Content-Type", config.ActivityStreams) - req.Header.Set("Date", date) - req.Header.Set("Signature", signature) - req.Host = instance + resp, err := util.RouteProxy(req) - _, err = util.RouteProxy(req) + if err != nil { + return util.MakeError(err, "MakeRequest") + } - if err != nil { - return util.MakeError(err, "MakeRequest") - } + status = resp.StatusCode + try += 1 + } + + return nil + + }(actor, activity) } } } @@ -425,38 +410,58 @@ func (activity Activity) MakeRequestOutbox() error { return util.MakeError(errors.New("invalid outbox"), "MakeRequestOutbox") } - req, err := http.NewRequest("POST", activity.Actor.Outbox, bytes.NewBuffer(j)) - if err != nil { - return util.MakeError(err, "MakeRequestOutbox") - } + go func(actor Actor, activity Activity) error { + var status int + var try int - re := regexp.MustCompile("https?://(www.)?") + for try != 5 && status != 200 { + time.Sleep(time.Duration(try) * time.Minute) - var instance string - if activity.Actor.Id == config.Domain { - instance = re.ReplaceAllString(config.Domain, "") - } else { - _, instance = GetActorAndInstance(activity.Actor.Id) - } + req, err := http.NewRequest("POST", activity.Actor.Outbox, bytes.NewBuffer(j)) + + if err != nil { + return util.MakeError(err, "MakeRequestOutbox") + } - date := time.Now().UTC().Format(time.RFC1123) - path := strings.Replace(activity.Actor.Outbox, instance, "", 1) - path = re.ReplaceAllString(path, "") - sig := fmt.Sprintf("(request-target): %s %s\nhost: %s\ndate: %s", "post", path, instance, date) - encSig, err := activity.Actor.ActivitySign(sig) + re := regexp.MustCompile("https?://(www.)?") - if err != nil { - return util.MakeError(err, "MakeRequestOutbox") - } + var instance string + if activity.Actor.Id == config.Domain { + instance = re.ReplaceAllString(config.Domain, "") + } else { + _, instance = GetActorAndInstance(activity.Actor.Id) + } - signature := fmt.Sprintf("keyId=\"%s\",headers=\"(request-target) host date\",signature=\"%s\"", activity.Actor.PublicKey.Id, encSig) + date := time.Now().UTC().Format(time.RFC1123) + path := strings.Replace(activity.Actor.Outbox, instance, "", 1) + path = re.ReplaceAllString(path, "") + sig := fmt.Sprintf("(request-target): %s %s\nhost: %s\ndate: %s", "post", path, instance, date) + encSig, err := activity.Actor.ActivitySign(sig) + + if err != nil { + return util.MakeError(err, "MakeRequestOutbox") + } + + signature := fmt.Sprintf("keyId=\"%s\",headers=\"(request-target) host date\",signature=\"%s\"", activity.Actor.PublicKey.Id, encSig) + + req.Header.Set("Content-Type", config.ActivityStreams) + req.Header.Set("Date", date) + req.Header.Set("Signature", signature) + req.Host = instance + + resp, err := util.RouteProxy(req) + + if err != nil { + return util.MakeError(err, "MakeRequest") + } + + status = resp.StatusCode + try += 1 + } - req.Header.Set("Content-Type", config.ActivityStreams) - req.Header.Set("Date", date) - req.Header.Set("Signature", signature) - req.Host = instance + return nil - _, err = util.RouteProxy(req) + }(*activity.Actor, activity) - return util.MakeError(err, "MakeRequestOutbox") + return util.MakeError(nil, "MakeRequestOutbox") } -- cgit v1.2.3