Skip to content

Commit b02cba5

Browse files
stainless-app[bot]Stainless Bot
authored and
Stainless Bot
committedNov 6, 2024·
feat(api): api update (#3572)
1 parent 007b781 commit b02cba5

18 files changed

+7722
-84
lines changed
 

‎.stats.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
configured_endpoints: 1361
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/cloudflare%2Fcloudflare-f42cd2aad7c5dc546130b78d1b183a339ff0c666d7b0e98159bdfbf09eecd80d.yml
1+
configured_endpoints: 1397
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/cloudflare%2Fcloudflare-b2ba1107ac358119a40fb6ff04ef71393204afba24220e4b9f1611dcccd85b00.yml

‎api.md

+131-1
Large diffs are not rendered by default.

‎filters/filter.go

+467
Large diffs are not rendered by default.

‎filters/filter_test.go

+163
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package filters_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/filters"
13+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
14+
"github.com/cloudflare/cloudflare-go/v3/option"
15+
)
16+
17+
func TestFilterNew(t *testing.T) {
18+
t.Skip("TODO: investigate broken test")
19+
baseURL := "http://localhost:4010"
20+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
21+
baseURL = envURL
22+
}
23+
if !testutil.CheckTestServer(t, baseURL) {
24+
return
25+
}
26+
client := cloudflare.NewClient(
27+
option.WithBaseURL(baseURL),
28+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
29+
option.WithAPIEmail("user@example.com"),
30+
)
31+
_, err := client.Filters.New(context.TODO(), filters.FilterNewParams{
32+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
33+
Expression: cloudflare.F("(http.request.uri.path ~ \".*wp-login.php\" or http.request.uri.path ~ \".*xmlrpc.php\") and ip.addr ne 172.16.22.155"),
34+
})
35+
if err != nil {
36+
var apierr *cloudflare.Error
37+
if errors.As(err, &apierr) {
38+
t.Log(string(apierr.DumpRequest(true)))
39+
}
40+
t.Fatalf("err should be nil: %s", err.Error())
41+
}
42+
}
43+
44+
func TestFilterUpdate(t *testing.T) {
45+
t.Skip("TODO: investigate broken test")
46+
baseURL := "http://localhost:4010"
47+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
48+
baseURL = envURL
49+
}
50+
if !testutil.CheckTestServer(t, baseURL) {
51+
return
52+
}
53+
client := cloudflare.NewClient(
54+
option.WithBaseURL(baseURL),
55+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
56+
option.WithAPIEmail("user@example.com"),
57+
)
58+
_, err := client.Filters.Update(
59+
context.TODO(),
60+
"372e67954025e0ba6aaa6d586b9e0b61",
61+
filters.FilterUpdateParams{
62+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
63+
Body: map[string]interface{}{},
64+
},
65+
)
66+
if err != nil {
67+
var apierr *cloudflare.Error
68+
if errors.As(err, &apierr) {
69+
t.Log(string(apierr.DumpRequest(true)))
70+
}
71+
t.Fatalf("err should be nil: %s", err.Error())
72+
}
73+
}
74+
75+
func TestFilterListWithOptionalParams(t *testing.T) {
76+
baseURL := "http://localhost:4010"
77+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
78+
baseURL = envURL
79+
}
80+
if !testutil.CheckTestServer(t, baseURL) {
81+
return
82+
}
83+
client := cloudflare.NewClient(
84+
option.WithBaseURL(baseURL),
85+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
86+
option.WithAPIEmail("user@example.com"),
87+
)
88+
_, err := client.Filters.List(context.TODO(), filters.FilterListParams{
89+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
90+
ID: cloudflare.F("372e67954025e0ba6aaa6d586b9e0b61"),
91+
Description: cloudflare.F("browsers"),
92+
Expression: cloudflare.F("php"),
93+
Page: cloudflare.F(1.000000),
94+
Paused: cloudflare.F(false),
95+
PerPage: cloudflare.F(5.000000),
96+
Ref: cloudflare.F("FIL-100"),
97+
})
98+
if err != nil {
99+
var apierr *cloudflare.Error
100+
if errors.As(err, &apierr) {
101+
t.Log(string(apierr.DumpRequest(true)))
102+
}
103+
t.Fatalf("err should be nil: %s", err.Error())
104+
}
105+
}
106+
107+
func TestFilterDelete(t *testing.T) {
108+
baseURL := "http://localhost:4010"
109+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
110+
baseURL = envURL
111+
}
112+
if !testutil.CheckTestServer(t, baseURL) {
113+
return
114+
}
115+
client := cloudflare.NewClient(
116+
option.WithBaseURL(baseURL),
117+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
118+
option.WithAPIEmail("user@example.com"),
119+
)
120+
_, err := client.Filters.Delete(
121+
context.TODO(),
122+
"372e67954025e0ba6aaa6d586b9e0b61",
123+
filters.FilterDeleteParams{
124+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
125+
},
126+
)
127+
if err != nil {
128+
var apierr *cloudflare.Error
129+
if errors.As(err, &apierr) {
130+
t.Log(string(apierr.DumpRequest(true)))
131+
}
132+
t.Fatalf("err should be nil: %s", err.Error())
133+
}
134+
}
135+
136+
func TestFilterGet(t *testing.T) {
137+
baseURL := "http://localhost:4010"
138+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
139+
baseURL = envURL
140+
}
141+
if !testutil.CheckTestServer(t, baseURL) {
142+
return
143+
}
144+
client := cloudflare.NewClient(
145+
option.WithBaseURL(baseURL),
146+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
147+
option.WithAPIEmail("user@example.com"),
148+
)
149+
_, err := client.Filters.Get(
150+
context.TODO(),
151+
"372e67954025e0ba6aaa6d586b9e0b61",
152+
filters.FilterGetParams{
153+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
154+
},
155+
)
156+
if err != nil {
157+
var apierr *cloudflare.Error
158+
if errors.As(err, &apierr) {
159+
t.Log(string(apierr.DumpRequest(true)))
160+
}
161+
t.Fatalf("err should be nil: %s", err.Error())
162+
}
163+
}

‎firewall/accessrule.go

+1,547-81
Large diffs are not rendered by default.

‎firewall/accessrule_test.go

