You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Conrad O'Dea <ri...@gmail.com> on 2007/07/02 16:42:51 UTC

sending POST with emtpy body to RESTFUL server causes error

Hi,

if a client attempts to send a POST with an empty body to a RESTful
service, the server throws the exception below.  This can be easily
reproduced in the restful_dispatch sample by changing
       InputStream in = url.openStream();
to
       HttpURLConnection conn = (HttpURLConnection)url.openConnection();
       conn.setRequestMethod("PUT");
       InputStream in = conn.getInputStream();

I am guessing that this is not intentional.

 "Note that it is possible to use POST even without supplying data in
an HTTP message body." -- from
http://www.w3.org/2001/tag/doc/whenToUseGet.html

I've  created CXF-758 for it.

thanks
Conrad



     [java] Jul 2, 2007 3:33:12 PM
org.apache.cxf.phase.PhaseInterceptorChain doIntercept
     [java] INFO: Interceptor has thrown exception, unwinding now
     [java] org.apache.cxf.interceptor.Fault: Could not parse the XML stream.
     [java]     at
org.apache.cxf.databinding.source.XMLStreamDataReader.read(XMLStreamDataReader.java:96)
     [java]     at
org.apache.cxf.databinding.source.XMLStreamDataReader.read(XMLStreamDataReader.java:86)
     [java]     at
org.apache.cxf.databinding.source.XMLStreamDataReader.read(XMLStreamDataReader.java:48)
     [java]     at
org.apache.cxf.jaxws.interceptors.ProviderInDatabindingInterceptor.handleMessage(ProviderInDatabindingInterceptor.java:103)
     [java]     at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:206)
     [java]     at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:67)
     [java]     at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:253)
     [java]     at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:213)
     [java]     at
org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:54)
     [java]     at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
     [java]     at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
     [java]     at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:211)
     [java]     at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
     [java]     at org.mortbay.jetty.Server.handle(Server.java:281)
     [java]     at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
     [java]     at
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:821)
     [java]     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
     [java]     at
org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
     [java]     at
org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
     [java]     at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:368)
     [java]     at
org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
     [java] Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected
EOF in prolog
     [java]  at [row,col {unknown-source}]: [1,0]
     [java]     at
com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:661)
     [java]     at
com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2134)
     [java]     at
com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2040)
     [java]     at
com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
     [java]     at
org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:663)
     [java]     at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java:518)
     [java]     at
org.apache.cxf.databinding.source.XMLStreamDataReader.read(XMLStreamDataReader.java:93)
     [java]     ... 20 more

RE: sending POST with emtpy body to RESTFUL server causes error

Posted by "Liu, Jervis" <jl...@iona.com>.
In general, yes, any non-idempotent operations should not be required to have a body. But when it comes to using JAX-WS Dispatch/Provider to implement a Restful service, its really down to the semantics of Provider/Dispatch per spec. As the spec is not specific on this point, we could extend CXF code to support empty body with POST. However in practical, it is not very clear to me how this can be done. First, empty body does not equal to a null Source. Secondly, an empty Source wont be always mapped to an empty body and vice versa. For example, if I give Dispatch an empty Source by Source emptySource = new DomSource(), the underlying transformer will create empty source Document using DocumentBuilder.newDocument() thus results in a XML body with at least an XML declaration of <?xml version="1.0" standalone="no" encoding="UTF-8"?>. Same thing occurs to the Provider side, for an empty body without an XML declaration, the parser even wont be able to know the input is indeed an xml document.

I would say this is just the limitation of using JAX-WS Dispatch/Provider to implement a Restful service. If this blocks you, you can try something else, for example, the HTTP binding for Restful service.

Cheers,
Jervis

-----Original Message-----
From: Sergey Beryozkin [mailto:sergey.beryozkin@iona.com]
Sent: 2007?7?3? 23:48
To: cxf-user@incubator.apache.org
Subject: Re: sending POST with emtpy body to RESTFUL server causes error


Hi Dan

IMHO the Source should be just null if either POST or PUT have an empty body.
Suppose I'd like to write an application on top of Amazon S3 with CXF. There one creates buckets with empty PUTs...

Cheers, Sergey

----- Original Message ----- 
From: "Dan Diephouse" <da...@envoisolutions.com>
To: <cx...@incubator.apache.org>
Sent: Tuesday, July 03, 2007 4:34 PM
Subject: Re: sending POST with emtpy body to RESTFUL server causes error


