diff --git a/internal/forgejo/client.go b/internal/forgejo/client.go new file mode 100644 index 00000000..0d904b5a --- /dev/null +++ b/internal/forgejo/client.go @@ -0,0 +1,55 @@ +package forgejo + +import ( + "context" + "encoding/xml" + "fmt" + "io" + "net/http" + + "github.com/AlexGustafsson/cupdate/internal/htmlutil" + "github.com/AlexGustafsson/cupdate/internal/httputil" +) + +type Client struct { + Client httputil.Requester +} + +// GetREADME retrieves the README at url - a repository's main page. +func (c *Client) GetREADME(ctx context.Context, url string) (string, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return "", err + } + + res, err := c.Client.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + + if err := httputil.AssertStatusCode(res, http.StatusOK); err != nil { + return "", err + } + + document, err := io.ReadAll(res.Body) + if err != nil { + return "", err + } + + var document xml.Name + if err := decoder.Decode(&document); err != nil { + return "", err + } + + fmt.Printf("%+v\n", document) + + readme := "" + + cleaned, err := htmlutil.ResolveReferences(readme, req.URL) + if err == nil { + readme = cleaned + } + + return readme, nil +} diff --git a/internal/forgejo/client_test.go b/internal/forgejo/client_test.go new file mode 100644 index 00000000..ea312e9f --- /dev/null +++ b/internal/forgejo/client_test.go @@ -0,0 +1,27 @@ +package forgejo + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/AlexGustafsson/cupdate/internal/cachetest" + "github.com/AlexGustafsson/cupdate/internal/httputil" + "github.com/stretchr/testify/require" +) + +func TestClientGetREADME(t *testing.T) { + if testing.Short() { + t.Skip() + } + + c := &Client{ + Client: httputil.NewClient(cachetest.NewCache(t), 24*time.Hour), + } + + readme, err := c.GetREADME(context.TODO(), "https://codeberg.org/forgejo/forgejo") + require.NoError(t, err) + + fmt.Printf("%s\n", readme) +}