+96
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,99 @@ func TestAccessRuleListWithOptionalParams(t *testing.T) {
8282
t.Fatalf("err should be nil: %s", err.Error())
8383
}
8484
}
85+
86+
func TestAccessRuleDeleteWithOptionalParams(t *testing.T) {
87+
t.Skip("TODO: investigate broken test")
88+
baseURL := "http://localhost:4010"
89+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
90+
baseURL = envURL
91+
}
92+
if !testutil.CheckTestServer(t, baseURL) {
93+
return
94+
}
95+
client := cloudflare.NewClient(
96+
option.WithBaseURL(baseURL),
97+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
98+
option.WithAPIEmail("user@example.com"),
99+
)
100+
_, err := client.Firewall.AccessRules.Delete(
101+
context.TODO(),
102+
"023e105f4ecef8ad9ca31a8372d0c353",
103+
firewall.AccessRuleDeleteParams{
104+
AccountID: cloudflare.F("account_id"),
105+
},
106+
)
107+
if err != nil {
108+
var apierr *cloudflare.Error
109+
if errors.As(err, &apierr) {
110+
t.Log(string(apierr.DumpRequest(true)))
111+
}
112+
t.Fatalf("err should be nil: %s", err.Error())
113+
}
114+
}
115+
116+
func TestAccessRuleEditWithOptionalParams(t *testing.T) {
117+
t.Skip("TODO: investigate broken test")
118+
baseURL := "http://localhost:4010"
119+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
120+
baseURL = envURL
121+
}
122+
if !testutil.CheckTestServer(t, baseURL) {
123+
return
124+
}
125+
client := cloudflare.NewClient(
126+
option.WithBaseURL(baseURL),
127+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
128+
option.WithAPIEmail("user@example.com"),
129+
)
130+
_, err := client.Firewall.AccessRules.Edit(
131+
context.TODO(),
132+
"023e105f4ecef8ad9ca31a8372d0c353",
133+
firewall.AccessRuleEditParams{
134+
Configuration: cloudflare.F[firewall.AccessRuleEditParamsConfigurationUnion](firewall.AccessRuleIPConfigurationParam{
135+
Target: cloudflare.F(firewall.AccessRuleIPConfigurationTargetIP),
136+
Value: cloudflare.F("198.51.100.4"),
137+
}),
138+
Mode: cloudflare.F(firewall.AccessRuleEditParamsModeBlock),
139+
AccountID: cloudflare.F("account_id"),
140+
Notes: cloudflare.F("This rule is enabled because of an event that occurred on date X."),
141+
},
142+
)
143+
if err != nil {
144+
var apierr *cloudflare.Error
145+
if errors.As(err, &apierr) {
146+
t.Log(string(apierr.DumpRequest(true)))
147+
}
148+
t.Fatalf("err should be nil: %s", err.Error())
149+
}
150+
}
151+
152+
func TestAccessRuleGetWithOptionalParams(t *testing.T) {
153+
t.Skip("TODO: investigate broken test")
154+
baseURL := "http://localhost:4010"
155+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
156+
baseURL = envURL
157+
}
158+
if !testutil.CheckTestServer(t, baseURL) {
159+
return
160+
}
161+
client := cloudflare.NewClient(
162+
option.WithBaseURL(baseURL),
163+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
164+
option.WithAPIEmail("user@example.com"),
165+
)
166+
_, err := client.Firewall.AccessRules.Get(
167+
context.TODO(),
168+
"023e105f4ecef8ad9ca31a8372d0c353",
169+
firewall.AccessRuleGetParams{
170+
AccountID: cloudflare.F("account_id"),
171+
},
172+
)
173+
if err != nil {
174+
var apierr *cloudflare.Error
175+
if errors.As(err, &apierr) {
176+
t.Log(string(apierr.DumpRequest(true)))
177+
}
178+
t.Fatalf("err should be nil: %s", err.Error())
179+
}
180+
}

‎firewall/lockdown.go

+655
Large diffs are not rendered by default.

‎firewall/lockdown_test.go

+176
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package firewall_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
"time"
11+
12+
"github.com/cloudflare/cloudflare-go/v3"
13+
"github.com/cloudflare/cloudflare-go/v3/firewall"
14+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
15+
"github.com/cloudflare/cloudflare-go/v3/option"
16+
)
17+
18+
func TestLockdownNewWithOptionalParams(t *testing.T) {
19+
t.Skip("TODO: investigate broken test")
20+
baseURL := "http://localhost:4010"
21+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
22+
baseURL = envURL
23+
}
24+
if !testutil.CheckTestServer(t, baseURL) {
25+
return
26+
}
27+
client := cloudflare.NewClient(
28+
option.WithBaseURL(baseURL),
29+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
30+
option.WithAPIEmail("user@example.com"),
31+
)
32+
_, err := client.Firewall.Lockdowns.New(context.TODO(), firewall.LockdownNewParams{
33+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
34+
Configurations: cloudflare.F[firewall.ConfigurationUnionParam](firewall.LockdownIPConfigurationParam{
35+
Target: cloudflare.F(firewall.LockdownIPConfigurationTargetIP),
36+
Value: cloudflare.F("198.51.100.4"),
37+
}),
38+
URLs: cloudflare.F([]firewall.OverrideURLParam{"shop.example.com/*", "shop.example.com/*", "shop.example.com/*"}),
39+
})
40+
if err != nil {
41+
var apierr *cloudflare.Error
42+
if errors.As(err, &apierr) {
43+
t.Log(string(apierr.DumpRequest(true)))
44+
}
45+
t.Fatalf("err should be nil: %s", err.Error())
46+
}
47+
}
48+
49+
func TestLockdownUpdateWithOptionalParams(t *testing.T) {
50+
t.Skip("TODO: investigate broken test")
51+
baseURL := "http://localhost:4010"
52+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
53+
baseURL = envURL
54+
}
55+
if !testutil.CheckTestServer(t, baseURL) {
56+
return
57+
}
58+
client := cloudflare.NewClient(
59+
option.WithBaseURL(baseURL),
60+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
61+
option.WithAPIEmail("user@example.com"),
62+
)
63+
_, err := client.Firewall.Lockdowns.Update(
64+
context.TODO(),
65+
"372e67954025e0ba6aaa6d586b9e0b59",
66+
firewall.LockdownUpdateParams{
67+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
68+
Configurations: cloudflare.F[firewall.ConfigurationUnionParam](firewall.LockdownIPConfigurationParam{
69+
Target: cloudflare.F(firewall.LockdownIPConfigurationTargetIP),
70+
Value: cloudflare.F("198.51.100.4"),
71+
}),
72+
URLs: cloudflare.F([]firewall.OverrideURLParam{"shop.example.com/*", "shop.example.com/*", "shop.example.com/*"}),
73+
},
74+
)
75+
if err != nil {
76+
var apierr *cloudflare.Error
77+
if errors.As(err, &apierr) {
78+
t.Log(string(apierr.DumpRequest(true)))
79+
}
80+
t.Fatalf("err should be nil: %s", err.Error())
81+
}
82+
}
83+
84+
func TestLockdownListWithOptionalParams(t *testing.T) {
85+
baseURL := "http://localhost:4010"
86+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
87+
baseURL = envURL
88+
}
89+
if !testutil.CheckTestServer(t, baseURL) {
90+
return
91+
}
92+
client := cloudflare.NewClient(
93+
option.WithBaseURL(baseURL),
94+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
95+
option.WithAPIEmail("user@example.com"),
96+
)
97+
_, err := client.Firewall.Lockdowns.List(context.TODO(), firewall.LockdownListParams{
98+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
99+
CreatedOn: cloudflare.F(time.Now()),
100+
Description: cloudflare.F("endpoints"),
101+
DescriptionSearch: cloudflare.F("endpoints"),
102+
IP: cloudflare.F("1.2.3.4"),
103+
IPRangeSearch: cloudflare.F("1.2.3.0/16"),
104+
IPSearch: cloudflare.F("1.2.3.4"),
105+
ModifiedOn: cloudflare.F(time.Now()),
106+
Page: cloudflare.F(1.000000),
107+
PerPage: cloudflare.F(1.000000),
108+
Priority: cloudflare.F(5.000000),
109+
URISearch: cloudflare.F("/some/path"),
110+
})
111+
if err != nil {
112+
var apierr *cloudflare.Error
113+
if errors.As(err, &apierr) {
114+
t.Log(string(apierr.DumpRequest(true)))
115+
}
116+
t.Fatalf("err should be nil: %s", err.Error())
117+
}
118+
}
119+
120+
func TestLockdownDelete(t *testing.T) {
121+
baseURL := "http://localhost:4010"
122+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
123+
baseURL = envURL
124+
}
125+
if !testutil.CheckTestServer(t, baseURL) {
126+
return
127+
}
128+
client := cloudflare.NewClient(
129+
option.WithBaseURL(baseURL),
130+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
131+
option.WithAPIEmail("user@example.com"),
132+
)
133+
_, err := client.Firewall.Lockdowns.Delete(
134+
context.TODO(),
135+
"372e67954025e0ba6aaa6d586b9e0b59",
136+
firewall.LockdownDeleteParams{
137+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
138+
},
139+
)
140+
if err != nil {
141+
var apierr *cloudflare.Error
142+
if errors.As(err, &apierr) {
143+
t.Log(string(apierr.DumpRequest(true)))
144+
}
145+
t.Fatalf("err should be nil: %s", err.Error())
146+
}
147+
}
148+
149+
func TestLockdownGet(t *testing.T) {
150+
baseURL := "http://localhost:4010"
151+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
152+
baseURL = envURL
153+
}
154+
if !testutil.CheckTestServer(t, baseURL) {
155+
return
156+
}
157+
client := cloudflare.NewClient(
158+
option.WithBaseURL(baseURL),
159+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
160+
option.WithAPIEmail("user@example.com"),
161+
)
162+
_, err := client.Firewall.Lockdowns.Get(
163+
context.TODO(),
164+
"372e67954025e0ba6aaa6d586b9e0b59",
165+
firewall.LockdownGetParams{
166+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
167+
},
168+
)
169+
if err != nil {
170+
var apierr *cloudflare.Error
171+
if errors.As(err, &apierr) {
172+
t.Log(string(apierr.DumpRequest(true)))
173+
}
174+
t.Fatalf("err should be nil: %s", err.Error())
175+
}
176+
}

