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 [email protected]
> 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