Skip to content

Commit

Permalink
Added support for http_response_compress phase and `compress_respon…
Browse files Browse the repository at this point in the history
…se` action.
  • Loading branch information
orium committed Apr 6, 2023
1 parent 93d8999 commit 84d6d60
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
16 changes: 16 additions & 0 deletions rulesets.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const (
RulesetPhaseHTTPResponseFirewallManaged RulesetPhase = "http_response_firewall_managed"
RulesetPhaseHTTPResponseHeadersTransform RulesetPhase = "http_response_headers_transform"
RulesetPhaseHTTPResponseHeadersTransformManaged RulesetPhase = "http_response_headers_transform_managed"
RulesetPhaseHTTPResponseCompression RulesetPhase = "http_response_compression"
RulesetPhaseMagicTransit RulesetPhase = "magic_transit"
RulesetPhaseRateLimit RulesetPhase = "http_ratelimit"
RulesetPhaseSuperBotFightMode RulesetPhase = "http_request_sbfm"
Expand All @@ -58,6 +59,7 @@ const (
RulesetRuleActionSetConfig RulesetRuleAction = "set_config"
RulesetRuleActionServeError RulesetRuleAction = "serve_error"
RulesetRuleActionSkip RulesetRuleAction = "skip"
RulesetRuleActionCompressResponse RulesetRuleAction = "compress_response"

RulesetActionParameterProductBIC RulesetActionParameterProduct = "bic"
RulesetActionParameterProductHOT RulesetActionParameterProduct = "hot"
Expand Down Expand Up @@ -106,6 +108,7 @@ func RulesetPhaseValues() []string {
string(RulesetPhaseHTTPResponseFirewallManaged),
string(RulesetPhaseHTTPResponseHeadersTransform),
string(RulesetPhaseHTTPResponseHeadersTransformManaged),
string(RulesetPhaseHTTPResponseCompression),
string(RulesetPhaseMagicTransit),
string(RulesetPhaseRateLimit),
string(RulesetPhaseSuperBotFightMode),
Expand Down Expand Up @@ -135,6 +138,7 @@ func RulesetRuleActionValues() []string {
string(RulesetRuleActionSetConfig),
string(RulesetRuleActionServeError),
string(RulesetRuleActionSkip),
string(RulesetRuleActionCompressResponse),
}
}

Expand Down Expand Up @@ -252,6 +256,7 @@ type RulesetRuleActionParameters struct {
SSL *SSL `json:"ssl,omitempty"`
SXG *bool `json:"sxg,omitempty"`
HotLinkProtection *bool `json:"hotlink_protection,omitempty"`
CompressResponse *RulesetRuleActionParametersCompressResponse `json:"compress_response,omitempty"`
}

// RulesetRuleActionParametersFromList holds the FromList struct for
Expand Down Expand Up @@ -451,6 +456,17 @@ type RulesetRuleActionParametersSni struct {
Value string `json:"value"`
}

// CompressionAlgorithm defines a compression algorithm.
type CompressionAlgorithm struct {
Name string `json:"name"`
}

// RulesetRuleActionParametersCompressResponse is the definition for compress_response action
// parameters.
type RulesetRuleActionParametersCompressResponse struct {
Algorithms []CompressionAlgorithm `json:"algorithms"`
}

type Polish int

const (
Expand Down
82 changes: 82 additions & 0 deletions rulesets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,88 @@ func TestGetRuleset_RedirectFromValue(t *testing.T) {
}
}

func TestGetRuleset_CompressResponse(t *testing.T) {
setup()
defer teardown()

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodGet, r.Method, "Expected method 'GET', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprint(w, `{
"result": {
"id": "70339d97bdb34195bbf054b1ebe81f76",
"name": "Cloudflare compress response ruleset",
"description": "This ruleset provides response compression rules",
"kind": "zone",
"version": "1",
"rules": [
{
"id": "78723a9e0c7c4c6dbec5684cb766231d",
"version": "1",
"action": "compress_response",
"action_parameters": {
"algorithms": [ { "name": "brotli" }, { "name": "default" } ]
},
"description": "Compress response rule",
"last_updated": "2020-12-18T09:28:09.655749Z",
"ref": "272936dc447b41fe976255ff6b768ec0",
"enabled": true
}
],
"last_updated": "2020-12-18T09:28:09.655749Z",
"phase": "http_response_compression"
},
"success": true,
"errors": [],
"messages": []
}`)
}

mux.HandleFunc("/accounts/"+testAccountID+"/rulesets/b232b534beea4e00a21dcbb7a8a545e9", handler)
mux.HandleFunc("/zones/"+testZoneID+"/rulesets/b232b534beea4e00a21dcbb7a8a545e9", handler)

lastUpdated, _ := time.Parse(time.RFC3339, "2020-12-18T09:28:09.655749Z")

rules := []RulesetRule{{
ID: "78723a9e0c7c4c6dbec5684cb766231d",
Version: StringPtr("1"),
Action: string(RulesetRuleActionCompressResponse),
ActionParameters: &RulesetRuleActionParameters{
CompressResponse: &RulesetRuleActionParametersCompressResponse{
Algorithms: []CompressionAlgorithm{
{Name: "brotli"},
{Name: "default"},
},
},
},
Description: "Compress response rule",
LastUpdated: &lastUpdated,
Ref: "272936dc447b41fe976255ff6b768ec0",
Enabled: BoolPtr(true),
}}

want := Ruleset{
ID: "70339d97bdb34195bbf054b1ebe81f76",
Name: "Cloudflare compress response ruleset",
Description: "This ruleset provides response compression rules",
Kind: string(RulesetKindZone),
Version: StringPtr("1"),
LastUpdated: &lastUpdated,
Phase: string(RulesetPhaseHTTPResponseCompression),
Rules: rules,
}

zoneActual, err := client.GetZoneRuleset(context.Background(), testZoneID, "b232b534beea4e00a21dcbb7a8a545e9")
if assert.NoError(t, err) {
assert.Equal(t, want, zoneActual)
}

accountActual, err := client.GetAccountRuleset(context.Background(), testAccountID, "b232b534beea4e00a21dcbb7a8a545e9")
if assert.NoError(t, err) {
assert.Equal(t, want, accountActual)
}
}

func TestCreateRuleset(t *testing.T) {
setup()
defer teardown()
Expand Down

0 comments on commit 84d6d60

Please sign in to comment.