‎firewall/rule.go

+827
Large diffs are not rendered by default.

‎firewall/rule_test.go

+220
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package firewall_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/filters"
13+
"github.com/cloudflare/cloudflare-go/v3/firewall"
14+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
15+
"github.com/cloudflare/cloudflare-go/v3/option"
16+
)
17+
18+
func TestRuleNewWithOptionalParams(t *testing.T) {
19+
t.Skip("TODO: investigate broken test")
20+
baseURL := "http://localhost:4010"
21+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
22+
baseURL = envURL
23+
}
24+
if !testutil.CheckTestServer(t, baseURL) {
25+
return
26+
}
27+
client := cloudflare.NewClient(
28+
option.WithBaseURL(baseURL),
29+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
30+
option.WithAPIEmail("user@example.com"),
31+
)
32+
_, err := client.Firewall.Rules.New(context.TODO(), firewall.RuleNewParams{
33+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
34+
Action: cloudflare.F(firewall.RuleNewParamsAction{
35+
Mode: cloudflare.F(firewall.RuleNewParamsActionModeSimulate),
36+
Response: cloudflare.F(firewall.RuleNewParamsActionResponse{
37+
Body: cloudflare.F("<error>This request has been rate-limited.</error>"),
38+
ContentType: cloudflare.F("text/xml"),
39+
}),
40+
Timeout: cloudflare.F(86400.000000),
41+
}),
42+
Filter: cloudflare.F(filters.FirewallFilterParam{
43+
Description: cloudflare.F("Restrict access from these browsers on this address range."),
44+
Expression: cloudflare.F("(http.request.uri.path ~ \".*wp-login.php\" or http.request.uri.path ~ \".*xmlrpc.php\") and ip.addr ne 172.16.22.155"),
45+
Paused: cloudflare.F(false),
46+
Ref: cloudflare.F("FIL-100"),
47+
}),
48+
})
49+
if err != nil {
50+
var apierr *cloudflare.Error
51+
if errors.As(err, &apierr) {
52+
t.Log(string(apierr.DumpRequest(true)))
53+
}
54+
t.Fatalf("err should be nil: %s", err.Error())
55+
}
56+
}
57+
58+
func TestRuleUpdateWithOptionalParams(t *testing.T) {
59+
t.Skip("TODO: investigate broken test")
60+
baseURL := "http://localhost:4010"
61+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
62+
baseURL = envURL
63+
}
64+
if !testutil.CheckTestServer(t, baseURL) {
65+
return
66+
}
67+
client := cloudflare.NewClient(
68+
option.WithBaseURL(baseURL),
69+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
70+
option.WithAPIEmail("user@example.com"),
71+
)
72+
_, err := client.Firewall.Rules.Update(
73+
context.TODO(),
74+
"372e67954025e0ba6aaa6d586b9e0b60",
75+
firewall.RuleUpdateParams{
76+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
77+
Action: cloudflare.F(firewall.RuleUpdateParamsAction{
78+
Mode: cloudflare.F(firewall.RuleUpdateParamsActionModeSimulate),
79+
Response: cloudflare.F(firewall.RuleUpdateParamsActionResponse{
80+
Body: cloudflare.F("<error>This request has been rate-limited.</error>"),
81+
ContentType: cloudflare.F("text/xml"),
82+
}),
83+
Timeout: cloudflare.F(86400.000000),
84+
}),
85+
Filter: cloudflare.F(filters.FirewallFilterParam{
86+
Description: cloudflare.F("Restrict access from these browsers on this address range."),
87+
Expression: cloudflare.F("(http.request.uri.path ~ \".*wp-login.php\" or http.request.uri.path ~ \".*xmlrpc.php\") and ip.addr ne 172.16.22.155"),
88+
Paused: cloudflare.F(false),
89+
Ref: cloudflare.F("FIL-100"),
90+
}),
91+
},
92+
)
93+
if err != nil {
94+
var apierr *cloudflare.Error
95+
if errors.As(err, &apierr) {
96+
t.Log(string(apierr.DumpRequest(true)))
97+
}
98+
t.Fatalf("err should be nil: %s", err.Error())
99+
}
100+
}
101+
102+
func TestRuleListWithOptionalParams(t *testing.T) {
103+
baseURL := "http://localhost:4010"
104+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
105+
baseURL = envURL
106+
}
107+
if !testutil.CheckTestServer(t, baseURL) {
108+
return
109+
}
110+
client := cloudflare.NewClient(
111+
option.WithBaseURL(baseURL),
112+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
113+
option.WithAPIEmail("user@example.com"),
114+
)
115+
_, err := client.Firewall.Rules.List(context.TODO(), firewall.RuleListParams{
116+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
117+
ID: cloudflare.F("372e67954025e0ba6aaa6d586b9e0b60"),
118+
Action: cloudflare.F("block"),
119+
Description: cloudflare.F("mir"),
120+
Page: cloudflare.F(1.000000),
121+
Paused: cloudflare.F(false),
122+
PerPage: cloudflare.F(5.000000),
123+
})
124+
if err != nil {
125+
var apierr *cloudflare.Error
126+
if errors.As(err, &apierr) {
127+
t.Log(string(apierr.DumpRequest(true)))
128+
}
129+
t.Fatalf("err should be nil: %s", err.Error())
130+
}
131+
}
132+
133+
func TestRuleDelete(t *testing.T) {
134+
baseURL := "http://localhost:4010"
135+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
136+
baseURL = envURL
137+
}
138+
if !testutil.CheckTestServer(t, baseURL) {
139+
return
140+
}
141+
client := cloudflare.NewClient(
142+
option.WithBaseURL(baseURL),
143+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
144+
option.WithAPIEmail("user@example.com"),
145+
)
146+
_, err := client.Firewall.Rules.Delete(
147+
context.TODO(),
148+
"372e67954025e0ba6aaa6d586b9e0b60",
149+
firewall.RuleDeleteParams{
150+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
151+
},
152+
)
153+
if err != nil {
154+
var apierr *cloudflare.Error
155+
if errors.As(err, &apierr) {
156+
t.Log(string(apierr.DumpRequest(true)))
157+
}
158+
t.Fatalf("err should be nil: %s", err.Error())
159+
}
160+
}
161+
162+
func TestRuleEdit(t *testing.T) {
163+
t.Skip("TODO: investigate broken test")
164+
baseURL := "http://localhost:4010"
165+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
166+
baseURL = envURL
167+
}
168+
if !testutil.CheckTestServer(t, baseURL) {
169+
return
170+
}
171+
client := cloudflare.NewClient(
172+
option.WithBaseURL(baseURL),
173+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
174+
option.WithAPIEmail("user@example.com"),
175+
)
176+
_, err := client.Firewall.Rules.Edit(
177+
context.TODO(),
178+
"372e67954025e0ba6aaa6d586b9e0b60",
179+
firewall.RuleEditParams{
180+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
181+
},
182+
)
183+
if err != nil {
184+
var apierr *cloudflare.Error
185+
if errors.As(err, &apierr) {
186+
t.Log(string(apierr.DumpRequest(true)))
187+
}
188+
t.Fatalf("err should be nil: %s", err.Error())
189+
}
190+
}
191+
192+
func TestRuleGetWithOptionalParams(t *testing.T) {
193+
baseURL := "http://localhost:4010"
194+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
195+
baseURL = envURL
196+
}
197+
if !testutil.CheckTestServer(t, baseURL) {
198+
return
199+
}
200+
client := cloudflare.NewClient(
201+
option.WithBaseURL(baseURL),
202+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
203+
option.WithAPIEmail("user@example.com"),
204+
)
205+
_, err := client.Firewall.Rules.Get(
206+
context.TODO(),
207+
"372e67954025e0ba6aaa6d586b9e0b60",
208+
firewall.RuleGetParams{
209+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
210+
ID: cloudflare.F("372e67954025e0ba6aaa6d586b9e0b60"),
211+
},
212+
)
213+
if err != nil {
214+
var apierr *cloudflare.Error
215+
if errors.As(err, &apierr) {
216+
t.Log(string(apierr.DumpRequest(true)))
217+
}
218+
t.Fatalf("err should be nil: %s", err.Error())
219+
}
220+
}