> The question isn't whether its OK to POST with an empty body. The question
> is whether its correct Provider semantics to POST with an empty body. I feel
> that the Provider interface implies that there should at least be a root XML
> element. The Spec/Javadocs are kind of moot on this point though. I'm not
> fundamentally opposed to changing this assumption, but I think thats why it
> is the way it is...
> - Dan
> 
> On 7/2/07, Conrad O'Dea <ri...@gmail.com> wrote:
>>
>> Hi,
>>
>> if a client attempts to send a POST with an empty body to a RESTful
>> service, the server throws the exception below.  This can be easily
>> reproduced in the restful_dispatch sample by changing
>>        InputStream in = url.openStream();
>> to
>>        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
>>        conn.setRequestMethod("PUT");
>>        InputStream in = conn.getInputStream();
>>
>> I am guessing that this is not intentional.
>>
>> "Note that it is possible to use POST even without supplying data in
>> an HTTP message body." -- from
>> http://www.w3.org/2001/tag/doc/whenToUseGet.html
>>
>> I've  created CXF-758 for it.
>>
>> thanks
>> Conrad
>>
>>
>>
>>      [java] Jul 2, 2007 3:33:12 PM
>> org.apache.cxf.phase.PhaseInterceptorChain doIntercept
>>      [java] INFO: Interceptor has thrown exception, unwinding now
>>      [java] org.apache.cxf.interceptor.Fault: Could not parse the XML
>> stream.
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:96)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:86)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:48)
>>      [java]     at
>>
>> org.apache.cxf.jaxws.interceptors.ProviderInDatabindingInterceptor.handleMessage
>> (ProviderInDatabindingInterceptor.java:103)
>>      [java]     at
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(
>> PhaseInterceptorChain.java:206)
>>      [java]     at
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(
>> ChainInitiationObserver.java:67)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(
>> JettyHTTPDestination.java:253)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(
>> JettyHTTPDestination.java:213)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(
>> JettyHTTPHandler.java:54)
>>      [java]     at
>> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>>      [java]     at
>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
>>      [java]     at
>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(
>> ContextHandlerCollection.java:211)
>>      [java]     at
>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
>>      [java]     at org.mortbay.jetty.Server.handle(Server.java:281)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(
>> HttpConnection.java:821)
>>      [java]     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java
>> :513)
>>      [java]     at
>> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
>>      [java]     at
>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java
>> :368)
>>      [java]     at
>> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java
>> :442)
>>      [java] Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected
>> EOF in prolog
>>      [java]  at [row,col {unknown-source}]: [1,0]
>>      [java]     at
>> com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:661)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2134)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java
>> :2040)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
>>      [java]     at
>> org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:663)
>>      [java]     at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java
>> :518)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:93)
>>      [java]     ... 20 more
>>
> 
> 
> 
> -- 
> Dan Diephouse
> Envoi Solutions
> http://envoisolutions.com | http://netzooid.com/blog
>

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Re: sending POST with emtpy body to RESTFUL server causes error

Posted by Sergey Beryozkin <se...@iona.com>.
Hi Dan

IMHO the Source should be just null if either POST or PUT have an empty body.
Suppose I'd like to write an application on top of Amazon S3 with CXF. There one creates buckets with empty PUTs...

Cheers, Sergey

----- Original Message ----- 
From: "Dan Diephouse" <da...@envoisolutions.com>
To: <cx...@incubator.apache.org>
Sent: Tuesday, July 03, 2007 4:34 PM
Subject: Re: sending POST with emtpy body to RESTFUL server causes error


> The question isn't whether its OK to POST with an empty body. The question
> is whether its correct Provider semantics to POST with an empty body. I feel
> that the Provider interface implies that there should at least be a root XML
> element. The Spec/Javadocs are kind of moot on this point though. I'm not
> fundamentally opposed to changing this assumption, but I think thats why it
> is the way it is...
> - Dan
> 
> On 7/2/07, Conrad O'Dea <ri...@gmail.com> wrote:
>>
>> Hi,
>>
>> if a client attempts to send a POST with an empty body to a RESTful
>> service, the server throws the exception below.  This can be easily
>> reproduced in the restful_dispatch sample by changing
>>        InputStream in = url.openStream();
>> to
>>        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
>>        conn.setRequestMethod("PUT");
>>        InputStream in = conn.getInputStream();
>>
>> I am guessing that this is not intentional.
>>
>> "Note that it is possible to use POST even without supplying data in
>> an HTTP message body." -- from
>> http://www.w3.org/2001/tag/doc/whenToUseGet.html
>>
>> I've  created CXF-758 for it.
>>
>> thanks
>> Conrad
>>
>>
>>
>>      [java] Jul 2, 2007 3:33:12 PM
>> org.apache.cxf.phase.PhaseInterceptorChain doIntercept
>>      [java] INFO: Interceptor has thrown exception, unwinding now
>>      [java] org.apache.cxf.interceptor.Fault: Could not parse the XML
>> stream.
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:96)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:86)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:48)
>>      [java]     at
>>
>> org.apache.cxf.jaxws.interceptors.ProviderInDatabindingInterceptor.handleMessage
>> (ProviderInDatabindingInterceptor.java:103)
>>      [java]     at
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(
>> PhaseInterceptorChain.java:206)
>>      [java]     at
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(
>> ChainInitiationObserver.java:67)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(
>> JettyHTTPDestination.java:253)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(
>> JettyHTTPDestination.java:213)
>>      [java]     at
>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(
>> JettyHTTPHandler.java:54)
>>      [java]     at
>> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>>      [java]     at
>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
>>      [java]     at
>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(
>> ContextHandlerCollection.java:211)
>>      [java]     at
>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
>>      [java]     at org.mortbay.jetty.Server.handle(Server.java:281)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(
>> HttpConnection.java:821)
>>      [java]     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java
>> :513)
>>      [java]     at
>> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
>>      [java]     at
>> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
>>      [java]     at
>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java
>> :368)
>>      [java]     at
>> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java
>> :442)
>>      [java] Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected
>> EOF in prolog
>>      [java]  at [row,col {unknown-source}]: [1,0]
>>      [java]     at
>> com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:661)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2134)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java
>> :2040)
>>      [java]     at
>> com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
>>      [java]     at
>> org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:663)
>>      [java]     at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java
>> :518)
>>      [java]     at
>> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
>> XMLStreamDataReader.java:93)
>>      [java]     ... 20 more
>>
> 
> 
> 
> -- 
> Dan Diephouse
> Envoi Solutions
> http://envoisolutions.com | http://netzooid.com/blog
>

