From 7d4a00c75865566e49ec5080da2d94364f051f6d Mon Sep 17 00:00:00 2001 From: Marcio Soster Arrosi Date: Tue, 24 Sep 2024 15:44:11 -0300 Subject: [PATCH] feat (RESTConnector) : add option to throw exception when http status is error if a response status code is not >= 200 or <400 will throw an exception if user checks the new "Throw on error status" checkbox. --- .../rest/AbstractRESTConnectorImpl.java | 14 +++++++ .../connectors/rest/RESTConnector.java | 10 ++++- src/main/resources-filtered/rest-delete.def | 2 + .../resources-filtered/rest-file-post.def | 2 + src/main/resources-filtered/rest-file-put.def | 2 + src/main/resources-filtered/rest-get.def | 2 + src/main/resources-filtered/rest-head.def | 2 + src/main/resources-filtered/rest-post.def | 2 + src/main/resources-filtered/rest-put.def | 2 + src/main/resources/rest-delete.properties | 2 + src/main/resources/rest-delete_es.properties | 2 + src/main/resources/rest-delete_fr.properties | 2 + src/main/resources/rest-delete_ja.properties | 2 + src/main/resources/rest-file-post.properties | 2 + .../resources/rest-file-post_es.properties | 2 + .../resources/rest-file-post_fr.properties | 3 +- .../resources/rest-file-post_ja.properties | 2 + src/main/resources/rest-file-put.properties | 2 + .../resources/rest-file-put_es.properties | 2 + .../resources/rest-file-put_fr.properties | 3 +- .../resources/rest-file-put_ja.properties | 2 + src/main/resources/rest-get.properties | 2 + src/main/resources/rest-get_es.properties | 2 + src/main/resources/rest-get_fr.properties | 3 +- src/main/resources/rest-get_ja.properties | 2 + src/main/resources/rest-head.properties | 2 + src/main/resources/rest-head_es.properties | 2 + src/main/resources/rest-head_fr.properties | 2 + src/main/resources/rest-head_ja.properties | 2 + src/main/resources/rest-post.properties | 2 + src/main/resources/rest-post_es.properties | 2 + src/main/resources/rest-post_fr.properties | 3 +- src/main/resources/rest-post_ja.properties | 2 + src/main/resources/rest-put.properties | 2 + src/main/resources/rest-put_es.properties | 2 + src/main/resources/rest-put_fr.properties | 3 +- src/main/resources/rest-put_ja.properties | 2 + .../connectors/rest/RESTConnectorTest.java | 41 +++++++++++++++++++ 38 files changed, 134 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/bonitasoft/connectors/rest/AbstractRESTConnectorImpl.java b/src/main/java/org/bonitasoft/connectors/rest/AbstractRESTConnectorImpl.java index 86da44e..4209316 100644 --- a/src/main/java/org/bonitasoft/connectors/rest/AbstractRESTConnectorImpl.java +++ b/src/main/java/org/bonitasoft/connectors/rest/AbstractRESTConnectorImpl.java @@ -28,6 +28,7 @@ public abstract class AbstractRESTConnectorImpl extends AbstractConnector { protected static final String METHOD_INPUT_PARAMETER = "method"; protected static final String CONTENTTYPE_INPUT_PARAMETER = "contentType"; protected static final String CHARSET_INPUT_PARAMETER = "charset"; + protected static final String THROW_ON_ERROR_INPUT_PARAMETER = "throwOnErrorStatus"; protected static final String URLCOOKIES_INPUT_PARAMETER = "urlCookies"; protected static final String URLHEADERS_INPUT_PARAMETER = "urlHeaders"; protected static final String DOCUMENT_BODY_INPUT_PARAMETER = "documentBody"; @@ -80,6 +81,11 @@ protected final String getCharset() { return (java.lang.String) getInputParameter(CHARSET_INPUT_PARAMETER); } + protected final Boolean getThrowOnErrorStatus() { + final Boolean throwOnError = (Boolean) getInputParameter(THROW_ON_ERROR_INPUT_PARAMETER); + return throwOnError != null ? throwOnError : Boolean.FALSE; + } + @SuppressWarnings("unchecked") protected final List> getUrlCookies() { List> cookies = (List>) getInputParameter(URLCOOKIES_INPUT_PARAMETER); @@ -478,6 +484,14 @@ void validateCharset() throws ConnectorValidationException { } } + void validateThrowOnError() throws ConnectorValidationException { + try { + getThrowOnErrorStatus(); + } catch (final ClassCastException cce) { + throw new ConnectorValidationException("throwOnErrorStatus type is invalid"); + } + } + void validateContentType() throws ConnectorValidationException { try { getContentType(); diff --git a/src/main/java/org/bonitasoft/connectors/rest/RESTConnector.java b/src/main/java/org/bonitasoft/connectors/rest/RESTConnector.java index 7fb8aad..3ba60f5 100644 --- a/src/main/java/org/bonitasoft/connectors/rest/RESTConnector.java +++ b/src/main/java/org/bonitasoft/connectors/rest/RESTConnector.java @@ -571,12 +571,20 @@ public void execute(final Request request) throws Exception { final CloseableHttpResponse httpResponse = httpClient.execute(httpRequest, httpContext); LOGGER.fine("Response recieved."); final int statusCode = httpResponse.getStatusLine().getStatusCode(); + final String reasonPhrase = httpResponse.getStatusLine().getReasonPhrase(); + if (!statusSuccessful(statusCode)) { LOGGER.warning( () -> String.format( "%s response status is not successful: %s - %s", - request, statusCode, httpResponse.getStatusLine().getReasonPhrase())); + request, statusCode, reasonPhrase)); + + if(Boolean.TRUE.equals(getThrowOnErrorStatus())){ + throw new ConnectorException( + String.format("%s response status is not successful: %s - %s", request, statusCode, reasonPhrase)); + } } + setOutputs(httpResponse, request); } finally { try { diff --git a/src/main/resources-filtered/rest-delete.def b/src/main/resources-filtered/rest-delete.def index 6d8817f..5a1d95f 100644 --- a/src/main/resources-filtered/rest-delete.def +++ b/src/main/resources-filtered/rest-delete.def @@ -32,6 +32,7 @@ + @@ -43,6 +44,7 @@ + diff --git a/src/main/resources-filtered/rest-file-post.def b/src/main/resources-filtered/rest-file-post.def index 2ec9002..f9cbf2b 100644 --- a/src/main/resources-filtered/rest-file-post.def +++ b/src/main/resources-filtered/rest-file-post.def @@ -35,6 +35,7 @@ + @@ -54,6 +55,7 @@ text/plain text/xml + diff --git a/src/main/resources-filtered/rest-file-put.def b/src/main/resources-filtered/rest-file-put.def index 05f5c82..477e97a 100644 --- a/src/main/resources-filtered/rest-file-put.def +++ b/src/main/resources-filtered/rest-file-put.def @@ -35,6 +35,7 @@ + @@ -54,6 +55,7 @@ text/plain text/xml + diff --git a/src/main/resources-filtered/rest-get.def b/src/main/resources-filtered/rest-get.def index 79f5ebe..c78a39e 100644 --- a/src/main/resources-filtered/rest-get.def +++ b/src/main/resources-filtered/rest-get.def @@ -32,6 +32,7 @@ + @@ -43,6 +44,7 @@ + diff --git a/src/main/resources-filtered/rest-head.def b/src/main/resources-filtered/rest-head.def index 18c0268..83ac8f1 100644 --- a/src/main/resources-filtered/rest-head.def +++ b/src/main/resources-filtered/rest-head.def @@ -32,6 +32,7 @@ + @@ -42,6 +43,7 @@ + diff --git a/src/main/resources-filtered/rest-post.def b/src/main/resources-filtered/rest-post.def index 2f1af23..c135339 100644 --- a/src/main/resources-filtered/rest-post.def +++ b/src/main/resources-filtered/rest-post.def @@ -35,6 +35,7 @@ + @@ -55,6 +56,7 @@ text/plain text/xml + diff --git a/src/main/resources-filtered/rest-put.def b/src/main/resources-filtered/rest-put.def index 7ecca7e..87c42f1 100644 --- a/src/main/resources-filtered/rest-put.def +++ b/src/main/resources-filtered/rest-put.def @@ -35,6 +35,7 @@ + @@ -55,6 +56,7 @@ text/plain text/xml + diff --git a/src/main/resources/rest-delete.properties b/src/main/resources/rest-delete.properties index 4baef60..7a903fe 100644 --- a/src/main/resources/rest-delete.properties +++ b/src/main/resources/rest-delete.properties @@ -71,3 +71,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-delete_es.properties b/src/main/resources/rest-delete_es.properties index df2f63c..a3ef8fc 100644 --- a/src/main/resources/rest-delete_es.properties +++ b/src/main/resources/rest-delete_es.properties @@ -71,3 +71,5 @@ proxy_username_widget.description=El nombre de usuario si se requiere autenticac proxy_password_widget.label=Contraseña proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error \ No newline at end of file diff --git a/src/main/resources/rest-delete_fr.properties b/src/main/resources/rest-delete_fr.properties index f4dbac1..a48073b 100644 --- a/src/main/resources/rest-delete_fr.properties +++ b/src/main/resources/rest-delete_fr.properties @@ -65,3 +65,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur \ No newline at end of file diff --git a/src/main/resources/rest-delete_ja.properties b/src/main/resources/rest-delete_ja.properties index 17f9b20..5fd6581 100644 --- a/src/main/resources/rest-delete_ja.properties +++ b/src/main/resources/rest-delete_ja.properties @@ -65,3 +65,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-file-post.properties b/src/main/resources/rest-file-post.properties index 6cc2c23..350e581 100644 --- a/src/main/resources/rest-file-post.properties +++ b/src/main/resources/rest-file-post.properties @@ -77,3 +77,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-file-post_es.properties b/src/main/resources/rest-file-post_es.properties index bbe6f2f..bddf5aa 100644 --- a/src/main/resources/rest-file-post_es.properties +++ b/src/main/resources/rest-file-post_es.properties @@ -68,3 +68,5 @@ proxy_username_widget.label=Usuario proxy_password_widget.label=Contraseña #proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-file-post_fr.properties b/src/main/resources/rest-file-post_fr.properties index 11186d7..94d4fc6 100644 --- a/src/main/resources/rest-file-post_fr.properties +++ b/src/main/resources/rest-file-post_fr.properties @@ -71,4 +71,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. - +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-file-post_ja.properties b/src/main/resources/rest-file-post_ja.properties index 3f735e3..9d91131 100644 --- a/src/main/resources/rest-file-post_ja.properties +++ b/src/main/resources/rest-file-post_ja.properties @@ -68,3 +68,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-file-put.properties b/src/main/resources/rest-file-put.properties index d51afbe..b910906 100644 --- a/src/main/resources/rest-file-put.properties +++ b/src/main/resources/rest-file-put.properties @@ -77,3 +77,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-file-put_es.properties b/src/main/resources/rest-file-put_es.properties index 06716a1..a86be07 100644 --- a/src/main/resources/rest-file-put_es.properties +++ b/src/main/resources/rest-file-put_es.properties @@ -67,3 +67,5 @@ proxy_username_widget.description=El nombre de usuario si se requiere autenticac proxy_password_widget.label=Contraseña proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-file-put_fr.properties b/src/main/resources/rest-file-put_fr.properties index 32053a1..39223a2 100644 --- a/src/main/resources/rest-file-put_fr.properties +++ b/src/main/resources/rest-file-put_fr.properties @@ -71,4 +71,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. - +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-file-put_ja.properties b/src/main/resources/rest-file-put_ja.properties index 3091bff..6967b86 100644 --- a/src/main/resources/rest-file-put_ja.properties +++ b/src/main/resources/rest-file-put_ja.properties @@ -68,3 +68,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-get.properties b/src/main/resources/rest-get.properties index b6ccb35..c630bef 100644 --- a/src/main/resources/rest-get.properties +++ b/src/main/resources/rest-get.properties @@ -78,3 +78,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-get_es.properties b/src/main/resources/rest-get_es.properties index 87efd0a..91c9b27 100644 --- a/src/main/resources/rest-get_es.properties +++ b/src/main/resources/rest-get_es.properties @@ -66,3 +66,5 @@ proxy_password_widget.label=Contraseña proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. urlWidget.example=http://myserver.com/API/myRESTResource?param1=value1¶m2=value2 +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-get_fr.properties b/src/main/resources/rest-get_fr.properties index facda74..e8375b2 100644 --- a/src/main/resources/rest-get_fr.properties +++ b/src/main/resources/rest-get_fr.properties @@ -66,4 +66,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. - +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-get_ja.properties b/src/main/resources/rest-get_ja.properties index ac9a027..28ced0e 100644 --- a/src/main/resources/rest-get_ja.properties +++ b/src/main/resources/rest-get_ja.properties @@ -72,3 +72,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-head.properties b/src/main/resources/rest-head.properties index 97df67c..f44e91e 100644 --- a/src/main/resources/rest-head.properties +++ b/src/main/resources/rest-head.properties @@ -71,3 +71,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-head_es.properties b/src/main/resources/rest-head_es.properties index b767ee1..73f1dbb 100644 --- a/src/main/resources/rest-head_es.properties +++ b/src/main/resources/rest-head_es.properties @@ -71,3 +71,5 @@ proxy_username_widget.description=El nombre de usuario si se requiere autenticac proxy_password_widget.label=Contraseña proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-head_fr.properties b/src/main/resources/rest-head_fr.properties index d097206..2b62180 100644 --- a/src/main/resources/rest-head_fr.properties +++ b/src/main/resources/rest-head_fr.properties @@ -65,3 +65,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-head_ja.properties b/src/main/resources/rest-head_ja.properties index fb9cf2f..81f2afd 100644 --- a/src/main/resources/rest-head_ja.properties +++ b/src/main/resources/rest-head_ja.properties @@ -72,3 +72,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-post.properties b/src/main/resources/rest-post.properties index b4b24a7..ec3d729 100644 --- a/src/main/resources/rest-post.properties +++ b/src/main/resources/rest-post.properties @@ -77,3 +77,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-post_es.properties b/src/main/resources/rest-post_es.properties index 6fa8d20..5d6f128 100644 --- a/src/main/resources/rest-post_es.properties +++ b/src/main/resources/rest-post_es.properties @@ -71,3 +71,5 @@ proxy_username_widget.label=Usuario proxy_password_widget.label=Contraseña #proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-post_fr.properties b/src/main/resources/rest-post_fr.properties index 5907a3d..1d3e190 100644 --- a/src/main/resources/rest-post_fr.properties +++ b/src/main/resources/rest-post_fr.properties @@ -71,4 +71,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. - +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-post_ja.properties b/src/main/resources/rest-post_ja.properties index e572bdf..7f6b450 100644 --- a/src/main/resources/rest-post_ja.properties +++ b/src/main/resources/rest-post_ja.properties @@ -71,3 +71,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/main/resources/rest-put.properties b/src/main/resources/rest-put.properties index 8abc479..e0391ce 100644 --- a/src/main/resources/rest-put.properties +++ b/src/main/resources/rest-put.properties @@ -79,3 +79,5 @@ proxy_password_widget.label=Password outputsDescription=If the response Content-Type is Json compatible, use the 'bodyAsObject' output to quickly access your data in a script (e.g: bodyAsObject.user.name, or, in the case of an array, bodyAsObject[0].user.name), use the 'bodyAsString' output otherwise. socket_timeout_ms_widget.label=Socket timeout connection_timeout_ms_widget.label=Connection timeout +throwOnErrorStatusWidget.description=If checked, no outputs will be sent, and an error will be thrown if the status code is not between 200 and 399. +throwOnErrorStatusWidget.label=Throw on error status \ No newline at end of file diff --git a/src/main/resources/rest-put_es.properties b/src/main/resources/rest-put_es.properties index 718aeab..e365bc9 100644 --- a/src/main/resources/rest-put_es.properties +++ b/src/main/resources/rest-put_es.properties @@ -70,3 +70,5 @@ proxy_username_widget.description=El nombre de usuario si se requiere autenticac proxy_password_widget.label=Contraseña proxy_password_widget.description=La contraseña si se requiere autenticación desde el servidor proxy outputsDescription=Si la respuesta Content-Type es compatible con Json, usa la salida 'bodyAsObject' para acceder rápidamente a los datos en un script (ejemplo: bodyAsObject.user.name o, en el caso de un Array, bodyAsObject[0].userName). Si no es compatible, usa la salida 'bodyAsString'. +throwOnErrorStatusWidget.description=Si se selecciona, no se enviará ninguna salida y se generará un error si el código de estado no está entre 200 y 399. +throwOnErrorStatusWidget.label=Lanzar en el estado de error diff --git a/src/main/resources/rest-put_fr.properties b/src/main/resources/rest-put_fr.properties index 75a1681..36dc108 100644 --- a/src/main/resources/rest-put_fr.properties +++ b/src/main/resources/rest-put_fr.properties @@ -71,4 +71,5 @@ proxy_password_widget.label=Mot de passe Advanced.pageTitle=Paramètres avancés (optionnel) Advanced.pageDescription=Saisissez les paramètres avancés du connecteur REST. outputsDescription=Si le Content-Type (type de contenu) de la réponse est compatible avec JSON, utilisez la sortie 'bodyAsObject' pour accéder rapidement à vos données dans un script (e.g: bodyAsObject.user.name, ou, dans le cas d'un tableau, bodyAsObject[0].user.name), sinon utilisez la sortie 'bodyAsString'. - +throwOnErrorStatusWidget.description=Si cette case est cochée, aucune sortie n'est envoyée et une erreur est générée si le code d'état n'est pas compris entre 200 et 399 +throwOnErrorStatusWidget.label=Activer l'état d'erreur diff --git a/src/main/resources/rest-put_ja.properties b/src/main/resources/rest-put_ja.properties index 30d6d87..4d9443b 100644 --- a/src/main/resources/rest-put_ja.properties +++ b/src/main/resources/rest-put_ja.properties @@ -71,3 +71,5 @@ proxy_username_widget.label=ユーザー名 proxy_password_widget.label=パスワード #proxy_password_widget.description=プロキシ・サーバーから認証が要求される場合のパスワード outputsDescription=レスポンスの Content-Type が JSON 互換の場合、スクリプトでデータを素早くアクセスするには、'bodyAsObject' output (例: bodyAsObject.user.name または bodyAsObject[0].userName)を使用します。その他の場合は、'bodyAsString' output を使用します。 +throwOnErrorStatusWidget.description=チェックされている場合、出力は送信されず、ステータスコードが200から399の間でない場合はエラーが発生します。 +throwOnErrorStatusWidget.label=エラーステータスをスローする diff --git a/src/test/java/org/bonitasoft/connectors/rest/RESTConnectorTest.java b/src/test/java/org/bonitasoft/connectors/rest/RESTConnectorTest.java index af500cf..b175bf1 100644 --- a/src/test/java/org/bonitasoft/connectors/rest/RESTConnectorTest.java +++ b/src/test/java/org/bonitasoft/connectors/rest/RESTConnectorTest.java @@ -500,6 +500,16 @@ public void testProxyProtocolParameter() throws Exception { assertThrows(ConnectorValidationException.class , () -> connector.validateProxyProtocol()); } + + @Test + public void testThrowOnErrorStatusParameter() throws Exception { + var connector = new RESTConnector(false); + Map input = new HashMap<>(); + input.put(RESTConnector.THROW_ON_ERROR_INPUT_PARAMETER, "true"); + connector.setInputParameters(input); + + assertThrows(ConnectorValidationException.class , () -> connector.validateThrowOnError()); + } /** @@ -1775,6 +1785,37 @@ public void should_support_url_encoded_content_type() throws Exception { checkResultIsPresent(executeConnector(parameters)); } + @Test + public void should_raise_exception_on_status_error() throws BonitaException { + stubFor( + post(urlEqualTo("/")) + .withHeader(WM_CONTENT_TYPE, equalTo(JSON + "; " + WM_CHARSET + "=" + UTF8)) + .willReturn( + aResponse() + .withStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR) + .withBody("{\"message\":\"Internal server error\"}") + .withHeader(WM_CONTENT_TYPE, JSON))); + + Map parameters = buildContentTypeParametersSet(JSON); + parameters.put(RESTConnector.THROW_ON_ERROR_INPUT_PARAMETER, true); + assertThrows(ConnectorException.class, () -> executeConnector(parameters)); + } + + @Test + public void should_not_raise_exception_on_status_error() throws BonitaException { + stubFor( + post(urlEqualTo("/")) + .withHeader(WM_CONTENT_TYPE, equalTo(JSON + "; " + WM_CHARSET + "=" + UTF8)) + .willReturn( + aResponse() + .withStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR) + .withBody("{\"message\":\"Internal server error\"}") + .withHeader(WM_CONTENT_TYPE, JSON))); + + Map parameters = buildContentTypeParametersSet(JSON); + checkResult(executeConnector(parameters), HttpStatus.SC_INTERNAL_SERVER_ERROR); + } + /** * Generic test: should return OK STATUS as the WireMock stub is set each time for the good * request shape