‎firewall/uarule.go

+585
Large diffs are not rendered by default.

‎firewall/uarule_test.go

+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package firewall_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/firewall"
13+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
14+
"github.com/cloudflare/cloudflare-go/v3/option"
15+
)
16+
17+
func TestUARuleNewWithOptionalParams(t *testing.T) {
18+
t.Skip("TODO: investigate broken test")
19+
baseURL := "http://localhost:4010"
20+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
21+
baseURL = envURL
22+
}
23+
if !testutil.CheckTestServer(t, baseURL) {
24+
return
25+
}
26+
client := cloudflare.NewClient(
27+
option.WithBaseURL(baseURL),
28+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
29+
option.WithAPIEmail("user@example.com"),
30+
)
31+
_, err := client.Firewall.UARules.New(context.TODO(), firewall.UARuleNewParams{
32+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
33+
Configuration: cloudflare.F[firewall.UARuleNewParamsConfigurationUnion](firewall.AccessRuleIPConfigurationParam{
34+
Target: cloudflare.F(firewall.AccessRuleIPConfigurationTargetIP),
35+
Value: cloudflare.F("198.51.100.4"),
36+
}),
37+
Mode: cloudflare.F(firewall.UARuleNewParamsModeBlock),
38+
})
39+
if err != nil {
40+
var apierr *cloudflare.Error
41+
if errors.As(err, &apierr) {
42+
t.Log(string(apierr.DumpRequest(true)))
43+
}
44+
t.Fatalf("err should be nil: %s", err.Error())
45+
}
46+
}
47+
48+
func TestUARuleUpdateWithOptionalParams(t *testing.T) {
49+
t.Skip("TODO: investigate broken test")
50+
baseURL := "http://localhost:4010"
51+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
52+
baseURL = envURL
53+
}
54+
if !testutil.CheckTestServer(t, baseURL) {
55+
return
56+
}
57+
client := cloudflare.NewClient(
58+
option.WithBaseURL(baseURL),
59+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
60+
option.WithAPIEmail("user@example.com"),
61+
)
62+
_, err := client.Firewall.UARules.Update(
63+
context.TODO(),
64+
"372e67954025e0ba6aaa6d586b9e0b59",
65+
firewall.UARuleUpdateParams{
66+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
67+
Configuration: cloudflare.F[firewall.UARuleUpdateParamsConfigurationUnion](firewall.AccessRuleIPConfigurationParam{
68+
Target: cloudflare.F(firewall.AccessRuleIPConfigurationTargetIP),
69+
Value: cloudflare.F("198.51.100.4"),
70+
}),
71+
Mode: cloudflare.F(firewall.UARuleUpdateParamsModeBlock),
72+
},
73+
)
74+
if err != nil {
75+
var apierr *cloudflare.Error
76+
if errors.As(err, &apierr) {
77+
t.Log(string(apierr.DumpRequest(true)))
78+
}
79+
t.Fatalf("err should be nil: %s", err.Error())
80+
}
81+
}
82+
83+
func TestUARuleListWithOptionalParams(t *testing.T) {
84+
baseURL := "http://localhost:4010"
85+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
86+
baseURL = envURL
87+
}
88+
if !testutil.CheckTestServer(t, baseURL) {
89+
return
90+
}
91+
client := cloudflare.NewClient(
92+
option.WithBaseURL(baseURL),
93+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
94+
option.WithAPIEmail("user@example.com"),
95+
)
96+
_, err := client.Firewall.UARules.List(context.TODO(), firewall.UARuleListParams{
97+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
98+
Description: cloudflare.F("abusive"),
99+
DescriptionSearch: cloudflare.F("abusive"),
100+
Page: cloudflare.F(1.000000),
101+
PerPage: cloudflare.F(1.000000),
102+
UASearch: cloudflare.F("Safari"),
103+
})
104+
if err != nil {
105+
var apierr *cloudflare.Error
106+
if errors.As(err, &apierr) {
107+
t.Log(string(apierr.DumpRequest(true)))
108+
}
109+
t.Fatalf("err should be nil: %s", err.Error())
110+
}
111+
}
112+
113+
func TestUARuleDelete(t *testing.T) {
114+
baseURL := "http://localhost:4010"
115+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
116+
baseURL = envURL
117+
}
118+
if !testutil.CheckTestServer(t, baseURL) {
119+
return
120+
}
121+
client := cloudflare.NewClient(
122+
option.WithBaseURL(baseURL),
123+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
124+
option.WithAPIEmail("user@example.com"),
125+
)
126+
_, err := client.Firewall.UARules.Delete(
127+
context.TODO(),
128+
"372e67954025e0ba6aaa6d586b9e0b59",
129+
firewall.UARuleDeleteParams{
130+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
131+
},
132+
)
133+
if err != nil {
134+
var apierr *cloudflare.Error
135+
if errors.As(err, &apierr) {
136+
t.Log(string(apierr.DumpRequest(true)))
137+
}
138+
t.Fatalf("err should be nil: %s", err.Error())
139+
}
140+
}
141+
142+
func TestUARuleGet(t *testing.T) {
143+
baseURL := "http://localhost:4010"
144+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
145+
baseURL = envURL
146+
}
147+
if !testutil.CheckTestServer(t, baseURL) {
148+
return
149+
}
150+
client := cloudflare.NewClient(
151+
option.WithBaseURL(baseURL),
152+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
153+
option.WithAPIEmail("user@example.com"),
154+
)
155+
_, err := client.Firewall.UARules.Get(
156+
context.TODO(),
157+
"372e67954025e0ba6aaa6d586b9e0b59",
158+
firewall.UARuleGetParams{
159+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
160+
},
161+
)
162+
if err != nil {
163+
var apierr *cloudflare.Error
164+
if errors.As(err, &apierr) {
165+
t.Log(string(apierr.DumpRequest(true)))
166+
}
167+
t.Fatalf("err should be nil: %s", err.Error())
168+
}
169+
}

‎firewall/wafoverride.go

+604
Large diffs are not rendered by default.

‎firewall/wafoverride_test.go