----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland

Re: sending POST with emtpy body to RESTFUL server causes error

Posted by Dan Diephouse <da...@envoisolutions.com>.
The question isn't whether its OK to POST with an empty body. The question
is whether its correct Provider semantics to POST with an empty body. I feel
that the Provider interface implies that there should at least be a root XML
element. The Spec/Javadocs are kind of moot on this point though. I'm not
fundamentally opposed to changing this assumption, but I think thats why it
is the way it is...
- Dan

On 7/2/07, Conrad O'Dea <ri...@gmail.com> wrote:
>
> Hi,
>
> if a client attempts to send a POST with an empty body to a RESTful
> service, the server throws the exception below.  This can be easily
> reproduced in the restful_dispatch sample by changing
>        InputStream in = url.openStream();
> to
>        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
>        conn.setRequestMethod("PUT");
>        InputStream in = conn.getInputStream();
>
> I am guessing that this is not intentional.
>
> "Note that it is possible to use POST even without supplying data in
> an HTTP message body." -- from
> http://www.w3.org/2001/tag/doc/whenToUseGet.html
>
> I've  created CXF-758 for it.
>
> thanks
> Conrad
>
>
>
>      [java] Jul 2, 2007 3:33:12 PM
> org.apache.cxf.phase.PhaseInterceptorChain doIntercept
>      [java] INFO: Interceptor has thrown exception, unwinding now
>      [java] org.apache.cxf.interceptor.Fault: Could not parse the XML
> stream.
>      [java]     at
> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
> XMLStreamDataReader.java:96)
>      [java]     at
> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
> XMLStreamDataReader.java:86)
>      [java]     at
> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
> XMLStreamDataReader.java:48)
>      [java]     at
>
> org.apache.cxf.jaxws.interceptors.ProviderInDatabindingInterceptor.handleMessage
> (ProviderInDatabindingInterceptor.java:103)
>      [java]     at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(
> PhaseInterceptorChain.java:206)
>      [java]     at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(
> ChainInitiationObserver.java:67)
>      [java]     at
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(
> JettyHTTPDestination.java:253)
>      [java]     at
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(
> JettyHTTPDestination.java:213)
>      [java]     at
> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(
> JettyHTTPHandler.java:54)
>      [java]     at
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>      [java]     at
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
>      [java]     at
> org.mortbay.jetty.handler.ContextHandlerCollection.handle(
> ContextHandlerCollection.java:211)
>      [java]     at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
>      [java]     at org.mortbay.jetty.Server.handle(Server.java:281)
>      [java]     at
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:502)
>      [java]     at
> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(
> HttpConnection.java:821)
>      [java]     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java
> :513)
>      [java]     at
> org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:208)
>      [java]     at
> org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:378)
>      [java]     at
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java
> :368)
>      [java]     at
> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java
> :442)
>      [java] Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected
> EOF in prolog
>      [java]  at [row,col {unknown-source}]: [1,0]
>      [java]     at
> com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:661)
>      [java]     at
> com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2134)
>      [java]     at
> com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java
> :2040)
>      [java]     at
> com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1069)
>      [java]     at
> org.apache.cxf.staxutils.StaxUtils.readDocElements(StaxUtils.java:663)
>      [java]     at org.apache.cxf.staxutils.StaxUtils.read(StaxUtils.java
> :518)
>      [java]     at
> org.apache.cxf.databinding.source.XMLStreamDataReader.read(
> XMLStreamDataReader.java:93)
>      [java]     ... 20 more
>



-- 
Dan Diephouse
Envoi Solutions
http://envoisolutions.com | http://netzooid.com/blog