This is an automated email from the ASF dual-hosted git repository. ramyav pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git
The following commit(s) were added to refs/heads/master by this push: new 1342d11 [OLINGO-1479]Allow system query option select and expand for PUT/PATCH requests 1342d11 is described below commit 1342d11438242ef4b9294121200b599601b534e3 Author: ramya vasanth <ramya.vasa...@sap.com> AuthorDate: Thu Aug 27 11:30:06 2020 +0530 [OLINGO-1479]Allow system query option select and expand for PUT/PATCH requests --- .../server/core/uri/validator/UriValidator.java | 14 +++++++++-- .../core/uri/validator/UriValidatorTest.java | 28 ++++++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java index c38d372..3aedfc0 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/validator/UriValidator.java @@ -391,7 +391,7 @@ public class UriValidator { } } - } else if (!options.isEmpty()) { + } else if (!options.isEmpty() && !checkIfSelectOrExpand(options, httpMethod)) { StringBuilder optionsString = new StringBuilder(); for (final SystemQueryOption option : options) { optionsString.append(option.getName()).append(' '); @@ -403,7 +403,17 @@ public class UriValidator { } } - private boolean isAction(final UriInfo uriInfo) { + private boolean checkIfSelectOrExpand(List<SystemQueryOption> options, HttpMethod httpMethod) { + boolean isSelectOrExpand = false; + for (SystemQueryOption queryOption : options) { + isSelectOrExpand = ((queryOption.getKind() == SystemQueryOptionKind.EXPAND) || + (queryOption.getKind() == SystemQueryOptionKind.SELECT)) && + (httpMethod == HttpMethod.PUT || httpMethod == HttpMethod.PATCH); + } + return isSelectOrExpand; +} + +private boolean isAction(final UriInfo uriInfo) { List<UriResource> uriResourceParts = uriInfo.getUriResourceParts(); return !uriResourceParts.isEmpty() && UriResourceKind.action == uriResourceParts.get(uriResourceParts.size() - 1).getKind(); diff --git a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java index 3c39c41..25acb29 100644 --- a/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java +++ b/lib/server-test/src/test/java/org/apache/olingo/server/core/uri/validator/UriValidatorTest.java @@ -353,20 +353,38 @@ public class UriValidatorTest { } @Test - public void systemQueryOptionsNotAllowedForHttpPostPutPatchDelete() throws Exception { + public void systemQueryOptionsNotAllowedForHttpPostDelete() throws Exception { final String[] queryOptions = { QO_FILTER, QO_FORMAT, QO_EXPAND, QO_COUNT, QO_ORDERBY, QO_SEARCH, QO_SELECT, QO_SKIP, QO_TOP, QO_SKIPTOKEN }; for (int i = 0; i < queryOptions.length; i++) { validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.POST, UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); - validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PUT, - UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); - validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PATCH, - UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.DELETE, UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); } } + + @Test + public void systemQueryOptionsExpandAndSelectAllowedForHttpPutAndPatch() throws Exception { + final String[] queryOptions = + { QO_SELECT, QO_EXPAND }; + for (int i = 0; i < queryOptions.length; i++) { + validate(URI_ENTITY, queryOptions[i], HttpMethod.PUT); + validate(URI_ENTITY, queryOptions[i], HttpMethod.PATCH); + } + } + + @Test + public void systemQueryOptionsNotAllowedForHttpPutAndPatch() throws Exception { + final String[] queryOptions = + { QO_FILTER, QO_FORMAT, QO_COUNT, QO_ORDERBY, QO_SEARCH, QO_SKIP, QO_TOP, QO_SKIPTOKEN }; + for (int i = 0; i < queryOptions.length; i++) { + validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PUT, + UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); + validateWrong(URI_ENTITY, queryOptions[i], HttpMethod.PATCH, + UriValidationException.MessageKeys.SYSTEM_QUERY_OPTION_NOT_ALLOWED_FOR_HTTP_METHOD); + } + } @Test public void systemQueryOptionIDAllowedForDELETEReferencesOnly() throws Exception {