url_shortener/internal/lib/api/api.go

35 lines
700 B
Go

package api
import (
"errors"
"fmt"
"net/http"
)
var (
ErrInvalidStatusCode = errors.New("invalid status code")
)
// GetRedirect returns the final URL after redirection.
func GetRedirect(url string) (string, error) {
const op = "api.GetRedirect"
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse // stop after 1st redirect
},
}
resp, err := client.Get(url)
if err != nil {
return "", err
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusFound {
return "", fmt.Errorf("%s: %w: %d", op, ErrInvalidStatusCode, resp.StatusCode)
}
return resp.Header.Get("Location"), nil
}