I have successfully used restlet 1.0.10 with tomcat (5.5) container. I have
services that return 204 on HTTP POST and PUT, no content in body, but they
return cookies as set in the restlet response object.
When I upgraded to restlet 1.1.1, I found problems in the restlet framework
mapping restlet response to tomcat 5.5 httpservletresponse for services that
return 204 response code. This mapping is silently failing, we always get a
response code of 200 and the headers (including cookies) get lost. Note that
the LogFilter accurately displays that service returns 204, but with tomcat
request dumper valve enabled I verified that tomcat neither gets this response
code nor the headers.
I followed Rob’s suggestion, and added a dummy entity with a 204 response code.
getResponse().setEntity(new StringRepresentation("This entity is
not changed", MediaType.TEXT_PLAIN));
getResponse().setStatus(Status.SUCCESS_NO_CONTENT);
And voila, the response comes out with a 204 response code with the headers as
expected. Also, as expected the dummy entity gets stripped out.
We use jetty for development environment only, and this is not reproducible
with jetty. However, we are seeing this issue only with restlet 1.1.1. We have
not changed our tomcat version or settings.
This behavior is really bizarre. We know that the dummy entity gets stripped
out in HttpServerConverter.commit(); then it is not making sense to me as to
why setting dummy entity in the response is a fix.
> I identified the problem: Tomcat is not properly returning Responses with no
> entity. The two acute places this is obvious is with 304 Not Modified
> responses and with the OPTIONS response. Tomcat returns a 200 OK with some
> default headers, instead of passing the correct header set and no entity
> emerging from Restlet.
>
> I verified that the version of Tomcat embedded in GWT 1.4 exhibits the
> problem, but haven't yet verified it in other places.
>
> The workaround (which will cause Restlet 1.1 to gripe, but works) is to emit
> an entity anyway, when none is called for, e.g. new
> StringRepresentation("This entity is not changed",MediaType.TEXT_HTML); In
> my application, I keyed this to a system property so that the non-compliant
> behavior can be turned on only when needed.
>
> Someone who is more knowledgeable than I am about the Servlet extension may
> be able to figure out if this is a Restlet bug or not.
>
> On Wed, Sep 3, 2008 at 3:56 PM, Rob Heittman
> <[email protected]>wrote:
>
> > In some cases Tomcat appears to swallow the Allow: header that leaves
> > Restlet in response to an OPTIONS request. The Allow: header of the
> > response is populated, and I tracked it all the way down through ServletCall
> > and verified Restlet is doing the right thing. But, the OPTIONS response
> > sent to the client from Tomcat is stripped of this and other useful headers
> > (like DAV: 1,2).
> >
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1019528