+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package firewall_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/firewall"
13+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
14+
"github.com/cloudflare/cloudflare-go/v3/option"
15+
)
16+
17+
func TestWAFOverrideNew(t *testing.T) {
18+
t.Skip("TODO: investigate broken test")
19+
baseURL := "http://localhost:4010"
20+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
21+
baseURL = envURL
22+
}
23+
if !testutil.CheckTestServer(t, baseURL) {
24+
return
25+
}
26+
client := cloudflare.NewClient(
27+
option.WithBaseURL(baseURL),
28+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
29+
option.WithAPIEmail("user@example.com"),
30+
)
31+
_, err := client.Firewall.WAF.Overrides.New(context.TODO(), firewall.WAFOverrideNewParams{
32+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
33+
URLs: cloudflare.F([]firewall.OverrideURLParam{"shop.example.com/*", "shop.example.com/*", "shop.example.com/*"}),
34+
})
35+
if err != nil {
36+
var apierr *cloudflare.Error
37+
if errors.As(err, &apierr) {
38+
t.Log(string(apierr.DumpRequest(true)))
39+
}
40+
t.Fatalf("err should be nil: %s", err.Error())
41+
}
42+
}
43+
44+
func TestWAFOverrideUpdateWithOptionalParams(t *testing.T) {
45+
t.Skip("TODO: investigate broken test")
46+
baseURL := "http://localhost:4010"
47+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
48+
baseURL = envURL
49+
}
50+
if !testutil.CheckTestServer(t, baseURL) {
51+
return
52+
}
53+
client := cloudflare.NewClient(
54+
option.WithBaseURL(baseURL),
55+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
56+
option.WithAPIEmail("user@example.com"),
57+
)
58+
_, err := client.Firewall.WAF.Overrides.Update(
59+
context.TODO(),
60+
"de677e5818985db1285d0e80225f06e5",
61+
firewall.WAFOverrideUpdateParams{
62+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
63+
ID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
64+
RewriteAction: cloudflare.F(firewall.RewriteActionParam{
65+
Block: cloudflare.F(firewall.RewriteActionBlockChallenge),
66+
Challenge: cloudflare.F(firewall.RewriteActionChallengeChallenge),
67+
Default: cloudflare.F(firewall.RewriteActionDefaultChallenge),
68+
Disable: cloudflare.F(firewall.RewriteActionDisableChallenge),
69+
Simulate: cloudflare.F(firewall.RewriteActionSimulateChallenge),
70+
}),
71+
Rules: cloudflare.F(firewall.WAFRuleParam{
72+
"100015": firewall.WAFRuleItemChallenge,
73+
}),
74+
URLs: cloudflare.F([]firewall.OverrideURLParam{"shop.example.com/*", "shop.example.com/*", "shop.example.com/*"}),
75+
},
76+
)
77+
if err != nil {
78+
var apierr *cloudflare.Error
79+
if errors.As(err, &apierr) {
80+
t.Log(string(apierr.DumpRequest(true)))
81+
}
82+
t.Fatalf("err should be nil: %s", err.Error())
83+
}
84+
}
85+
86+
func TestWAFOverrideListWithOptionalParams(t *testing.T) {
87+
baseURL := "http://localhost:4010"
88+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
89+
baseURL = envURL
90+
}
91+
if !testutil.CheckTestServer(t, baseURL) {
92+
return
93+
}
94+
client := cloudflare.NewClient(
95+
option.WithBaseURL(baseURL),
96+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
97+
option.WithAPIEmail("user@example.com"),
98+
)
99+
_, err := client.Firewall.WAF.Overrides.List(context.TODO(), firewall.WAFOverrideListParams{
100+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
101+
Page: cloudflare.F(1.000000),
102+
PerPage: cloudflare.F(5.000000),
103+
})
104+
if err != nil {
105+
var apierr *cloudflare.Error
106+
if errors.As(err, &apierr) {
107+
t.Log(string(apierr.DumpRequest(true)))
108+
}
109+
t.Fatalf("err should be nil: %s", err.Error())
110+
}
111+
}
112+
113+
func TestWAFOverrideDelete(t *testing.T) {
114+
baseURL := "http://localhost:4010"
115+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
116+
baseURL = envURL
117+
}
118+
if !testutil.CheckTestServer(t, baseURL) {
119+
return
120+
}
121+
client := cloudflare.NewClient(
122+
option.WithBaseURL(baseURL),
123+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
124+
option.WithAPIEmail("user@example.com"),
125+
)
126+
_, err := client.Firewall.WAF.Overrides.Delete(
127+
context.TODO(),
128+
"de677e5818985db1285d0e80225f06e5",
129+
firewall.WAFOverrideDeleteParams{
130+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
131+
},
132+
)
133+
if err != nil {
134+
var apierr *cloudflare.Error
135+
if errors.As(err, &apierr) {
136+
t.Log(string(apierr.DumpRequest(true)))
137+
}
138+
t.Fatalf("err should be nil: %s", err.Error())
139+
}
140+
}
141+
142+
func TestWAFOverrideGet(t *testing.T) {
143+
baseURL := "http://localhost:4010"
144+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
145+
baseURL = envURL
146+
}
147+
if !testutil.CheckTestServer(t, baseURL) {
148+
return
149+
}
150+
client := cloudflare.NewClient(
151+
option.WithBaseURL(baseURL),
152+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
153+
option.WithAPIEmail("user@example.com"),
154+
)
155+
_, err := client.Firewall.WAF.Overrides.Get(
156+
context.TODO(),
157+
"de677e5818985db1285d0e80225f06e5",
158+
firewall.WAFOverrideGetParams{
159+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
160+
},
161+
)
162+
if err != nil {
163+
var apierr *cloudflare.Error
164+
if errors.As(err, &apierr) {
165+
t.Log(string(apierr.DumpRequest(true)))
166+
}
167+
t.Fatalf("err should be nil: %s", err.Error())
168+
}
169+
}

‎firewall/wafpackage.go

+298
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,21 @@
33
package firewall
44

55
import (
6+
"context"
7+
"errors"
8+
"fmt"
9+
"net/http"
10+
"net/url"
11+
"reflect"
12+
13+
"github.com/cloudflare/cloudflare-go/v3/internal/apijson"
14+
"github.com/cloudflare/cloudflare-go/v3/internal/apiquery"
15+
"github.com/cloudflare/cloudflare-go/v3/internal/param"
16+
"github.com/cloudflare/cloudflare-go/v3/internal/requestconfig"
617
"github.com/cloudflare/cloudflare-go/v3/option"
18+
"github.com/cloudflare/cloudflare-go/v3/packages/pagination"
19+
"github.com/cloudflare/cloudflare-go/v3/shared"
20+
"github.com/tidwall/gjson"
721
)
822

