Skip to content

Commit

Permalink
Change error pages to full-update endpoint (#414)
Browse files Browse the repository at this point in the history
* Change error pages to full-update endpoint

* Change error pages to full-update endpoint

* fix tests

* Change error pages to full-update endpoint
  • Loading branch information
jonathan-el authored Apr 17, 2024
1 parent 5a90ce2 commit f673908
Show file tree
Hide file tree
Showing 4 changed files with 397 additions and 228 deletions.
178 changes: 127 additions & 51 deletions incapsula/client_application_delivery.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"log"
"net/http"
"strings"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
)

type Compression struct {
Expand All @@ -16,13 +18,6 @@ type Compression struct {
MinifyCss bool `json:"minify_css"`
MinifyStaticHtml bool `json:"minify_static_html"`
}
type CompressionStr struct {
FileCompression string `json:"file_compression"`
CompressionType string `json:"compression_type"`
MinifyJs string `json:"minify_js"`
MinifyCss string `json:"minify_css"`
MinifyStaticHtml string `json:"minify_static_html"`
}

type ImageCompression struct {
CompressJpeg bool `json:"compress_jpeg"`
Expand All @@ -31,13 +26,6 @@ type ImageCompression struct {
CompressPng bool `json:"compress_png"`
}

type ImageCompressionStr struct {
CompressJpeg string
ProgressiveImageRendering string
AggressiveCompression string
CompressPng string
}

type Network struct {
TcpPrePooling bool `json:"tcp_pre_pooling"`
OriginConnectionReuse bool `json:"origin_connection_reuse"`
Expand All @@ -48,16 +36,6 @@ type Network struct {
SslPort SslPort `json:"ssl_port"`
}

type NetworkStr struct {
TcpPrePooling string `json:"tcp_pre_pooling"`
OriginConnectionReuse string `json:"origin_connection_reuse"`
SupportNonSniClients string `json:"support_non_sni_clients"`
EnableHttp2 string `json:"enable_http2"`
Http2ToOrigin string `json:"http2_to_origin"`
Port Port `json:"port"`
SslPort SslPort `json:"ssl_port"`
}

type Port struct {
To string `json:"to"`
}
Expand All @@ -71,25 +49,20 @@ type Redirection struct {
RedirectHttpToHttps bool `json:"redirect_http_to_https"`
}

type RedirectionStr struct {
RedirectNakedToFullStr string `json:"redirect_naked_to_full"`
RedirectHttpToHttpsStr string `json:"redirect_http_to_https"`
}

type CustomErrorPageTemplates struct {
ErrorConnectionTimeout string `json:"error.type.connection_timeout"`
ErrorAccessDenied string `json:"error.type.access_denied"`
ErrorParseReqError string `json:"error.type.parse_req_error"`
ErrorParseRespError string `json:"error.type.parse_resp_error"`
ErrorConnectionFailed string `json:"error.type.connection_failed"`
ErrorSslFailed string `json:"error.type.ssl_failed"`
ErrorDenyAndCaptcha string `json:"error.type.deny_and_captcha"`
ErrorTypeNoSslConfig string `json:"error.type.no_ssl_config"`
ErrorAbpIdentificationFailed string `json:"error.type.abp_identification_failed"`
ErrorConnectionTimeout string `json:"error.type.connection_timeout,omitempty"`
ErrorAccessDenied string `json:"error.type.access_denied,omitempty"`
ErrorParseReqError string `json:"error.type.parse_req_error,omitempty"`
ErrorParseRespError string `json:"error.type.parse_resp_error,omitempty"`
ErrorConnectionFailed string `json:"error.type.connection_failed,omitempty"`
ErrorSslFailed string `json:"error.type.ssl_failed,omitempty"`
ErrorDenyAndCaptcha string `json:"error.type.deny_and_captcha,omitempty"`
ErrorTypeNoSslConfig string `json:"error.type.no_ssl_config,omitempty"`
ErrorAbpIdentificationFailed string `json:"error.type.abp_identification_failed,omitempty"`
}

type CustomErrorPage struct {
DefaultErrorPage string `json:"error_page_template"`
DefaultErrorPage string `json:"error_page_template,omitempty"`
CustomErrorPageTemplates CustomErrorPageTemplates `json:"custom_error_page_templates"`
}

Expand All @@ -98,51 +71,154 @@ type ApplicationDelivery struct {
ImageCompression ImageCompression `json:"image_compression"`
Network Network `json:"network"`
Redirection Redirection `json:"redirection"`
CustomErrorPage CustomErrorPage `json:"custom_error_page"`
}

func (c *Client) GetApplicationDelivery(siteID int) (*ApplicationDelivery, error) {
func (c *Client) GetApplicationDelivery(siteID int) (*ApplicationDelivery, diag.Diagnostics) {
log.Printf("[INFO] Getting Incapsula Application Delivery for Site ID %d", siteID)
return CrudApplicationDelivery("Read", siteID, http.MethodGet, nil, c)
}

func (c *Client) UpdateApplicationDelivery(siteID int, applicationDelivery *ApplicationDelivery) (*ApplicationDelivery, error) {
func (c *Client) UpdateApplicationDelivery(siteID int, applicationDelivery *ApplicationDelivery) (*ApplicationDelivery, diag.Diagnostics) {
log.Printf("[INFO] Updating Incapsula Application Delivery for Site ID %d", siteID)
var diags diag.Diagnostics
applicationDeliveryJSON, err := json.Marshal(applicationDelivery)
if err != nil {
return nil, fmt.Errorf("Failed to JSON marshal Application Delivery for SiteID: %s", err)
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: "Failed JSON marshalling Application Delivery resource",
Detail: fmt.Sprintf("Failed to JSON marshal Application Delivery for SiteID %d: %s", siteID, err),
})
return nil, diags
}
return CrudApplicationDelivery("Update", siteID, http.MethodPut, applicationDeliveryJSON, c)
}

func (c *Client) DeleteApplicationDelivery(siteID int) (*ApplicationDelivery, error) {
func (c *Client) DeleteApplicationDelivery(siteID int) (*ApplicationDelivery, diag.Diagnostics) {
log.Printf("[INFO] Deleting Incapsula Application Delivery for Site ID %d", siteID)
return CrudApplicationDelivery("Delete", siteID, http.MethodDelete, nil, c)
}

func CrudApplicationDelivery(action string, siteID int, hhtpMethod string, data []byte, c *Client) (*ApplicationDelivery, error) {
url := fmt.Sprintf("%s/sites/%d/settings/delivery", c.config.BaseURLRev2, siteID)
resp, err := c.DoJsonRequestWithHeaders(hhtpMethod, url, data, strings.ToLower(action)+"_application_delivery")
func CrudApplicationDelivery(action string, siteID int, httpMethod string, applicationDeliveyData []byte, c *Client) (*ApplicationDelivery, diag.Diagnostics) {
var diags diag.Diagnostics

if applicationDeliveyData != nil {
log.Printf("[DEBUG] Incapsula %s Application Delivery JSON request: %s\n", action, string(applicationDeliveyData))
}

applicationDeliveryUrl := fmt.Sprintf("%s/sites/%d/settings/delivery", c.config.BaseURLRev2, siteID)

resp, err := c.DoJsonRequestWithHeaders(httpMethod, applicationDeliveryUrl, applicationDeliveyData, strings.ToLower(action)+"_application_delivery")
if err != nil {
return nil, fmt.Errorf("[ERROR] Error from Incapsula service when trying to %s Application Delivery for Site ID %d: %s", strings.ToLower(action), siteID, err)
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error from Incapsula service when trying to %s Application Delivery", strings.ToLower(action)),
Detail: fmt.Sprintf("Error from Incapsula service when trying to %s Application Delivery for Site ID %d: %s", strings.ToLower(action), siteID, err),
})
return nil, diags
}

// Read the body
defer resp.Body.Close()
responseBody, err := ioutil.ReadAll(resp.Body)
log.Printf("[DEBUG] Incapsula %s Application Delivery JSON response: %s\n", action, string(responseBody))
log.Printf("[DEBUG] Incapsula %s Application Delivery JSON response: (%d) %s\n", action, resp.StatusCode, string(responseBody))

// Check the response code
if resp.StatusCode != 200 {
return nil, fmt.Errorf("Error status code %d from Incapsula service when %s Application Delivery for Site ID %d: %s", resp.StatusCode, strings.TrimSuffix(action, "e")+"ing", siteID, string(responseBody))
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error status code %d from Incapsula service when %s Application Delivery", resp.StatusCode, strings.TrimSuffix(action, "e")+"ing"),
Detail: fmt.Sprintf("Error status code %d from Incapsula service when %s Application Delivery for Site ID %d: %s", resp.StatusCode, strings.TrimSuffix(action, "e")+"ing", siteID, string(responseBody)),
})
return nil, diags
}

// Dump JSON
var applicationDelivery ApplicationDelivery
err = json.Unmarshal([]byte(responseBody), &applicationDelivery)
if err != nil {
return nil, fmt.Errorf("[ERROR] Error parsing Application Delivery Response JSON response for Site ID %d: %s\nresponse: %s", siteID, err, string(responseBody))
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error parsing Application Delivery Response JSON response"),
Detail: fmt.Sprintf("Error parsing Application Delivery Response JSON response for Site ID %d: %s\nresponse: %s", siteID, err, string(responseBody)),
})
return nil, diags
}

