Hello Fabian,

I think there is a link with the "DAV" namespace. Could you try by making
the DomRepresentation namespace unaware?

Best regards,
Thierry Boileau




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
>

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

Reply via email to