923
// WAFPackageService contains methods and other services that help with interacting
@@ -28,3 +42,287 @@ func NewWAFPackageService(opts ...option.RequestOption) (r *WAFPackageService) {
2842
r.Rules = NewWAFPackageRuleService(opts...)
2943
return
3044
}
45+
46+
// Fetches WAF packages for a zone.
47+
//
48+
// **Note:** Applies only to the
49+
// [previous version of WAF managed rules](https://developers.cloudflare.com/support/firewall/managed-rules-web-application-firewall-waf/understanding-waf-managed-rules-web-application-firewall/).
50+
func (r *WAFPackageService) List(ctx context.Context, params WAFPackageListParams, opts ...option.RequestOption) (res *pagination.V4PagePaginationArray[WAFPackageListResponse], err error) {
51+
var raw *http.Response
52+
opts = append(r.Options[:], opts...)
53+
opts = append([]option.RequestOption{option.WithResponseInto(&raw)}, opts...)
54+
if params.ZoneID.Value == "" {
55+
err = errors.New("missing required zone_id parameter")
56+
return
57+
}
58+
path := fmt.Sprintf("zones/%s/firewall/waf/packages", params.ZoneID)
59+
cfg, err := requestconfig.NewRequestConfig(ctx, http.MethodGet, path, params, &res, opts...)
60+
if err != nil {
61+
return nil, err
62+
}
63+
err = cfg.Execute()
64+
if err != nil {
65+
return nil, err
66+
}
67+
res.SetPageConfig(cfg, raw)
68+
return res, nil
69+
}
70+
71+
// Fetches WAF packages for a zone.
72+
//
73+
// **Note:** Applies only to the
74+
// [previous version of WAF managed rules](https://developers.cloudflare.com/support/firewall/managed-rules-web-application-firewall-waf/understanding-waf-managed-rules-web-application-firewall/).
75+
func (r *WAFPackageService) ListAutoPaging(ctx context.Context, params WAFPackageListParams, opts ...option.RequestOption) *pagination.V4PagePaginationArrayAutoPager[WAFPackageListResponse] {
76+
return pagination.NewV4PagePaginationArrayAutoPager(r.List(ctx, params, opts...))
77+
}
78+
79+
// Fetches the details of a WAF package.
80+
//
81+
// **Note:** Applies only to the
82+
// [previous version of WAF managed rules](https://developers.cloudflare.com/support/firewall/managed-rules-web-application-firewall-waf/understanding-waf-managed-rules-web-application-firewall/).
83+
func (r *WAFPackageService) Get(ctx context.Context, packageID string, query WAFPackageGetParams, opts ...option.RequestOption) (res *WAFPackageGetResponse, err error) {
84+
opts = append(r.Options[:], opts...)
85+
if query.ZoneID.Value == "" {
86+
err = errors.New("missing required zone_id parameter")
87+
return
88+
}
89+
if packageID == "" {
90+
err = errors.New("missing required package_id parameter")
91+
return
92+
}
93+
path := fmt.Sprintf("zones/%s/firewall/waf/packages/%s", query.ZoneID, packageID)
94+
err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...)
95+
return
96+
}
97+
98+
type WAFPackageListResponse = interface{}
99+
100+
type WAFPackageGetResponse struct {
101+
// This field can have the runtime type of [[]shared.ResponseInfo].
102+
Errors interface{} `json:"errors,required"`
103+
// This field can have the runtime type of [[]shared.ResponseInfo].
104+
Messages interface{} `json:"messages,required"`
105+
// This field can have the runtime type of [interface{}].
106+
Result interface{} `json:"result,required"`
107+
// Whether the API call was successful
108+
Success WAFPackageGetResponseSuccess `json:"success"`
109+
JSON wafPackageGetResponseJSON `json:"-"`
110+
union WAFPackageGetResponseUnion
111+
}
112+
113+
// wafPackageGetResponseJSON contains the JSON metadata for the struct
114+
// [WAFPackageGetResponse]
115+
type wafPackageGetResponseJSON struct {
116+
Errors apijson.Field
117+
Messages apijson.Field
118+
Result apijson.Field
119+
Success apijson.Field
120+
raw string
121+
ExtraFields map[string]apijson.Field
122+
}
123+
124+
func (r wafPackageGetResponseJSON) RawJSON() string {
125+
return r.raw
126+
}
127+
128+
func (r *WAFPackageGetResponse) UnmarshalJSON(data []byte) (err error) {
129+
*r = WAFPackageGetResponse{}
130+
err = apijson.UnmarshalRoot(data, &r.union)
131+
if err != nil {
132+
return err
133+
}
134+
return apijson.Port(r.union, &r)
135+
}
136+
137+
// AsUnion returns a [WAFPackageGetResponseUnion] interface which you can cast to
138+
// the specific types for more type safety.
139+
//
140+
// Possible runtime types of the union are
141+
// [firewall.WAFPackageGetResponseFirewallAPIResponseSingle],
142+
// [firewall.WAFPackageGetResponseResult].
143+
func (r WAFPackageGetResponse) AsUnion() WAFPackageGetResponseUnion {
144+
return r.union
145+
}
146+
147+
// Union satisfied by [firewall.WAFPackageGetResponseFirewallAPIResponseSingle] or
148+
// [firewall.WAFPackageGetResponseResult].
149+
type WAFPackageGetResponseUnion interface {
150+
implementsFirewallWAFPackageGetResponse()
151+
}
152+
153+
func init() {
154+
apijson.RegisterUnion(
155+
reflect.TypeOf((*WAFPackageGetResponseUnion)(nil)).Elem(),
156+
"",
157+
apijson.UnionVariant{
158+
TypeFilter: gjson.JSON,
159+
Type: reflect.TypeOf(WAFPackageGetResponseFirewallAPIResponseSingle{}),
160+
},
161+
apijson.UnionVariant{
162+
TypeFilter: gjson.JSON,
163+
Type: reflect.TypeOf(WAFPackageGetResponseResult{}),
164+
},
165+
)
166+
}
167+
168+
type WAFPackageGetResponseFirewallAPIResponseSingle struct {
169+
Errors []shared.ResponseInfo `json:"errors,required"`
170+
Messages []shared.ResponseInfo `json:"messages,required"`
171+
Result interface{} `json:"result,required"`
172+
// Whether the API call was successful
173+
Success WAFPackageGetResponseFirewallAPIResponseSingleSuccess `json:"success,required"`
174+
JSON wafPackageGetResponseFirewallAPIResponseSingleJSON `json:"-"`
175+
}
176+
177+
// wafPackageGetResponseFirewallAPIResponseSingleJSON contains the JSON metadata
178+
// for the struct [WAFPackageGetResponseFirewallAPIResponseSingle]
179+
type wafPackageGetResponseFirewallAPIResponseSingleJSON struct {
180+
Errors apijson.Field
181+
Messages apijson.Field
182+
Result apijson.Field
183+
Success apijson.Field
184+
raw string
185+
ExtraFields map[string]apijson.Field
186+
}
187+
188+
func (r *WAFPackageGetResponseFirewallAPIResponseSingle) UnmarshalJSON(data []byte) (err error) {
189+
return apijson.UnmarshalRoot(data, r)
190+
}
191+
192+
func (r wafPackageGetResponseFirewallAPIResponseSingleJSON) RawJSON() string {
193+
return r.raw
194+
}
195+
196+
func (r WAFPackageGetResponseFirewallAPIResponseSingle) implementsFirewallWAFPackageGetResponse() {}
197+
198+
// Whether the API call was successful
199+
type WAFPackageGetResponseFirewallAPIResponseSingleSuccess bool
200+
201+
const (
202+
WAFPackageGetResponseFirewallAPIResponseSingleSuccessTrue WAFPackageGetResponseFirewallAPIResponseSingleSuccess = true
203+
)
204+
205+
func (r WAFPackageGetResponseFirewallAPIResponseSingleSuccess) IsKnown() bool {
206+
switch r {
207+
case WAFPackageGetResponseFirewallAPIResponseSingleSuccessTrue:
208+
return true
209+
}
210+
return false
211+
}
212+
213+
type WAFPackageGetResponseResult struct {
214+
Result interface{} `json:"result"`
215+
JSON wafPackageGetResponseResultJSON `json:"-"`
216+
}
217+
218+
// wafPackageGetResponseResultJSON contains the JSON metadata for the struct
219+
// [WAFPackageGetResponseResult]
220+
type wafPackageGetResponseResultJSON struct {
221+
Result apijson.Field
222+
raw string
223+
ExtraFields map[string]apijson.Field
224+
}
225+
226+
func (r *WAFPackageGetResponseResult) UnmarshalJSON(data []byte) (err error) {
227+
return apijson.UnmarshalRoot(data, r)
228+
}
229+
230+
func (r wafPackageGetResponseResultJSON) RawJSON() string {
231+
return r.raw
232+
}
233+
234+
func (r WAFPackageGetResponseResult) implementsFirewallWAFPackageGetResponse() {}
235+
236+
// Whether the API call was successful
237+
type WAFPackageGetResponseSuccess bool
238+
239+
const (
240+
WAFPackageGetResponseSuccessTrue WAFPackageGetResponseSuccess = true
241+
)
242+
243+
func (r WAFPackageGetResponseSuccess) IsKnown() bool {
244+
switch r {
245+
case WAFPackageGetResponseSuccessTrue:
246+
return true
247+
}
248+
return false
249+
}
250+
251+
type WAFPackageListParams struct {
252+
// Identifier
253+
ZoneID param.Field[string] `path:"zone_id,required"`
254+
// The direction used to sort returned packages.
255+
Direction param.Field[WAFPackageListParamsDirection] `query:"direction"`
256+
// When set to `all`, all the search requirements must match. When set to `any`,
257+
// only one of the search requirements has to match.
258+
Match param.Field[WAFPackageListParamsMatch] `query:"match"`
259+
// The name of the WAF package.
260+
Name param.Field[string] `query:"name"`
261+
// The field used to sort returned packages.
262+
Order param.Field[WAFPackageListParamsOrder] `query:"order"`
263+
// The page number of paginated results.
264+
Page param.Field[float64] `query:"page"`
265+
// The number of packages per page.
266+
PerPage param.Field[float64] `query:"per_page"`
267+
}
268+
269+
// URLQuery serializes [WAFPackageListParams]'s query parameters as `url.Values`.
270+
func (r WAFPackageListParams) URLQuery() (v url.Values) {
271+
return apiquery.MarshalWithSettings(r, apiquery.QuerySettings{
272+
ArrayFormat: apiquery.ArrayQueryFormatRepeat,
273+
NestedFormat: apiquery.NestedQueryFormatDots,
274+
})
275+
}
276+
277+
// The direction used to sort returned packages.
278+
type WAFPackageListParamsDirection string
279+
280+
const (
281+
WAFPackageListParamsDirectionAsc WAFPackageListParamsDirection = "asc"
282+
WAFPackageListParamsDirectionDesc WAFPackageListParamsDirection = "desc"
283+
)
284+
285+
func (r WAFPackageListParamsDirection) IsKnown() bool {
286+
switch r {
287+
case WAFPackageListParamsDirectionAsc, WAFPackageListParamsDirectionDesc:
288+
return true
289+
}
290+
return false
291+
}
292+
293+
// When set to `all`, all the search requirements must match. When set to `any`,
294+
// only one of the search requirements has to match.
295+
type WAFPackageListParamsMatch string
296+
297+
const (
298+
WAFPackageListParamsMatchAny WAFPackageListParamsMatch = "any"
299+
WAFPackageListParamsMatchAll WAFPackageListParamsMatch = "all"
300+
)
301+
302+
func (r WAFPackageListParamsMatch) IsKnown() bool {
303+
switch r {
304+
case WAFPackageListParamsMatchAny, WAFPackageListParamsMatchAll:
305+
return true
306+
}
307+
return false
308+
}
309+
310+
// The field used to sort returned packages.
311+
type WAFPackageListParamsOrder string
312+
313+
const (
314+
WAFPackageListParamsOrderName WAFPackageListParamsOrder = "name"
315+
)
316+
317+
func (r WAFPackageListParamsOrder) IsKnown() bool {
318+
switch r {
319+
case WAFPackageListParamsOrderName:
320+
return true
321+
}
322+
return false
323+
}
324+
325+
type WAFPackageGetParams struct {
326+
// Identifier
327+
ZoneID param.Field[string] `path:"zone_id,required"`
328+
}