return &applicationDelivery, nil
}

func (c *Client) GetErrorPages(siteID int) (*CustomErrorPage, diag.Diagnostics) {
log.Printf("[INFO] Getting Incapsula Error Pages for Site ID %d", siteID)
return CrudErrorPages("Read", siteID, http.MethodGet, nil, c)
}

func (c *Client) UpdateErrorPages(siteID int, errorPages *CustomErrorPage) (*CustomErrorPage, diag.Diagnostics) {
log.Printf("[INFO] Updating Incapsula Application Delivery for Site ID %d", siteID)
var diags diag.Diagnostics
errorPagesJSON, err := json.Marshal(errorPages)
if err != nil {
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: "Failed JSON marshalling Error Pages resource",
Detail: fmt.Sprintf("Failed to JSON marshal Error Pages for SiteID %d: %s", siteID, err),
})
return nil, diags
}
return CrudErrorPages("Update", siteID, http.MethodPut, errorPagesJSON, c)
}

func (c *Client) DeleteErrorPages(siteID int) (*CustomErrorPage, diag.Diagnostics) {
log.Printf("[INFO] Deleting Incapsula Application Delivery for Site ID %d", siteID)
customErrorPage := CustomErrorPage{}
errorPagesJSON, _ := json.Marshal(customErrorPage)
return CrudErrorPages("Delete", siteID, http.MethodPut, errorPagesJSON, c)
}

