gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

dereference.go (2324B)


      1 // GoToSocial
      2 // Copyright (C) GoToSocial Authors admin@gotosocial.org
      3 // SPDX-License-Identifier: AGPL-3.0-or-later
      4 //
      5 // This program is free software: you can redistribute it and/or modify
      6 // it under the terms of the GNU Affero General Public License as published by
      7 // the Free Software Foundation, either version 3 of the License, or
      8 // (at your option) any later version.
      9 //
     10 // This program is distributed in the hope that it will be useful,
     11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 // GNU Affero General Public License for more details.
     14 //
     15 // You should have received a copy of the GNU Affero General Public License
     16 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
     17 
     18 package transport
     19 
     20 import (
     21 	"context"
     22 	"io"
     23 	"net/http"
     24 	"net/url"
     25 
     26 	apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util"
     27 	"github.com/superseriousbusiness/gotosocial/internal/config"
     28 	"github.com/superseriousbusiness/gotosocial/internal/gtserror"
     29 	"github.com/superseriousbusiness/gotosocial/internal/uris"
     30 )
     31 
     32 func (t *transport) Dereference(ctx context.Context, iri *url.URL) ([]byte, error) {
     33 	// if the request is to us, we can shortcut for certain URIs rather than going through
     34 	// the normal request flow, thereby saving time and energy
     35 	if iri.Host == config.GetHost() {
     36 		if uris.IsFollowersPath(iri) {
     37 			// the request is for followers of one of our accounts, which we can shortcut
     38 			return t.controller.dereferenceLocalFollowers(ctx, iri)
     39 		}
     40 
     41 		if uris.IsUserPath(iri) {
     42 			// the request is for one of our accounts, which we can shortcut
     43 			return t.controller.dereferenceLocalUser(ctx, iri)
     44 		}
     45 	}
     46 
     47 	// Build IRI just once
     48 	iriStr := iri.String()
     49 
     50 	// Prepare new HTTP request to endpoint
     51 	req, err := http.NewRequestWithContext(ctx, "GET", iriStr, nil)
     52 	if err != nil {
     53 		return nil, err
     54 	}
     55 
     56 	req.Header.Add("Accept", string(apiutil.AppActivityLDJSON)+","+string(apiutil.AppActivityJSON))
     57 	req.Header.Add("Accept-Charset", "utf-8")
     58 	req.Header.Set("Host", iri.Host)
     59 
     60 	// Perform the HTTP request
     61 	rsp, err := t.GET(req)
     62 	if err != nil {
     63 		return nil, err
     64 	}
     65 	defer rsp.Body.Close()
     66 
     67 	if rsp.StatusCode != http.StatusOK {
     68 		return nil, gtserror.NewFromResponse(rsp)
     69 	}
     70 
     71 	return io.ReadAll(rsp.Body)
     72 }