‎firewall/wafpackage_test.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package firewall_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/firewall"
13+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
14+
"github.com/cloudflare/cloudflare-go/v3/option"
15+
)
16+
17+
func TestWAFPackageListWithOptionalParams(t *testing.T) {
18+
t.Skip("TODO: investigate broken test")
19+
baseURL := "http://localhost:4010"
20+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
21+
baseURL = envURL
22+
}
23+
if !testutil.CheckTestServer(t, baseURL) {
24+
return
25+
}
26+
client := cloudflare.NewClient(
27+
option.WithBaseURL(baseURL),
28+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
29+
option.WithAPIEmail("user@example.com"),
30+
)
31+
_, err := client.Firewall.WAF.Packages.List(context.TODO(), firewall.WAFPackageListParams{
32+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
33+
Direction: cloudflare.F(firewall.WAFPackageListParamsDirectionAsc),
34+
Match: cloudflare.F(firewall.WAFPackageListParamsMatchAny),
35+
Name: cloudflare.F("USER"),
36+
Order: cloudflare.F(firewall.WAFPackageListParamsOrderName),
37+
Page: cloudflare.F(1.000000),
38+
PerPage: cloudflare.F(5.000000),
39+
})
40+
if err != nil {
41+
var apierr *cloudflare.Error
42+
if errors.As(err, &apierr) {
43+
t.Log(string(apierr.DumpRequest(true)))
44+
}
45+
t.Fatalf("err should be nil: %s", err.Error())
46+
}
47+
}
48+
49+
func TestWAFPackageGet(t *testing.T) {
50+
baseURL := "http://localhost:4010"
51+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
52+
baseURL = envURL
53+
}
54+
if !testutil.CheckTestServer(t, baseURL) {
55+
return
56+
}
57+
client := cloudflare.NewClient(
58+
option.WithBaseURL(baseURL),
59+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
60+
option.WithAPIEmail("user@example.com"),
61+
)
62+
_, err := client.Firewall.WAF.Packages.Get(
63+
context.TODO(),
64+
"023e105f4ecef8ad9ca31a8372d0c353",
65+
firewall.WAFPackageGetParams{
66+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
67+
},
68+
)
69+
if err != nil {
70+
var apierr *cloudflare.Error
71+
if errors.As(err, &apierr) {
72+
t.Log(string(apierr.DumpRequest(true)))
73+
}
74+
t.Fatalf("err should be nil: %s", err.Error())
75+
}
76+
}

‎rate_limits/ratelimit.go

+1,315
Large diffs are not rendered by default.

‎rate_limits/ratelimit_test.go

