SLIDER-713 Jersey is simply not setting MIME types on PUT operations, at least with the code here
Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/f1a2c52d Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/f1a2c52d Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/f1a2c52d Branch: refs/heads/develop Commit: f1a2c52d4931d7a41919625c1a32a04260af4745 Parents: 47416da Author: Steve Loughran <ste...@apache.org> Authored: Wed Feb 18 13:35:50 2015 +0000 Committer: Steve Loughran <ste...@apache.org> Committed: Wed Feb 18 13:35:50 2015 +0000 ---------------------------------------------------------------------- .../rest/SliderApplicationApiRestClient.java | 4 ++-- .../slider/core/exceptions/ExceptionConverter.java | 17 ++++++++++++++--- .../appmaster/web/rest/InsecureAmFilter.java | 2 +- .../web/rest/application/ApplicationResource.java | 14 +++++++++++--- .../agent/rest/RestAPIClientTestDelegates.groovy | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/f1a2c52d/slider-core/src/main/java/org/apache/slider/client/rest/SliderApplicationApiRestClient.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/client/rest/SliderApplicationApiRestClient.java b/slider-core/src/main/java/org/apache/slider/client/rest/SliderApplicationApiRestClient.java index a55e640..d304962 100644 --- a/slider-core/src/main/java/org/apache/slider/client/rest/SliderApplicationApiRestClient.java +++ b/slider-core/src/main/java/org/apache/slider/client/rest/SliderApplicationApiRestClient.java @@ -177,12 +177,12 @@ public class SliderApplicationApiRestClient extends BaseRestClient resource.accept(MediaType.APPLICATION_JSON_TYPE); // entity to put - resource.entity(json, MediaType.APPLICATION_JSON_TYPE); + resource.type(MediaType.APPLICATION_JSON_TYPE); // put operation. The result is discarded; it does help validate // that the operation returned a JSON data structure as well as a 200 // response. - resource.put(ConfTree.class); + resource.put(ConfTree.class, json); //ClientResponse response = resource.put(ClientResponse.class); } catch (ClientHandlerException ex) { throw ExceptionConverter.convertJerseyException("PUT", http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/f1a2c52d/slider-core/src/main/java/org/apache/slider/core/exceptions/ExceptionConverter.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/core/exceptions/ExceptionConverter.java b/slider-core/src/main/java/org/apache/slider/core/exceptions/ExceptionConverter.java index 02cc64a..5dbb881 100644 --- a/slider-core/src/main/java/org/apache/slider/core/exceptions/ExceptionConverter.java +++ b/slider-core/src/main/java/org/apache/slider/core/exceptions/ExceptionConverter.java @@ -21,6 +21,7 @@ package org.apache.slider.core.exceptions; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterfaceException; +import org.apache.hadoop.fs.InvalidRequestException; import org.apache.hadoop.fs.PathAccessDeniedException; import org.apache.hadoop.fs.PathIOException; import org.apache.hadoop.yarn.webapp.*; @@ -58,10 +59,20 @@ public class ExceptionConverter { if (status == HttpServletResponse.SC_UNAUTHORIZED || status == HttpServletResponse.SC_FORBIDDEN) { ioe = new PathAccessDeniedException(targetURL); - } - if (status >= 400 && status < 500) { + } else if (status == HttpServletResponse.SC_BAD_REQUEST + || status == HttpServletResponse.SC_NOT_ACCEPTABLE + || status == HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE) { + // bad request + ioe = new InvalidRequestException( + String.format("Bad %s request: status code %d against %s", + verb, status, targetURL)); + } else if (status > 400 && status < 500) { ioe = new FileNotFoundException(targetURL); - } + } else { + ioe = new PathIOException(targetURL, + String.format("%s failed: status code %d against %s", + verb, status, targetURL)); + } } if (ioe == null) { http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/f1a2c52d/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/InsecureAmFilter.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/InsecureAmFilter.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/InsecureAmFilter.java index 6ee3d91..d5b6b36 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/InsecureAmFilter.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/InsecureAmFilter.java @@ -91,7 +91,7 @@ public class InsecureAmFilter extends AmIpFilter { } if (user == null) { - log.warn("Could not find " + WebAppProxyServlet.PROXY_USER_COOKIE_NAME + log.debug("Could not find " + WebAppProxyServlet.PROXY_USER_COOKIE_NAME + " cookie, so user will not be set"); chain.doFilter(req, resp); } else { http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/f1a2c52d/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java ---------------------------------------------------------------------- diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java index 68e4807..df60782 100644 --- a/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java +++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/web/rest/application/ApplicationResource.java @@ -20,6 +20,7 @@ package org.apache.slider.server.appmaster.web.rest.application; import com.google.common.collect.Lists; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; +import org.apache.hadoop.yarn.webapp.BadRequestException; import org.apache.hadoop.yarn.webapp.NotFoundException; import org.apache.slider.api.types.ApplicationLivenessInformation; import org.apache.slider.api.types.ComponentInformation; @@ -159,13 +160,20 @@ public class ApplicationResource extends AbstractSliderResource { @PUT @Path(MODEL_DESIRED_RESOURCES) - @Consumes({APPLICATION_JSON}) + @Consumes({APPLICATION_JSON, TEXT_PLAIN}) @Produces({APPLICATION_JSON}) - public ConfTree putModelDesiredResources( + public ConfTree setModelDesiredResources( String json) { markPut(SLIDER_SUBPATH_APPLICATION, MODEL_DESIRED_RESOURCES); - log.info("PUT {}:\n{}", MODEL_DESIRED_RESOURCES, + int size = json != null ? json.length() : 0; + log.info("PUT {} {} bytes:\n{}", MODEL_DESIRED_RESOURCES, + size, json); + if (size == 0) { + log.warn("No JSON in PUT request; rejecting"); + throw new BadRequestException("No JSON in PUT"); + } + try { ConfTreeSerDeser serDeser = new ConfTreeSerDeser(); ConfTree updated = serDeser.fromJson(json); http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/f1a2c52d/slider-core/src/test/groovy/org/apache/slider/agent/rest/RestAPIClientTestDelegates.groovy ---------------------------------------------------------------------- diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/rest/RestAPIClientTestDelegates.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/rest/RestAPIClientTestDelegates.groovy index b76a0d3..fc3a29e 100644 --- a/slider-core/src/test/groovy/org/apache/slider/agent/rest/RestAPIClientTestDelegates.groovy +++ b/slider-core/src/test/groovy/org/apache/slider/agent/rest/RestAPIClientTestDelegates.groovy @@ -69,6 +69,6 @@ class RestAPIClientTestDelegates extends AbstractAppApiTestDelegates { @Override void testFlexOperation() { -// super.testFlexOperation() + super.testFlexOperation() } }