twitch-bot/internal/template/api/textAPI.go
Knut Ahlers 21557a5538
[template] Add textAPI function
Signed-off-by: Knut Ahlers <knut@ahlers.me>
2023-07-15 23:54:22 +02:00

59 lines
1.3 KiB
Go

package api
import (
"bytes"
"context"
"io"
"net/http"
"net/url"
"github.com/pkg/errors"
)
func textAPI(uri string, fallback ...string) (string, error) {
u, err := url.Parse(uri)
if err != nil {
return "", errors.Wrap(err, "parsing URL")
}
reqCtx, cancel := context.WithTimeout(context.Background(), remoteRequestTimeout)
defer cancel()
req, err := http.NewRequestWithContext(reqCtx, http.MethodGet, u.String(), nil)
if err != nil {
return "", errors.Wrap(err, "assembling request")
}
req.Header.Set("User-Agent", "Luzifer/twitch-bot template/api/jsonAPI (https://github.com/Luzifer/twitch-bot)")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return "", errors.Wrap(err, "executing request")
}
defer resp.Body.Close()
switch resp.StatusCode {
case http.StatusOK:
// That's what we wanna see
case http.StatusNoContent:
if len(fallback) > 0 {
return fallback[0], nil
}
return "", errors.Errorf("unexpected HTTP status %d without fallback", resp.StatusCode)
default:
return "", errors.Errorf("unexpected HTTP status %d", resp.StatusCode)
}
content, err := io.ReadAll(resp.Body)
if err != nil {
return "", errors.Wrap(err, "reading response body")
}
if len(bytes.TrimSpace(content)) == 0 && len(fallback) > 0 {
return fallback[0], nil
}
return string(content), nil
}