Hello,

I've updated restlet libs for my app to 2.0.9, and now PROPFIND
(WebDAV) requests are not working anymore. Basically, a WebDAV request
has (can have, but most do ;)) an XML entity body. My handler is doing
this (code didn't change):

    @Override
    public Representation propfind(Representation reqData) throws
ResourceException {
        setCustomHttpHeader("DAV", "1,2"); // NOI18N // DAV level 2 support
        List<DavProperty> reqDavProps = new ArrayList<DavProperty>();
        if (reqData != null) {
            try {
                final DomRepresentation reqXML = new DomRepresentation(reqData);
                //getLogger().info("XML body:\n" + reqData.getText());
                NodeList props = reqXML.getNodes("/propfind/prop/*"); // NOI18N
                for (int i = 0; i < props.getLength(); i++) {
                    Node n = props.get(i);
                    if (n.getNodeType() == Node.ELEMENT_NODE) {
                        Element e = (Element) n;
                        reqDavProps.add(new
DavProperty(e.getAttribute("xmlns"), e.getTagName())); // NOI18N
                    }
                }
                getLogger().info(String.format("Requested DAV
properties: %s", reqDavProps));
            } catch (Exception ex) {
                ex.printStackTrace();

getLogger().warning(Localisation.getMessage("core.err.res.wksp.cont.propfind.bad.xml",
ex)); // NOI18N
            }
        }
        // Rest of the handler code here, not reproduced
    }

With 2.0.9 I get *0* requested dav properties (it's ok for the 1st
PROPFIND request which doesn't have an entity body, but it's not OK
for the subsequent PROPFIND request which does have an entity body).

If I remove the comment from the log tracing line I *do* see the XML
text of the request body on the logs, reqData.getMediaType() is
correctly set to text/xml (Microsoft "web folders" client) or
application/xml (cadaver command line DAV client). Removing the
comment from the log trace though, raises a MalformedURLException when
trying to do reqXML.getNodes("/propfind/prop/*"), here's the full
stack trace (including the XML entity body of the request, so you can
see what a PROPFIND DAV request looks like):

Sep 22, 2011 8:49:59 AM
com.calenco.core.resource.workspace.ClassificationsServerResource
propfind
INFO: XML body:
<?xml version="1.0" ?>
<propfind xmlns="DAV:">
<prop>
<name/>
<parentname/>
<href/>
<ishidden/>
<iscollection/>
<isreadonly/>
<getcontenttype/>
<contentclass/>
<getcontentlanguage/>
<creationdate/>
<lastaccessed/>
<getlastmodified/>
<getcontentlength/>
<resourcetype/>
<isstructureddocument/>
<defaultdocument/>
<displayname/>
<isroot/>
</prop>
</propfind>

java.lang.RuntimeException: java.net.MalformedURLException
        at 
org.restlet.ext.xml.XmlRepresentation.internalEval(XmlRepresentation.java:556)
        at 
org.restlet.ext.xml.XmlRepresentation.getNodes(XmlRepresentation.java:437)
        at 
com.calenco.core.resource.workspace.ClassificationsServerResource.propfind(ClassificationsServerResource.java:225)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.restlet.resource.ServerResource.doHandle(ServerResource.java:446)
        at org.restlet.resource.ServerResource.doHandle(ServerResource.java:546)
        at 
org.restlet.resource.ServerResource.doNegotiatedHandle(ServerResource.java:587)
        at 
org.restlet.resource.ServerResource.doConditionalHandle(ServerResource.java:299)
        at org.restlet.resource.ServerResource.handle(ServerResource.java:846)
        at org.restlet.resource.Finder.handle(Finder.java:510)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Router.doHandle(Router.java:497)
        at org.restlet.routing.Router.handle(Router.java:737)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Router.doHandle(Router.java:497)
        at org.restlet.routing.Router.handle(Router.java:737)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at 
org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:151)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.engine.ChainHelper.handle(ChainHelper.java:111)
        at 
org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:72)
        at org.restlet.Application.handle(Application.java:388)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Router.doHandle(Router.java:497)
        at org.restlet.routing.Router.handle(Router.java:737)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Router.doHandle(Router.java:497)
        at org.restlet.routing.Router.handle(Router.java:737)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at 
org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:151)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.routing.Filter.doHandle(Filter.java:156)
        at org.restlet.routing.Filter.handle(Filter.java:203)
        at org.restlet.engine.ChainHelper.handle(ChainHelper.java:111)
        at org.restlet.Component.handle(Component.java:388)
        at org.restlet.Server.handle(Server.java:488)
        at org.restlet.engine.ServerHelper.handle(ServerHelper.java:71)
        at 
org.restlet.engine.http.HttpServerHelper.handle(HttpServerHelper.java:150)
        at 
org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:167)
        at 
org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594)
        at 
org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:1059)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:764)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217)
        at 
org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424)
        at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506)
        at 
org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.MalformedURLException
        at java.net.URL.<init>(URL.java:601)
        at java.net.URL.<init>(URL.java:464)
        at java.net.URL.<init>(URL.java:413)
        at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown 
Source)
        at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown
Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at 
org.restlet.ext.xml.DomRepresentation.getDocument(DomRepresentation.java:169)
        at 
org.restlet.ext.xml.XmlRepresentation.evaluate(XmlRepresentation.java:270)
        at 
org.restlet.ext.xml.XmlRepresentation.internalEval(XmlRepresentation.java:552)
        ... 61 more
Sep 22, 2011 8:53:20 AM
com.calenco.core.resource.workspace.ClassificationsServerResource
propfind
WARNING: Bad XML in the PROPFIND request body:
java.lang.RuntimeException: java.net.MalformedURLException
Sep 22, 2011 8:53:20 AM org.restlet.engine.log.LogFilter afterHandle
INFO: 2011-09-22        08:53:20        192.168.1.102   ad...@calenco.com       
192.168.1.10    9000    PROPFIND        /workspaces/W1/classifications  -       
207     -       380     32      http://192.168.1.10:9000        Microsoft
Data Access Internet Publishing Provider DAV 1.1        -

I've tried with the following code to parse the request XML, and got
the same results:

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            try {
                Document doc =
dbf.newDocumentBuilder().parse(reqData.getStream());
                XPath xp = XPathFactory.newInstance().newXPath();
                org.w3c.dom.NodeList props = (org.w3c.dom.NodeList)
xp.evaluate("/propfind/prop/*", doc, XPathConstants.NODESET);
                for (int i = 0; i < props.getLength(); i++) {
                    org.w3c.dom.Node n = props.item(i);
                    if (n.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
                        Element e = (Element) n;
                        reqDavProps.add(new
DavProperty(e.getAttribute("xmlns"), e.getTagName()));
                    }
                }
                getLogger().info(String.format("Requested DAV
properties [%d]: %s", reqDavProps.size(), reqDavProps));
            } catch (Exception ex) {
                ex.printStackTrace();

getLogger().warning(Localisation.getMessage("core.err.res.wksp.cont.propfind.bad.xml",
ex)); // NOI18N
            }

Any ideas? Hints? Thanks in advance (will keep trying a few more
things meanwhile...)

-- 
Fabián Mandelbaum
IS Engineer

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2843267

Reply via email to