280 lines
10 KiB
Go
280 lines
10 KiB
Go
|
package fastly
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// RequestSettingActionLookup sets request handling to lookup via the cache.
|
||
|
RequestSettingActionLookup RequestSettingAction = "lookup"
|
||
|
|
||
|
// RequestSettingActionPass sets request handling to pass the cache.
|
||
|
RequestSettingActionPass RequestSettingAction = "pass"
|
||
|
)
|
||
|
|
||
|
// RequestSettingAction is a type of request setting action.
|
||
|
type RequestSettingAction string
|
||
|
|
||
|
const (
|
||
|
// RequestSettingXFFClear clears any X-Forwarded-For headers.
|
||
|
RequestSettingXFFClear RequestSettingXFF = "clear"
|
||
|
|
||
|
// RequestSettingXFFLeave leaves any X-Forwarded-For headers untouched.
|
||
|
RequestSettingXFFLeave RequestSettingXFF = "leave"
|
||
|
|
||
|
// RequestSettingXFFAppend adds Fastly X-Forwarded-For headers.
|
||
|
RequestSettingXFFAppend RequestSettingXFF = "append"
|
||
|
|
||
|
// RequestSettingXFFAppendAll appends all Fastly X-Forwarded-For headers.
|
||
|
RequestSettingXFFAppendAll RequestSettingXFF = "append_all"
|
||
|
|
||
|
// RequestSettingXFFOverwrite clears any X-Forwarded-For headers and replaces
|
||
|
// with Fastly ones.
|
||
|
RequestSettingXFFOverwrite RequestSettingXFF = "overwrite"
|
||
|
)
|
||
|
|
||
|
// RequestSettingXFF is a type of X-Forwarded-For value to set.
|
||
|
type RequestSettingXFF string
|
||
|
|
||
|
// RequestSetting represents a request setting response from the Fastly API.
|
||
|
type RequestSetting struct {
|
||
|
ServiceID string `mapstructure:"service_id"`
|
||
|
Version string `mapstructure:"version"`
|
||
|
|
||
|
Name string `mapstructure:"name"`
|
||
|
ForceMiss bool `mapstructure:"force_miss"`
|
||
|
ForceSSL bool `mapstructure:"force_ssl"`
|
||
|
Action RequestSettingAction `mapstructure:"action"`
|
||
|
BypassBusyWait bool `mapstructure:"bypass_busy_wait"`
|
||
|
MaxStaleAge uint `mapstructure:"max_stale_age"`
|
||
|
HashKeys string `mapstructure:"hash_keys"`
|
||
|
XForwardedFor RequestSettingXFF `mapstructure:"xff"`
|
||
|
TimerSupport bool `mapstructure:"timer_support"`
|
||
|
GeoHeaders bool `mapstructure:"geo_headers"`
|
||
|
DefaultHost string `mapstructure:"default_host"`
|
||
|
RequestCondition string `mapstructure:"request_condition"`
|
||
|
}
|
||
|
|
||
|
// requestSettingsByName is a sortable list of request settings.
|
||
|
type requestSettingsByName []*RequestSetting
|
||
|
|
||
|
// Len, Swap, and Less implement the sortable interface.
|
||
|
func (s requestSettingsByName) Len() int { return len(s) }
|
||
|
func (s requestSettingsByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
func (s requestSettingsByName) Less(i, j int) bool {
|
||
|
return s[i].Name < s[j].Name
|
||
|
}
|
||
|
|
||
|
// ListRequestSettingsInput is used as input to the ListRequestSettings
|
||
|
// function.
|
||
|
type ListRequestSettingsInput struct {
|
||
|
// Service is the ID of the service (required).
|
||
|
Service string
|
||
|
|
||
|
// Version is the specific configuration version (required).
|
||
|
Version string
|
||
|
}
|
||
|
|
||
|
// ListRequestSettings returns the list of request settings for the
|
||
|
// configuration version.
|
||
|
func (c *Client) ListRequestSettings(i *ListRequestSettingsInput) ([]*RequestSetting, error) {
|
||
|
if i.Service == "" {
|
||
|
return nil, ErrMissingService
|
||
|
}
|
||
|
|
||
|
if i.Version == "" {
|
||
|
return nil, ErrMissingVersion
|
||
|
}
|
||
|
|
||
|
path := fmt.Sprintf("/service/%s/version/%s/request_settings", i.Service, i.Version)
|
||
|
resp, err := c.Get(path, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var bs []*RequestSetting
|
||
|
if err := decodeJSON(&bs, resp.Body); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
sort.Stable(requestSettingsByName(bs))
|
||
|
return bs, nil
|
||
|
}
|
||
|
|
||
|
// CreateRequestSettingInput is used as input to the CreateRequestSetting
|
||
|
// function.
|
||
|
type CreateRequestSettingInput struct {
|
||
|
// Service is the ID of the service. Version is the specific configuration
|
||
|
// version. Both fields are required.
|
||
|
Service string
|
||
|
Version string
|
||
|
|
||
|
Name string `form:"name,omitempty"`
|
||
|
ForceMiss Compatibool `form:"force_miss,omitempty"`
|
||
|
ForceSSL Compatibool `form:"force_ssl,omitempty"`
|
||
|
Action RequestSettingAction `form:"action,omitempty"`
|
||
|
BypassBusyWait Compatibool `form:"bypass_busy_wait,omitempty"`
|
||
|
MaxStaleAge uint `form:"max_stale_age,omitempty"`
|
||
|
HashKeys string `form:"hash_keys,omitempty"`
|
||
|
XForwardedFor RequestSettingXFF `form:"xff,omitempty"`
|
||
|
TimerSupport Compatibool `form:"timer_support,omitempty"`
|
||
|
GeoHeaders Compatibool `form:"geo_headers,omitempty"`
|
||
|
DefaultHost string `form:"default_host,omitempty"`
|
||
|
RequestCondition string `form:"request_condition,omitempty"`
|
||
|
}
|
||
|
|
||
|
// CreateRequestSetting creates a new Fastly request settings.
|
||
|
func (c *Client) CreateRequestSetting(i *CreateRequestSettingInput) (*RequestSetting, error) {
|
||
|
if i.Service == "" {
|
||
|
return nil, ErrMissingService
|
||
|
}
|
||
|
|
||
|
if i.Version == "" {
|
||
|
return nil, ErrMissingVersion
|
||
|
}
|
||
|
|
||
|
path := fmt.Sprintf("/service/%s/version/%s/request_settings", i.Service, i.Version)
|
||
|
resp, err := c.PostForm(path, i, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var b *RequestSetting
|
||
|
if err := decodeJSON(&b, resp.Body); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return b, nil
|
||
|
}
|
||
|
|
||
|
// GetRequestSettingInput is used as input to the GetRequestSetting function.
|
||
|
type GetRequestSettingInput struct {
|
||
|
// Service is the ID of the service. Version is the specific configuration
|
||
|
// version. Both fields are required.
|
||
|
Service string
|
||
|
Version string
|
||
|
|
||
|
// Name is the name of the request settings to fetch.
|
||
|
Name string
|
||
|
}
|
||
|
|
||
|
// GetRequestSetting gets the request settings configuration with the given
|
||
|
// parameters.
|
||
|
func (c *Client) GetRequestSetting(i *GetRequestSettingInput) (*RequestSetting, error) {
|
||
|
if i.Service == "" {
|
||
|
return nil, ErrMissingService
|
||
|
}
|
||
|
|
||
|
if i.Version == "" {
|
||
|
return nil, ErrMissingVersion
|
||
|
}
|
||
|
|
||
|
if i.Name == "" {
|
||
|
return nil, ErrMissingName
|
||
|
}
|
||
|
|
||
|
path := fmt.Sprintf("/service/%s/version/%s/request_settings/%s", i.Service, i.Version, i.Name)
|
||
|
resp, err := c.Get(path, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var b *RequestSetting
|
||
|
if err := decodeJSON(&b, resp.Body); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return b, nil
|
||
|
}
|
||
|
|
||
|
// UpdateRequestSettingInput is used as input to the UpdateRequestSetting
|
||
|
// function.
|
||
|
type UpdateRequestSettingInput struct {
|
||
|
// Service is the ID of the service. Version is the specific configuration
|
||
|
// version. Both fields are required.
|
||
|
Service string
|
||
|
Version string
|
||
|
|
||
|
// Name is the name of the request settings to update.
|
||
|
Name string
|
||
|
|
||
|
NewName string `form:"name,omitempty"`
|
||
|
ForceMiss Compatibool `form:"force_miss,omitempty"`
|
||
|
ForceSSL Compatibool `form:"force_ssl,omitempty"`
|
||
|
Action RequestSettingAction `form:"action,omitempty"`
|
||
|
BypassBusyWait Compatibool `form:"bypass_busy_wait,omitempty"`
|
||
|
MaxStaleAge uint `form:"max_stale_age,omitempty"`
|
||
|
HashKeys string `form:"hash_keys,omitempty"`
|
||
|
XForwardedFor RequestSettingXFF `form:"xff,omitempty"`
|
||
|
TimerSupport Compatibool `form:"timer_support,omitempty"`
|
||
|
GeoHeaders Compatibool `form:"geo_headers,omitempty"`
|
||
|
DefaultHost string `form:"default_host,omitempty"`
|
||
|
RequestCondition string `form:"request_condition,omitempty"`
|
||
|
}
|
||
|
|
||
|
// UpdateRequestSetting updates a specific request settings.
|
||
|
func (c *Client) UpdateRequestSetting(i *UpdateRequestSettingInput) (*RequestSetting, error) {
|
||
|
if i.Service == "" {
|
||
|
return nil, ErrMissingService
|
||
|
}
|
||
|
|
||
|
if i.Version == "" {
|
||
|
return nil, ErrMissingVersion
|
||
|
}
|
||
|
|
||
|
if i.Name == "" {
|
||
|
return nil, ErrMissingName
|
||
|
}
|
||
|
|
||
|
path := fmt.Sprintf("/service/%s/version/%s/request_settings/%s", i.Service, i.Version, i.Name)
|
||
|
resp, err := c.PutForm(path, i, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var b *RequestSetting
|
||
|
if err := decodeJSON(&b, resp.Body); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return b, nil
|
||
|
}
|
||
|
|
||
|
// DeleteRequestSettingInput is the input parameter to DeleteRequestSetting.
|
||
|
type DeleteRequestSettingInput struct {
|
||
|
// Service is the ID of the service. Version is the specific configuration
|
||
|
// version. Both fields are required.
|
||
|
Service string
|
||
|
Version string
|
||
|
|
||
|
// Name is the name of the request settings to delete (required).
|
||
|
Name string
|
||
|
}
|
||
|
|
||
|
// DeleteRequestSetting deletes the given request settings version.
|
||
|
func (c *Client) DeleteRequestSetting(i *DeleteRequestSettingInput) error {
|
||
|
if i.Service == "" {
|
||
|
return ErrMissingService
|
||
|
}
|
||
|
|
||
|
if i.Version == "" {
|
||
|
return ErrMissingVersion
|
||
|
}
|
||
|
|
||
|
if i.Name == "" {
|
||
|
return ErrMissingName
|
||
|
}
|
||
|
|
||
|
path := fmt.Sprintf("/service/%s/version/%s/request_settings/%s", i.Service, i.Version, i.Name)
|
||
|
resp, err := c.Delete(path, nil)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
var r *statusResp
|
||
|
if err := decodeJSON(&r, resp.Body); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if !r.Ok() {
|
||
|
return fmt.Errorf("Not Ok")
|
||
|
}
|
||
|
return nil
|
||
|
}
|