From f57ba6aa873bf677280c84b969b5e7a1b95c99b9 Mon Sep 17 00:00:00 2001 From: Richard Noble Date: Mon, 15 Feb 2021 10:42:25 +0000 Subject: [PATCH 1/5] Update Common to send a status code as part of the HTTP response. This, and the inclusion of the request allows us to act according to requests that couldn't be sent, and ones that we're sent, and an attempt made at handling them, but failed. --- common/util.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/common/util.go b/common/util.go index 2cd652a4..49f009f6 100644 --- a/common/util.go +++ b/common/util.go @@ -52,14 +52,15 @@ func ParseConnectorMetadata() (ConnectorMetadata, error) { } // HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns response on success or error in case of failure -func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (*http.Response, error) { +func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (int, *http.Response, error) { var resp *http.Response for attempt := 0; attempt <= data.MaxRetries; attempt++ { // Create request req, err := http.NewRequest("POST", data.HTTPEndpoint, strings.NewReader(message)) if err != nil { - return nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + // Request not sent. + return -1, nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } // Add headers @@ -83,18 +84,19 @@ func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetada } if err == nil && resp.StatusCode >= 200 && resp.StatusCode < 300 { // Success, quit retrying - return resp, nil + return resp.StatusCode, resp, nil } } if resp == nil { - return nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + return -1, nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } if resp.StatusCode < 200 || resp.StatusCode > 300 { - return nil, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) + return resp.StatusCode, nil, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) + } - return resp, nil + return resp.StatusCode, resp, nil } //GetAwsConfig get's the configuration required to connect to aws From 34408900e64bbb6bd2be4cc0f4e3cbb3c71cce22 Mon Sep 17 00:00:00 2001 From: Richard Noble Date: Mon, 15 Feb 2021 10:47:12 +0000 Subject: [PATCH 2/5] Return response if the response is present, but it returns an error --- common/util.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/util.go b/common/util.go index 49f009f6..f20d5fc7 100644 --- a/common/util.go +++ b/common/util.go @@ -93,8 +93,7 @@ func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetada } if resp.StatusCode < 200 || resp.StatusCode > 300 { - return resp.StatusCode, nil, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) - + return resp.StatusCode, resp, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) } return resp.StatusCode, resp, nil } From 6ef5e629255b155bbe59591785ef5fd5e7be3e40 Mon Sep 17 00:00:00 2001 From: Richard Noble Date: Mon, 15 Feb 2021 11:00:46 +0000 Subject: [PATCH 3/5] Changed the response code to a pointer, this allows us to return nil if we don't have a response code --- common/util.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/util.go b/common/util.go index f20d5fc7..108803ad 100644 --- a/common/util.go +++ b/common/util.go @@ -52,7 +52,7 @@ func ParseConnectorMetadata() (ConnectorMetadata, error) { } // HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns response on success or error in case of failure -func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (int, *http.Response, error) { +func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (*int, *http.Response, error) { var resp *http.Response for attempt := 0; attempt <= data.MaxRetries; attempt++ { @@ -60,7 +60,7 @@ func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetada req, err := http.NewRequest("POST", data.HTTPEndpoint, strings.NewReader(message)) if err != nil { // Request not sent. - return -1, nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + return nil, nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } // Add headers @@ -84,18 +84,18 @@ func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetada } if err == nil && resp.StatusCode >= 200 && resp.StatusCode < 300 { // Success, quit retrying - return resp.StatusCode, resp, nil + return &resp.StatusCode, resp, nil } } if resp == nil { - return -1, nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + return nil, nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } if resp.StatusCode < 200 || resp.StatusCode > 300 { - return resp.StatusCode, resp, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) + return &resp.StatusCode, resp, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) } - return resp.StatusCode, resp, nil + return &resp.StatusCode, resp, nil } //GetAwsConfig get's the configuration required to connect to aws From cefec023c6aef94a45d7298a1eb786f8bb57ce4e Mon Sep 17 00:00:00 2001 From: Richard Noble Date: Mon, 15 Feb 2021 11:05:32 +0000 Subject: [PATCH 4/5] Add better method docs to HandleHTTPRequest --- common/util.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/util.go b/common/util.go index 108803ad..eb16723f 100644 --- a/common/util.go +++ b/common/util.go @@ -51,7 +51,8 @@ func ParseConnectorMetadata() (ConnectorMetadata, error) { return meta, nil } -// HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns response on success or error in case of failure +// HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns the HTTP response code (pass or fail, but nil on failed request), +// the response (nil on failed request) and an error in case of failure in either request or in the server's handling of the request func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (*int, *http.Response, error) { var resp *http.Response From c9042ae6ac2c9343e888bc2ba44e8b181d570bb8 Mon Sep 17 00:00:00 2001 From: Nikhil Sharma Date: Wed, 12 Apr 2023 15:36:29 +0530 Subject: [PATCH 5/5] Fix --- common/util.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/common/util.go b/common/util.go index eb16723f..48c4be8f 100644 --- a/common/util.go +++ b/common/util.go @@ -51,17 +51,15 @@ func ParseConnectorMetadata() (ConnectorMetadata, error) { return meta, nil } -// HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns the HTTP response code (pass or fail, but nil on failed request), -// the response (nil on failed request) and an error in case of failure in either request or in the server's handling of the request -func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (*int, *http.Response, error) { +// HandleHTTPRequest sends message and headers data to HTTP endpoint using POST method and returns response on success or error in case of failure +func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetadata, logger *zap.Logger) (*http.Response, error) { var resp *http.Response for attempt := 0; attempt <= data.MaxRetries; attempt++ { // Create request req, err := http.NewRequest("POST", data.HTTPEndpoint, strings.NewReader(message)) if err != nil { - // Request not sent. - return nil, nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + return nil, errors.Wrapf(err, "failed to create HTTP request to invoke function. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } // Add headers @@ -85,21 +83,21 @@ func HandleHTTPRequest(message string, headers http.Header, data ConnectorMetada } if err == nil && resp.StatusCode >= 200 && resp.StatusCode < 300 { // Success, quit retrying - return &resp.StatusCode, resp, nil + return resp, nil } } if resp == nil { - return nil, nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) + return nil, fmt.Errorf("every function invocation retry failed; final retry gave empty response. http_endpoint: %v, source: %v", data.HTTPEndpoint, data.SourceName) } if resp.StatusCode < 200 || resp.StatusCode > 300 { - return &resp.StatusCode, resp, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) + return resp, fmt.Errorf("request returned failure: %v. http_endpoint: %v, source: %v", resp.StatusCode, data.HTTPEndpoint, data.SourceName) } - return &resp.StatusCode, resp, nil + return resp, nil } -//GetAwsConfig get's the configuration required to connect to aws +// GetAwsConfig get's the configuration required to connect to aws func GetAwsConfig() (*aws.Config, error) { if os.Getenv("AWS_REGION") == "" { return nil, errors.New("aws region required")