+222
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
package rate_limits_test
4+
5+
import (
6+
"context"
7+
"errors"
8+
"os"
9+
"testing"
10+
11+
"github.com/cloudflare/cloudflare-go/v3"
12+
"github.com/cloudflare/cloudflare-go/v3/internal/testutil"
13+
"github.com/cloudflare/cloudflare-go/v3/option"
14+
"github.com/cloudflare/cloudflare-go/v3/rate_limits"
15+
)
16+
17+
func TestRateLimitNewWithOptionalParams(t *testing.T) {
18+
t.Skip("TODO: investigate broken test")
19+
baseURL := "http://localhost:4010"
20+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
21+
baseURL = envURL
22+
}
23+
if !testutil.CheckTestServer(t, baseURL) {
24+
return
25+
}
26+
client := cloudflare.NewClient(
27+
option.WithBaseURL(baseURL),
28+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
29+
option.WithAPIEmail("user@example.com"),
30+
)
31+
_, err := client.RateLimits.New(context.TODO(), rate_limits.RateLimitNewParams{
32+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
33+
Action: cloudflare.F(rate_limits.RateLimitNewParamsAction{
34+
Mode: cloudflare.F(rate_limits.RateLimitNewParamsActionModeSimulate),
35+
Response: cloudflare.F(rate_limits.RateLimitNewParamsActionResponse{
36+
Body: cloudflare.F("<error>This request has been rate-limited.</error>"),
37+
ContentType: cloudflare.F("text/xml"),
38+
}),
39+
Timeout: cloudflare.F(86400.000000),
40+
}),
41+
Match: cloudflare.F(rate_limits.RateLimitNewParamsMatch{
42+
Headers: cloudflare.F([]rate_limits.RateLimitNewParamsMatchHeader{{
43+
Name: cloudflare.F("Cf-Cache-Status"),
44+
Op: cloudflare.F(rate_limits.RateLimitNewParamsMatchHeadersOpEq),
45+
Value: cloudflare.F("HIT"),
46+
}, {
47+
Name: cloudflare.F("Cf-Cache-Status"),
48+
Op: cloudflare.F(rate_limits.RateLimitNewParamsMatchHeadersOpEq),
49+
Value: cloudflare.F("HIT"),
50+
}, {
51+
Name: cloudflare.F("Cf-Cache-Status"),
52+
Op: cloudflare.F(rate_limits.RateLimitNewParamsMatchHeadersOpEq),
53+
Value: cloudflare.F("HIT"),
54+
}}),
55+
Request: cloudflare.F(rate_limits.RateLimitNewParamsMatchRequest{
56+
Methods: cloudflare.F([]rate_limits.Methods{rate_limits.MethodsGet, rate_limits.MethodsPost}),
57+
Schemes: cloudflare.F([]string{"HTTP", "HTTPS"}),
58+
URL: cloudflare.F("*.example.org/path*"),
59+
}),
60+
Response: cloudflare.F(rate_limits.RateLimitNewParamsMatchResponse{
61+
OriginTraffic: cloudflare.F(true),
62+
}),
63+
}),
64+
Period: cloudflare.F(900.000000),
65+
Threshold: cloudflare.F(60.000000),
66+
})
67+
if err != nil {
68+
var apierr *cloudflare.Error
69+
if errors.As(err, &apierr) {
70+
t.Log(string(apierr.DumpRequest(true)))
71+
}
72+
t.Fatalf("err should be nil: %s", err.Error())
73+
}
74+
}
75+
76+
func TestRateLimitListWithOptionalParams(t *testing.T) {
77+
baseURL := "http://localhost:4010"
78+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
79+
baseURL = envURL
80+
}
81+
if !testutil.CheckTestServer(t, baseURL) {
82+
return
83+
}
84+
client := cloudflare.NewClient(
85+
option.WithBaseURL(baseURL),
86+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
87+
option.WithAPIEmail("user@example.com"),
88+
)
89+
_, err := client.RateLimits.List(context.TODO(), rate_limits.RateLimitListParams{
90+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
91+
Page: cloudflare.F(1.000000),
92+
PerPage: cloudflare.F(1.000000),
93+
})
94+
if err != nil {
95+
var apierr *cloudflare.Error
96+
if errors.As(err, &apierr) {
97+
t.Log(string(apierr.DumpRequest(true)))
98+
}
99+
t.Fatalf("err should be nil: %s", err.Error())
100+
}
101+
}
102+
103+
func TestRateLimitDelete(t *testing.T) {
104+
baseURL := "http://localhost:4010"
105+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
106+
baseURL = envURL
107+
}
108+
if !testutil.CheckTestServer(t, baseURL) {
109+
return
110+
}
111+
client := cloudflare.NewClient(
112+
option.WithBaseURL(baseURL),
113+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
114+
option.WithAPIEmail("user@example.com"),
115+
)
116+
_, err := client.RateLimits.Delete(
117+
context.TODO(),
118+
"372e67954025e0ba6aaa6d586b9e0b59",
119+
rate_limits.RateLimitDeleteParams{
120+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
121+
},
122+
)
123+
if err != nil {
124+
var apierr *cloudflare.Error
125+
if errors.As(err, &apierr) {
126+
t.Log(string(apierr.DumpRequest(true)))
127+
}
128+
t.Fatalf("err should be nil: %s", err.Error())
129+
}
130+
}
131+
132+
func TestRateLimitEditWithOptionalParams(t *testing.T) {
133+
t.Skip("TODO: investigate broken test")
134+
baseURL := "http://localhost:4010"
135+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
136+
baseURL = envURL
137+
}
138+
if !testutil.CheckTestServer(t, baseURL) {
139+
return
140+
}
141+
client := cloudflare.NewClient(
142+
option.WithBaseURL(baseURL),
143+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
144+
option.WithAPIEmail("user@example.com"),
145+
)
146+
_, err := client.RateLimits.Edit(
147+
context.TODO(),
148+
"372e67954025e0ba6aaa6d586b9e0b59",
149+
rate_limits.RateLimitEditParams{
150+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
151+
Action: cloudflare.F(rate_limits.RateLimitEditParamsAction{
152+
Mode: cloudflare.F(rate_limits.RateLimitEditParamsActionModeSimulate),
153+
Response: cloudflare.F(rate_limits.RateLimitEditParamsActionResponse{
154+
Body: cloudflare.F("<error>This request has been rate-limited.</error>"),
155+
ContentType: cloudflare.F("text/xml"),
156+
}),
157+
Timeout: cloudflare.F(86400.000000),
158+
}),
159+
Match: cloudflare.F(rate_limits.RateLimitEditParamsMatch{
160+
Headers: cloudflare.F([]rate_limits.RateLimitEditParamsMatchHeader{{
161+
Name: cloudflare.F("Cf-Cache-Status"),
162+
Op: cloudflare.F(rate_limits.RateLimitEditParamsMatchHeadersOpEq),
163+
Value: cloudflare.F("HIT"),
164+
}, {
165+
Name: cloudflare.F("Cf-Cache-Status"),
166+
Op: cloudflare.F(rate_limits.RateLimitEditParamsMatchHeadersOpEq),
167+
Value: cloudflare.F("HIT"),
168+
}, {
169+
Name: cloudflare.F("Cf-Cache-Status"),
170+
Op: cloudflare.F(rate_limits.RateLimitEditParamsMatchHeadersOpEq),
171+
Value: cloudflare.F("HIT"),
172+
}}),
173+
Request: cloudflare.F(rate_limits.RateLimitEditParamsMatchRequest{
174+
Methods: cloudflare.F([]rate_limits.Methods{rate_limits.MethodsGet, rate_limits.MethodsPost}),
175+
Schemes: cloudflare.F([]string{"HTTP", "HTTPS"}),
176+
URL: cloudflare.F("*.example.org/path*"),
177+
}),
178+
Response: cloudflare.F(rate_limits.RateLimitEditParamsMatchResponse{
179+
OriginTraffic: cloudflare.F(true),
180+
}),
181+
}),
182+
Period: cloudflare.F(900.000000),
183+
Threshold: cloudflare.F(60.000000),
184+
},
185+
)
186+
if err != nil {
187+
var apierr *cloudflare.Error
188+
if errors.As(err, &apierr) {
189+
t.Log(string(apierr.DumpRequest(true)))
190+
}
191+
t.Fatalf("err should be nil: %s", err.Error())
192+
}
193+
}
194+
195+
func TestRateLimitGet(t *testing.T) {
196+
baseURL := "http://localhost:4010"
197+
if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
198+
baseURL = envURL
199+
}
200+
if !testutil.CheckTestServer(t, baseURL) {
201+
return
202+
}
203+
client := cloudflare.NewClient(
204+
option.WithBaseURL(baseURL),
205+
option.WithAPIKey("144c9defac04969c7bfad8efaa8ea194"),
206+
option.WithAPIEmail("user@example.com"),
207+
)
208+
_, err := client.RateLimits.Get(
209+
context.TODO(),
210+
"372e67954025e0ba6aaa6d586b9e0b59",
211+
rate_limits.RateLimitGetParams{
212+
ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
213+
},
214+
)
215+
if err != nil {
216+
var apierr *cloudflare.Error
217+
if errors.As(err, &apierr) {
218+
t.Log(string(apierr.DumpRequest(true)))
219+
}
220+
t.Fatalf("err should be nil: %s", err.Error())
221+
}
222+
}

0 commit comments

Comments
 (0)
Please sign in to comment.