From: Florent G. <li...@fg...> - 2013-11-04 18:11:43
|
Le Lundi 4 novembre 2013 18h33, "wol...@ex..." wrote: Thank you Wolfgang! >> If I am right, it looks like the URL rewriter cannot forward the >> content of the HTTP entity, meaning it can be used only for GET >> requests. Is it true? Is there a documentation for >> controller.xql? > No, the URL rewriting supports all HTTP methods, but there might be > a problem with multipart requests. Ironically, I only need to upload 1 file, no other field, but the way HTML forms work is by using multipart all the time. > I checked and found I use a plain XQuery in all pages doing uploads. That is what I used in the meantime as well. I duplicated the content of view.xql into my query. So I decided to turn the view into a library, declaring one equivalent function: view:apply($content), and use it from view.xql as well as from my upload.xql. If I am right, by using this I cannot rewrite the URL, so I can't get a "clean" URL (I must use ".xql" at the end). But that would do for now. Except that this now returns a 500 because of an NPE. Here is the code of modules/view-lib.xqm: (:~ : This is the main XQuery which will (by default) be called by controller.xql : to process any URI ending with ".html". It receives the HTML from : the controller and passes it to the templating system. :) xquery version "3.0"; module namespace view = "http://h2oconsulting.be/app/accounting/view"; import module namespace templates="http://exist-db.org/xquery/templates" ; (: : The following modules provide functions which will be called by the : templating. :) import module namespace config="http://h2oconsulting.be/app/accounting/config" at "config.xqm"; (:~ : The main view function. :) declare function view:apply($content) { let $config := map { $templates:CONFIG_APP_ROOT := $config:app-root, $templates:CONFIG_STOP_ON_ERROR := true() } (: : We have to provide a lookup function to templates:apply to help it : find functions in the imported application modules. The templates : module cannot see the application modules, but the inline function : below does see them. :) let $lookup := function($functionName as xs:string, $arity as xs:int) { try { function-lookup(xs:QName($functionName), $arity) } catch * { () } } return templates:apply($content, $lookup, (), $config) }; and modules/view.xql: (:~ : This is the main XQuery which will (by default) be called by controller.xql : to process any URI ending with ".html". It receives the HTML from : the controller and passes it to the templating system. :) xquery version "3.0"; import module namespace view = "http://h2oconsulting.be/app/accounting/view" at "view-lib.xqm"; declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare option output:method "html5"; declare option output:media-type "text/html"; (: : The HTML is passed in the request from the controller. : Run it through the templating system and return the result. :) view:apply( request:get-data()) and stmt/upload.xql: xquery version "3.0"; import module namespace view = "http://h2oconsulting.be/app/accounting/view" at "../modules/view-lib.xqm"; declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; declare option output:method "html5"; declare option output:media-type "text/html"; view:apply( <div xmlns="http://www.w3.org/1999/xhtml" data-template="templates:surround" data-template-with="templates/page.html" data-template-at="content"> <div class="page-header"> <h1>Bank statements</h1> </div> <h2>Upload</h2> <p>file-name:</p> <pre>{ request:get-uploaded-file-name('csv') }</pre> <p>file-size:</p> <pre>{ request:get-uploaded-file-size('csv') }</pre> <p>file-data:</p> <pre>{ request:get-uploaded-file-data('csv') }</pre> <p>file-data decoded:</p> <pre>{ util:binary-to-string(request:get-uploaded-file-data('csv'), 'iso-8859-1') }</pre> </div>) Since I made that change (externalized the common code to a library), I get a 500 with the following stacktrace: java.lang.NullPointerException at org.exist.xquery.xqdoc.XQDocHelper.parse(XQDocHelper.java:25) at org.exist.xquery.functions.inspect.InspectFunction.generateDocs(InspectFunction.java:69) at org.exist.xquery.functions.inspect.InspectFunction.eval(InspectFunction.java:54) at org.exist.xquery.BasicFunction.eval(BasicFunction.java:70) at org.exist.xquery.InternalFunctionCall.eval(InternalFunctionCall.java:55) at org.exist.xquery.LetExpr.eval(LetExpr.java:142) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327) at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232) at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.LetExpr.eval(LetExpr.java:189) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327) at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232) at org.exist.xquery.ConditionalExpression.eval(ConditionalExpression.java:100) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.LetExpr.eval(LetExpr.java:189) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.PathExpr.eval(PathExpr.java:264) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.TypeswitchExpression.eval(TypeswitchExpression.java:102) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.ForExpr.eval(ForExpr.java:307) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall$DeferredFunctionCallImpl.execute(FunctionCall.java:417) at org.exist.xquery.DeferredFunctionCall.realize(DeferredFunctionCall.java:56) at org.exist.xquery.DeferredFunctionCall.iterate(DeferredFunctionCall.java:229) at org.exist.xquery.value.ValueSequence.addAll(ValueSequence.java:166) at org.exist.xquery.ForExpr.eval(ForExpr.java:308) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.PathExpr.eval(PathExpr.java:264) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.TypeswitchExpression.eval(TypeswitchExpression.java:102) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.ForExpr.eval(ForExpr.java:307) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327) at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.ForExpr.eval(ForExpr.java:307) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327) at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:58) at org.exist.xquery.DebuggableExpression.eval(DebuggableExpression.java:65) at org.exist.xquery.LetExpr.eval(LetExpr.java:189) at org.exist.xquery.LetExpr.eval(LetExpr.java:187) at org.exist.xquery.BindingExpression.eval(BindingExpression.java:164) at org.exist.xquery.UserDefinedFunction.eval(UserDefinedFunction.java:153) at org.exist.xquery.FunctionCall.evalFunction(FunctionCall.java:327) at org.exist.xquery.FunctionCall.eval(FunctionCall.java:232) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.PathExpr.eval(PathExpr.java:264) at org.exist.xquery.AbstractExpression.eval(AbstractExpression.java:71) at org.exist.xquery.XQuery.execute(XQuery.java:267) at org.exist.xquery.XQuery.execute(XQuery.java:214) at org.exist.http.RESTServer.executeXQuery(RESTServer.java:1533) at org.exist.http.RESTServer.doPost(RESTServer.java:672) at org.exist.http.servlets.EXistServlet.doPost(EXistServlet.java:445) at javax.servlet.http.HttpServlet.service(HttpServlet.java:755) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:229) at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:103) at org.exist.http.urlrewrite.Forward.doRewrite(Forward.java:46) at org.exist.http.urlrewrite.XQueryURLRewrite.doRewrite(XQueryURLRewrite.java:551) at org.exist.http.urlrewrite.XQueryURLRewrite.applyViews(XQueryURLRewrite.java:405) at org.exist.http.urlrewrite.XQueryURLRewrite.service(XQueryURLRewrite.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448) at de.betterform.agent.web.filter.XFormsFilter.doFilter(Unknown Source) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:368) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488) at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:932) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:994) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) at java.lang.Thread.run(Thread.java:695) Any idea what's going wrong? PS: Sorry for having failed to set a subject to this email :-( Regards, -- Florent Georges http://fgeorges.org/ http://h2oconsulting.be/ |