Hi John,

We should indeed provide a better support for this use case. Your
suggestions sounds good. I've entered this RFE:

"Allow DTD/XSD validation to be turned off"
http://restlet.tigris.org/issues/show_bug.cgi?id=623 

Best regards,
Jerome Louvel
--
Restlet ~ Founder and Lead developer ~ http://www.restlet.org
Noelios Technologies ~ Co-founder ~ http://www.noelios.com


-----Message d'origine-----
De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
Envoye : vendredi 10 octobre 2008 16:44
A : [email protected]
Objet : Re: Exception when querying DomRepresentation using XPath expression

Thierry Boileau <[EMAIL PROTECTED]> wrote on 10/10/2008 03:20:15 
AM:

> Hi John,
> 
> 
> I send you a sample test code that works correctly.
> I hope it will help you. Otherwise, could you send us a 
> reproductible test code?
> 

Hi, Thierry, and thanks for the reply!  After doing more research on this 
than I had planned, I found that there's a real problem in Java with 
trying to use XHTML representations, with DOCTYPE entities, while behind a 
Proxy server.  The Restlet client code kind of masked what the underlying 
problem was when I wrote the email.  The code pasted below fails, for 
example, when running behind a proxy.

I have gotten some client code to work by specifying a custom 
EntityResolver in the DocumentBuilder, and then wrapping the Document in a 
DomRepresentation.  I wonder if there's a place in Restlet where a client 
program can either A) specify that the DomBuilder should set the "don't 
load external DTDs" feature, or B) can send in a custom EntityResolver 
that returns an empty DTD? 

Thanks for looking at this!

--------------------------------
John Wismar
[EMAIL PROTECTED]


package testDomRepresentation;

import org.restlet.Application;
import org.restlet.Client;
import org.restlet.Component;
import org.restlet.Restlet;
import org.restlet.Router;
import org.restlet.data.MediaType;
import org.restlet.data.Protocol;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.resource.DomRepresentation;
import org.restlet.resource.StringRepresentation;
import org.restlet.util.NodeSet;

public class TestApplication extends Application {
    public static void main(String[] args) throws Exception {
        Component component = new Component();
        component.getServers().add(Protocol.HTTP, 8182);
        component.getDefaultHost().attachDefault(new TestApplication());

        component.start();

        Client client = new Client(Protocol.HTTP);
        Response response = client.get("http://localhost:8182/";);
        DomRepresentation doc = response.getEntityAsDom();
        String xpath = "//a";
        NodeSet nodes = doc.getNodes(xpath); // This returns null
        System.out.println(nodes.get(0).getTextContent());
        component.stop();

    }

    @Override
    public Restlet createRoot() {
        Router router = new Router(getContext());

        Restlet restlet = new Restlet() {

            @Override
            public void handle(Request request, Response response) {
                response.setEntity(new StringRepresentation(
                        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 
1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\";>" + 
                        "<html xmlns=\"http://www.w3.org/1999/xhtml\"; 
version=\"-//W3C//DTD XHTML 1.1//EN\" xml:lang=\"en\">" +
                            "<head>" + 
                               "<meta http-equiv=\"Content-Type\" 
content=\"application/xhtml+xml; charset=utf-8\" />" +
                            "</head>"+
                            "<body>" +
                                "<a href=\"/test/\">some text</a>" +
                            "</body>" +
                        "</html>",
                        MediaType.APPLICATION_XHTML_XML));
            }

        };
        router.attachDefault(restlet);
        return router;
    }

}

Reply via email to