nu-api/curl.go
2023-03-07 18:40:20 +01:00

91 lines
1.9 KiB
Go

package nuapi
import (
"compress/gzip"
"context"
"fmt"
"os/exec"
"git.milar.in/milarin/adverr"
"github.com/PuerkitoBio/goquery"
)
func (api *Api) GetWithCookie(ctx context.Context, url string) (*goquery.Document, error) {
if api.Cookie == "" {
return nil, ErrNoCookieSet.New()
}
curl := exec.CommandContext(ctx, "curl",
"-s", url,
"-H", fmt.Sprintf("User-Agent: %s", api.UserAgent),
"-H", fmt.Sprintf("Cookie: %s", api.Cookie),
"-H", fmt.Sprintf("Accept-Encoding: %s", "gzip"),
)
stdout, err := curl.StdoutPipe()
if err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
defer stdout.Close()
stderr, err := curl.StderrPipe()
if err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
defer stderr.Close()
if err := curl.Start(); err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
go func() {
if err := curl.Wait(); err != nil {
adverr.Println(ErrCurlRequestFailed.Wrap(err, url))
}
}()
r, err := gzip.NewReader(stdout)
if err != nil {
return nil, ErrInvalidGzipData.New(err)
}
return goquery.NewDocumentFromReader(r)
}
func (api *Api) Get(ctx context.Context, url string) (*goquery.Document, error) {
curl := exec.CommandContext(ctx, "curl",
"-s", url,
"-H", fmt.Sprintf("User-Agent: %s", api.UserAgent),
"-H", fmt.Sprintf("Accept-Encoding: %s", "gzip"),
)
stdout, err := curl.StdoutPipe()
if err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
defer stdout.Close()
stderr, err := curl.StderrPipe()
if err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
defer stderr.Close()
if err := curl.Start(); err != nil {
return nil, ErrCurlRequestFailed.Wrap(err, url)
}
go func() {
if err := curl.Wait(); err != nil {
adverr.Println(ErrCurlRequestFailed.Wrap(err, url))
}
}()
r, err := gzip.NewReader(stdout)
if err != nil {
return nil, ErrInvalidGzipData.New(err)
}
return goquery.NewDocumentFromReader(r)
}