207 lines
6.8 KiB
Go
207 lines
6.8 KiB
Go
|
package cloudflare
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"time"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// PageRuleTarget is the target to evaluate on a request.
|
||
|
//
|
||
|
// Currently Target must always be "url" and Operator must be "matches". Value
|
||
|
// is the URL pattern to match against.
|
||
|
type PageRuleTarget struct {
|
||
|
Target string `json:"target"`
|
||
|
Constraint struct {
|
||
|
Operator string `json:"operator"`
|
||
|
Value string `json:"value"`
|
||
|
} `json:"constraint"`
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
PageRuleAction is the action to take when the target is matched.
|
||
|
|
||
|
Valid IDs are:
|
||
|
|
||
|
always_online
|
||
|
always_use_https
|
||
|
browser_cache_ttl
|
||
|
browser_check
|
||
|
cache_level
|
||
|
disable_apps
|
||
|
disable_performance
|
||
|
disable_railgun
|
||
|
disable_security
|
||
|
edge_cache_ttl
|
||
|
email_obfuscation
|
||
|
forwarding_url
|
||
|
ip_geolocation
|
||
|
mirage
|
||
|
rocket_loader
|
||
|
security_level
|
||
|
server_side_exclude
|
||
|
smart_errors
|
||
|
ssl
|
||
|
waf
|
||
|
*/
|
||
|
type PageRuleAction struct {
|
||
|
ID string `json:"id"`
|
||
|
Value interface{} `json:"value"`
|
||
|
}
|
||
|
|
||
|
// PageRuleActions maps API action IDs to human-readable strings.
|
||
|
var PageRuleActions = map[string]string{
|
||
|
"always_online": "Always Online", // Value of type string
|
||
|
"always_use_https": "Always Use HTTPS", // Value of type interface{}
|
||
|
"browser_cache_ttl": "Browser Cache TTL", // Value of type int
|
||
|
"browser_check": "Browser Integrity Check", // Value of type string
|
||
|
"cache_level": "Cache Level", // Value of type string
|
||
|
"disable_apps": "Disable Apps", // Value of type interface{}
|
||
|
"disable_performance": "Disable Performance", // Value of type interface{}
|
||
|
"disable_railgun": "Disable Railgun", // Value of type string
|
||
|
"disable_security": "Disable Security", // Value of type interface{}
|
||
|
"edge_cache_ttl": "Edge Cache TTL", // Value of type int
|
||
|
"email_obfuscation": "Email Obfuscation", // Value of type string
|
||
|
"forwarding_url": "Forwarding URL", // Value of type map[string]interface
|
||
|
"ip_geolocation": "IP Geolocation Header", // Value of type string
|
||
|
"mirage": "Mirage", // Value of type string
|
||
|
"rocket_loader": "Rocker Loader", // Value of type string
|
||
|
"security_level": "Security Level", // Value of type string
|
||
|
"server_side_exclude": "Server Side Excludes", // Value of type string
|
||
|
"smart_errors": "Smart Errors", // Value of type string
|
||
|
"ssl": "SSL", // Value of type string
|
||
|
"waf": "Web Application Firewall", // Value of type string
|
||
|
}
|
||
|
|
||
|
// PageRule describes a Page Rule.
|
||
|
type PageRule struct {
|
||
|
ID string `json:"id,omitempty"`
|
||
|
Targets []PageRuleTarget `json:"targets"`
|
||
|
Actions []PageRuleAction `json:"actions"`
|
||
|
Priority int `json:"priority"`
|
||
|
Status string `json:"status"` // can be: active, paused
|
||
|
ModifiedOn time.Time `json:"modified_on,omitempty"`
|
||
|
CreatedOn time.Time `json:"created_on,omitempty"`
|
||
|
}
|
||
|
|
||
|
// PageRuleDetailResponse is the API response, containing a single PageRule.
|
||
|
type PageRuleDetailResponse struct {
|
||
|
Success bool `json:"success"`
|
||
|
Errors []string `json:"errors"`
|
||
|
Messages []string `json:"messages"`
|
||
|
Result PageRule `json:"result"`
|
||
|
}
|
||
|
|
||
|
// PageRulesResponse is the API response, containing an array of PageRules.
|
||
|
type PageRulesResponse struct {
|
||
|
Success bool `json:"success"`
|
||
|
Errors []string `json:"errors"`
|
||
|
Messages []string `json:"messages"`
|
||
|
Result []PageRule `json:"result"`
|
||
|
}
|
||
|
|
||
|
// CreatePageRule creates a new Page Rule for a zone.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-create-a-page-rule
|
||
|
func (api *API) CreatePageRule(zoneID string, rule PageRule) (*PageRule, error) {
|
||
|
uri := "/zones/" + zoneID + "/pagerules"
|
||
|
res, err := api.makeRequest("POST", uri, rule)
|
||
|
if err != nil {
|
||
|
return nil, errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRuleDetailResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return nil, errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return &r.Result, nil
|
||
|
}
|
||
|
|
||
|
// ListPageRules returns all Page Rules for a zone.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-list-page-rules
|
||
|
func (api *API) ListPageRules(zoneID string) ([]PageRule, error) {
|
||
|
uri := "/zones/" + zoneID + "/pagerules"
|
||
|
res, err := api.makeRequest("GET", uri, nil)
|
||
|
if err != nil {
|
||
|
return []PageRule{}, errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRulesResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return []PageRule{}, errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return r.Result, nil
|
||
|
}
|
||
|
|
||
|
// PageRule fetches detail about one Page Rule for a zone.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-page-rule-details
|
||
|
func (api *API) PageRule(zoneID, ruleID string) (PageRule, error) {
|
||
|
uri := "/zones/" + zoneID + "/pagerules/" + ruleID
|
||
|
res, err := api.makeRequest("GET", uri, nil)
|
||
|
if err != nil {
|
||
|
return PageRule{}, errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRuleDetailResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return PageRule{}, errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return r.Result, nil
|
||
|
}
|
||
|
|
||
|
// ChangePageRule lets you change individual settings for a Page Rule. This is
|
||
|
// in contrast to UpdatePageRule which replaces the entire Page Rule.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-change-a-page-rule
|
||
|
func (api *API) ChangePageRule(zoneID, ruleID string, rule PageRule) error {
|
||
|
uri := "/zones/" + zoneID + "/pagerules/" + ruleID
|
||
|
res, err := api.makeRequest("PATCH", uri, rule)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRuleDetailResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// UpdatePageRule lets you replace a Page Rule. This is in contrast to
|
||
|
// ChangePageRule which lets you change individual settings.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-update-a-page-rule
|
||
|
func (api *API) UpdatePageRule(zoneID, ruleID string, rule PageRule) error {
|
||
|
uri := "/zones/" + zoneID + "/pagerules/" + ruleID
|
||
|
res, err := api.makeRequest("PUT", uri, nil)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRuleDetailResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// DeletePageRule deletes a Page Rule for a zone.
|
||
|
//
|
||
|
// API reference: https://api.cloudflare.com/#page-rules-for-a-zone-delete-a-page-rule
|
||
|
func (api *API) DeletePageRule(zoneID, ruleID string) error {
|
||
|
uri := "/zones/" + zoneID + "/pagerules/" + ruleID
|
||
|
res, err := api.makeRequest("DELETE", uri, nil)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errMakeRequestError)
|
||
|
}
|
||
|
var r PageRuleDetailResponse
|
||
|
err = json.Unmarshal(res, &r)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, errUnmarshalError)
|
||
|
}
|
||
|
return nil
|
||
|
}
|