From 400762c16bf13c8a4753a6a4a89c8b71eb38533e Mon Sep 17 00:00:00 2001 From: Ouahid Khelifi Date: Wed, 27 Mar 2024 10:05:35 +0100 Subject: [PATCH] fix: update logs sent on groovy script error --- .../gravitee/policy/groovy/GroovyPolicy.java | 6 +- .../groovy/GroovyPolicyIntegrationTest.java | 84 +++++++++++++++++++ .../apis/api-fail-execute-request-script.json | 44 ++++++++++ .../api-fail-execute-response-script.json | 44 ++++++++++ .../apis/api-fail-parse-request-content.json | 44 ++++++++++ .../apis/api-fail-parse-response-content.json | 44 ++++++++++ 6 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/apis/api-fail-execute-request-script.json create mode 100644 src/test/resources/apis/api-fail-execute-response-script.json create mode 100644 src/test/resources/apis/api-fail-parse-request-content.json create mode 100644 src/test/resources/apis/api-fail-parse-response-content.json diff --git a/src/main/java/io/gravitee/policy/groovy/GroovyPolicy.java b/src/main/java/io/gravitee/policy/groovy/GroovyPolicy.java index 9c259b6..25e4cf8 100644 --- a/src/main/java/io/gravitee/policy/groovy/GroovyPolicy.java +++ b/src/main/java/io/gravitee/policy/groovy/GroovyPolicy.java @@ -112,7 +112,7 @@ public ReadWriteStream onResponseContent( } } catch (Throwable t) { logger.error("Unable to run Groovy script", t); - throw new TransformationException("Unable to run Groovy script: " + t.getMessage(), t); + throw new TransformationException("Internal Server Error"); } return null; } @@ -168,7 +168,7 @@ public ReadWriteStream onRequestContent( } } catch (Throwable t) { logger.error("Unable to run Groovy script", t); - throw new TransformationException("Unable to run Groovy script: " + t.getMessage(), t); + throw new TransformationException("Internal Server Error"); } return null; } @@ -222,7 +222,7 @@ private String executeScript( } } catch (Throwable t) { logger.error("Unable to run Groovy script", t); - policyChain.failWith(io.gravitee.policy.api.PolicyResult.failure(t.getMessage())); + policyChain.failWith(io.gravitee.policy.api.PolicyResult.failure("Internal Server Error")); } } diff --git a/src/test/java/io/gravitee/policy/groovy/GroovyPolicyIntegrationTest.java b/src/test/java/io/gravitee/policy/groovy/GroovyPolicyIntegrationTest.java index 9aa5e50..f5bd982 100644 --- a/src/test/java/io/gravitee/policy/groovy/GroovyPolicyIntegrationTest.java +++ b/src/test/java/io/gravitee/policy/groovy/GroovyPolicyIntegrationTest.java @@ -146,4 +146,88 @@ void should_use_response_template_when_key_provided(WebClient client) { wiremock.verify(0, postRequestedFor(urlPathEqualTo("/team"))); } + + @Test + @DeployApi("/apis/api-fail-parse-response-content.json") + void should_throw_exception_on_response_content(WebClient client) { + wiremock.stubFor(post("/team").willReturn(ok("[{\"foo\", \"bar\"},\"bar\": \"baz\"]"))); + + client + .post("/test") + .rxSend() + .test() + .awaitDone(5, TimeUnit.SECONDS) + .assertValue( + response -> { + assertThat(response.statusCode()).isEqualTo(500); + assertThat(response.bodyAsString()).contains("Internal Server Error"); + return true; + } + ) + .assertComplete() + .assertNoErrors(); + } + + @Test + @DeployApi("/apis/api-fail-parse-request-content.json") + void should_throw_exception_on_request_content(WebClient client) { + wiremock.stubFor(post("/team").willReturn(ok(""))); + + client + .post("/test") + .rxSendJson("[{\"foo\": \"bar\"}, {\"bar\": \"baz\"}]") + .test() + .awaitDone(5, TimeUnit.SECONDS) + .assertValue( + response -> { + assertThat(response.statusCode()).isEqualTo(500); + assertThat(response.bodyAsString()).contains("Internal Server Error"); + return true; + } + ) + .assertComplete() + .assertNoErrors(); + } + + @Test + @DeployApi("/apis/api-fail-execute-response-script.json") + void should_throw_exception_on_response(WebClient client) { + wiremock.stubFor(post("/team").willReturn(ok(""))); + + client + .post("/test") + .rxSend() + .test() + .awaitDone(5, TimeUnit.SECONDS) + .assertValue( + response -> { + assertThat(response.statusCode()).isEqualTo(500); + assertThat(response.bodyAsString()).contains("Internal Server Error"); + return true; + } + ) + .assertComplete() + .assertNoErrors(); + } + + @Test + @DeployApi("/apis/api-fail-execute-request-script.json") + void should_throw_exception_on_request(WebClient client) { + wiremock.stubFor(post("/team").willReturn(ok(""))); + + client + .post("/test") + .rxSend() + .test() + .awaitDone(5, TimeUnit.SECONDS) + .assertValue( + response -> { + assertThat(response.statusCode()).isEqualTo(500); + assertThat(response.bodyAsString()).contains("Internal Server Error"); + return true; + } + ) + .assertComplete() + .assertNoErrors(); + } } diff --git a/src/test/resources/apis/api-fail-execute-request-script.json b/src/test/resources/apis/api-fail-execute-request-script.json new file mode 100644 index 0000000..7fa68c6 --- /dev/null +++ b/src/test/resources/apis/api-fail-execute-request-script.json @@ -0,0 +1,44 @@ +{ + "id": "api-fail-response-template", + "name": "my-api", + "gravitee": "2.0.0", + "proxy": { + "context_path": "/test", + "endpoints": [ + { + "name": "default", + "target": "http://localhost:8080/team", + "http": { + "connectTimeout": 3000, + "readTimeout": 60000 + } + } + ] + }, + "flows": [ + { + "name": "flow-1", + "methods": [ + ], + "enabled": true, + "path-operator": { + "path": "/", + "operator": "STARTS_WITH" + }, + "pre": [ + { + "name": "Groovy", + "description": "", + "enabled": true, + "policy": "groovy", + "configuration": { + "scope": "REQUEST", + "onRequestScript": "def foo= nes azdazdaa();" + } + } + ], + "post": [] + } + ], + "resources": [] +} \ No newline at end of file diff --git a/src/test/resources/apis/api-fail-execute-response-script.json b/src/test/resources/apis/api-fail-execute-response-script.json new file mode 100644 index 0000000..6f5ca95 --- /dev/null +++ b/src/test/resources/apis/api-fail-execute-response-script.json @@ -0,0 +1,44 @@ +{ + "id": "api-fail-response-template", + "name": "my-api", + "gravitee": "2.0.0", + "proxy": { + "context_path": "/test", + "endpoints": [ + { + "name": "default", + "target": "http://localhost:8080/team", + "http": { + "connectTimeout": 3000, + "readTimeout": 60000 + } + } + ] + }, + "flows": [ + { + "name": "flow-1", + "methods": [ + ], + "enabled": true, + "path-operator": { + "path": "/", + "operator": "STARTS_WITH" + }, + "pre": [], + "post": [ + { + "name": "Groovy", + "description": "", + "enabled": true, + "policy": "groovy", + "configuration": { + "scope": "RESPONSE", + "onResponseScript": "def foo= azkcaznc();" + } + } + ] + } + ], + "resources": [] +} \ No newline at end of file diff --git a/src/test/resources/apis/api-fail-parse-request-content.json b/src/test/resources/apis/api-fail-parse-request-content.json new file mode 100644 index 0000000..6e0ab51 --- /dev/null +++ b/src/test/resources/apis/api-fail-parse-request-content.json @@ -0,0 +1,44 @@ +{ + "id": "api-fail-response-template", + "name": "my-api", + "gravitee": "2.0.0", + "proxy": { + "context_path": "/test", + "endpoints": [ + { + "name": "default", + "target": "http://localhost:8080/team", + "http": { + "connectTimeout": 3000, + "readTimeout": 60000 + } + } + ] + }, + "flows": [ + { + "name": "flow-1", + "methods": [ + ], + "enabled": true, + "path-operator": { + "path": "/", + "operator": "STARTS_WITH" + }, + "pre": [ + { + "name": "Groovy", + "description": "", + "enabled": true, + "policy": "groovy", + "configuration": { + "scope": "REQUEST", + "onRequestContentScript": "import groovy.json.JsonSlurper\nimport groovy.json.JsonOutput\n\ndef jsonSlurper = new JsonSlurper()\ndef content = jsonSlurper.parseText(response.content)\nreturn JsonOutput.toJson(content)" + } + } + ], + "post": [] + } + ], + "resources": [] +} \ No newline at end of file diff --git a/src/test/resources/apis/api-fail-parse-response-content.json b/src/test/resources/apis/api-fail-parse-response-content.json new file mode 100644 index 0000000..312809e --- /dev/null +++ b/src/test/resources/apis/api-fail-parse-response-content.json @@ -0,0 +1,44 @@ +{ + "id": "api-fail-response-template", + "name": "my-api", + "gravitee": "2.0.0", + "proxy": { + "context_path": "/test", + "endpoints": [ + { + "name": "default", + "target": "http://localhost:8080/team", + "http": { + "connectTimeout": 3000, + "readTimeout": 60000 + } + } + ] + }, + "flows": [ + { + "name": "flow-1", + "methods": [ + ], + "enabled": true, + "path-operator": { + "path": "/", + "operator": "STARTS_WITH" + }, + "pre": [], + "post": [ + { + "name": "Groovy", + "description": "", + "enabled": true, + "policy": "groovy", + "configuration": { + "scope": "RESPONSE", + "onResponseContentScript": "import groovy.json.JsonSlurper\nimport groovy.json.JsonOutput\n\ndef jsonSlurper = new JsonSlurper()\ndef content = jsonSlurper.parseText(response.content)\nreturn JsonOutput.toJson(content)" + } + } + ] + } + ], + "resources": [] +} \ No newline at end of file