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