main
Raw Download raw file
 1package content
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"io"
 7	"net/http"
 8	"os"
 9	"path/filepath"
10	"time"
11)
12
13func NowHex() string {
14	return fmt.Sprintf("%x", time.Now().Unix())
15}
16
17func (item *Item) SnapshotDir() string {
18	return filepath.Join(item.Id.Dir(), "raw", NowHex())
19}
20
21func (item *Item) Fetch() error {
22
23	req, err := http.NewRequest("GET", item.TargetURL.String(), nil)
24	if err != nil {
25		return err
26	}
27	req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0")
28
29	client := &http.Client{
30		Timeout: 10 * time.Second,
31	}
32	resp, err := client.Do(req)
33	if err != nil {
34		return err
35	}
36	defer resp.Body.Close()
37
38	snapshotDir := item.SnapshotDir()
39	err = os.MkdirAll(snapshotDir, _dirMode)
40	if err != nil {
41		return err
42	}
43
44	headersPath := filepath.Join(snapshotDir, "headers.json")
45	headers, err := os.Create(headersPath)
46	if err != nil {
47		return err
48	}
49	err = json.NewEncoder(headers).Encode(resp.Header)
50	if err != nil {
51		return err
52	}
53
54	statusPath := filepath.Join(snapshotDir, "status.txt")
55	status, err := os.Create(statusPath)
56	if err != nil {
57		return err
58	}
59	_, err = status.WriteString(resp.Status)
60	if err != nil {
61		return err
62	}
63
64	if resp.StatusCode != http.StatusOK {
65		// skip writing body
66		fmt.Printf("\tstatus: %s\n", resp.Status)
67		return nil
68	}
69
70	bodyPath := filepath.Join(snapshotDir, "body")
71	body, err := os.Create(bodyPath)
72	if err != nil {
73		return err
74	}
75	_, err = io.Copy(body, resp.Body)
76	if err != nil {
77		return err
78	}
79
80	return nil
81}