func CrudErrorPages(action string, siteID int, httpMethod string, errorPagesData []byte, c *Client) (*CustomErrorPage, diag.Diagnostics) {
var diags diag.Diagnostics

if errorPagesData != nil {
log.Printf("[DEBUG] Incapsula %s Error Pages JSON request: %s\n", action, string(errorPagesData))
}

errorPagesUrl := fmt.Sprintf("%s/sites/%d/settings/delivery/error-pages", c.config.BaseURLRev2, siteID)

resp, err := c.DoJsonRequestWithHeaders(httpMethod, errorPagesUrl, errorPagesData, strings.ToLower(action)+"_error_pages")
if err != nil {
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error from Incapsula service when trying to %s Error Pages", strings.ToLower(action)),
Detail: fmt.Sprintf("Error from Incapsula service when trying to %s Error Pages for Site ID %d: %s", strings.ToLower(action), siteID, err),
})
return nil, diags
}

// Read the body
defer resp.Body.Close()
responseBody, _ := ioutil.ReadAll(resp.Body)
log.Printf("[DEBUG] Incapsula %s Error pages JSON response: (%d) %s\n", action, resp.StatusCode, string(responseBody))

// Check the response code
if resp.StatusCode != 200 {
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error status code %d from Incapsula service when %s Error Pages", resp.StatusCode, strings.TrimSuffix(action, "e")+"ing"),
Detail: fmt.Sprintf("Error status code %d from Incapsula service when %s Error Pages for Site ID %d: %s", resp.StatusCode, strings.TrimSuffix(action, "e")+"ing", siteID, string(responseBody)),
})
return nil, diags
}

// Dump JSON
var customErrorPage CustomErrorPage
err = json.Unmarshal([]byte(responseBody), &customErrorPage)
if err != nil {
diags = append(diags, diag.Diagnostic{
Severity: diag.Error,
Summary: fmt.Sprintf("Error parsing Error Pages Response JSON response for Site ID %d", siteID),
Detail: fmt.Sprintf("Error parsing Error Pages Response JSON response for Site ID %d: %s\nresponse: %s", siteID, err, string(responseBody)),
})
return nil, diags
}

return &customErrorPage, nil
}
Loading

0 comments on commit f673908

Please sign in to comment.