-
Notifications
You must be signed in to change notification settings - Fork 0
/
request.go
139 lines (109 loc) · 3.19 KB
/
request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package UnifiVoucherGenerator
import (
"fmt"
"log/slog"
"net/http"
)
func (c *Client) requestLogin() error {
urlLogin, urlReferer := c.loginUrls()
req, err := http.NewRequest(http.MethodPost, urlLogin, c.Credentials.HttpPayload())
if err != nil {
slog.Error("error creating request login request", "error", err)
return err
}
// Set headers as per the curl command
addBasicHeaders(req)
req.Header.Set("Referer", urlReferer)
body, cookies, err := c.makeRequest(req)
if !loggedIn(body) {
err = fmt.Errorf("login failed")
slog.Error("login failed", "error", err)
return err
}
// todo: move this to another function
f := false
for _, cookie := range cookies {
if cookie.Name == "csrf_token" {
c.token = cookie.Value
f = true
break
}
}
if !f {
// todo: I dont like this, maybe return the error and log it in the calling function
err = fmt.Errorf("csrf_token not found")
slog.Error("csrf_token not found", "error", err)
return err
}
return nil
}
func (c *Client) requestSelf() (string, error) {
urlSelf, urlSelfReferer := c.loginUrls()
req, err := http.NewRequest(http.MethodGet, urlSelf, nil)
if err != nil {
slog.Error("error creating get self request", "error", err)
return "", err
}
// Set headers as per the curl command
addBasicHeaders(req)
req.Header.Set("Referer", urlSelfReferer)
req.Header.Set("X-Csrf-Token", c.token)
body, _, err := c.makeRequest(req)
if err != nil {
slog.Error("error making request", "error", err)
return "", err
}
return body, nil
}
func (c *Client) requestAddVoucher() error {
urlVoucher, urlVoucherReferer := c.addVoucherUrls()
payload := c.Voucher.HttpPayload()
req, err := http.NewRequest(http.MethodPost, urlVoucher, payload)
if err != nil {
slog.Error("error creating add voucher request", "error", err)
return err
}
//TODO: maybe remove the set header for the CSRF header, or update the add basic headers to include the CSRF token
addBasicHeaders(req)
req.Header.Set("Referer", urlVoucherReferer)
req.Header.Set("X-Csrf-Token", c.token)
body, _, err := c.makeRequest(req)
if err != nil {
slog.Error("error making request", "error", err)
return err
}
// todo: maybe rename this function
nv, err := processNewVoucherRequestResponse(body)
if err != nil {
slog.Error("error processing new voucher request response", "error", err)
return err
}
if !nv.successful() {
err = fmt.Errorf("voucher request failed")
slog.Error("voucher request failed", "error", err)
return err
}
return nil
}
func (c *Client) requestFetchPublishedVouchers() (UnifiVouchers, error) {
urlFetchVouchers, urlFetchVouchersReferer := c.fetchVouchersUrl()
req, err := http.NewRequest(http.MethodPost, urlFetchVouchers, nil)
if err != nil {
slog.Error("error creating fetch published vouchers request", "error", err)
return nil, err
}
// Set headers as per the curl command
addBasicHeaders(req)
req.Header.Set("Referer", urlFetchVouchersReferer)
req.Header.Set("X-Csrf-Token", c.token)
body, _, err := c.makeRequest(req)
if err != nil {
slog.Error("error making request", "error", err)
return nil, err
}
vouchers, err := processVoucherListResponse(body)
if err != nil {
return nil, err
}
return vouchers, nil
}