Mantis - Quercus
Viewing Issue Advanced Details
2544 minor always 03-20-08 19:09 04-18-09 14:21
nam  
 
normal  
new 3.1.5  
open  
none    
none  
0002544: Mint web analytics package installs but does not function correctly
(rep by willab)

I have used Resin as a J2EE container for quite a while and I am very happy with it. Just recently I've had the opportunity to get into Quercus and it looks very promising. I am trying to install Mint, PHP/javascript based web analytics package (http://www.haveamint.com/). [^] Running Resin 3.1.5 Pro I passed their compatibility suite test (http://www.haveamint.com/about/requirements#compatibility-suite) [^] and I can actually go to mydomain.com/phpappdirectory and it loads the page. However, recording requests is failing and the author determined it must be something about the relative paths or special handling of $_GET variables by Quercus, but could not get much further. I think this would be useful application for all other Resin users as well and any help is appreciated. Below is the code snippet and the exception. Cheers, Will com.caucho.quercus.QuercusExitException at com.caucho.quercus.env.Env.exit(Env.java:3852) at _quercus._mint._app._paths._auth._index__php.execute(_index__php.java:54) at com.caucho.quercus.env.Env.include(Env.java:3612) at _quercus._mint._app._path__php.execute(_path__php.java:101) at com.caucho.quercus.env.Env.include(Env.java:3612) at _quercus._mint._index__php.execute(_index__php.java:44) at com.caucho.quercus.page.QuercusPage.executeTop(QuercusPage.java:119) at com.caucho.quercus.servlet.ResinQuercusServlet.service(ResinQuercusServlet.java:146) at com.caucho.quercus.servlet.QuercusServlet.service(QuercusServlet.java:353) at javax.servlet.http.HttpServlet.service(HttpServlet.java:91) at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103) at com.atlassian.confluence.util.LoggingContextFilter.doFilter(LoggingContextFilter.java:49) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:192) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.atlassian.seraph.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:112) at com.atlassian.confluence.util.AbstractBootstrapHotSwappingFilter.doFilter(AbstractBootstrapHotSwappingFilter.java:28) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.atlassian.seraph.filter.BaseLoginFilter.doFilter(BaseLoginFilter.java:110) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.atlassian.confluence.util.ClusterHeaderFilter.doFilter(ClusterHeaderFilter.java:35) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.atlassian.core.filters.gzip.GzipFilter.doFilter(GzipFilter.java:61) at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:181) at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:266) at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:269) at com.caucho.server.port.TcpConnection.run(TcpConnection.java:603) at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:721) at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:643) at java.lang.Thread.run(Thread.java:619) The code at that line looks like this: if ((! v_Mint.callMethod(env, 320930870, _qc_isLoggedIn, 10).toBoolean() && (v_Mint.getField(env, qv_cfg_6).get(qv_mode_7).eq(qv_default_8) || (v_Mint.getField(env, qv_cfg_6).get(qv_mode_7).eq(qv_client_9) && ((((v__GET.get(qv_preferences_10).isset() || v__GET.get(qv_uninstall_11).isset()) || v__GET.get(qv_import_12).isset()) || v__GET.get(qv_moved_13).isset()) || v__GET.get(qv_visits_14).isset()))))) { if (((v__POST = env.getGlobalVar("_POST")).get(qv_MintPath_15).isset() && v__POST.get(qv_MintPath_15).eq(qv_Auth_16))) { if (v_Mint.callMethod(env, 470942992, _qc_authenticate, 12).toBoolean()) { return NullValue.NULL; } } env.include(_quercus_selfDirectory, env.getConstant("MINT_ROOT").toStringBuilder(env).append(_qc_apppathsauthloginphp).toString(), false, false); env.exit(); // THIS IS THE LINE IN THE EXCEPTION } return LongValue.ONE; } The corresponding PHP code is: if ( !$Mint->isLoggedIn() && ( $Mint->cfg['mode'] == 'default' || ( $Mint->cfg['mode'] == 'client' && ( isset($_GET['preferences']) || isset($_GET['uninstall']) || isset($_GET['import']) || isset($_GET['moved']) || isset($_GET['visits']) ) ) ) ) { if (isset($_POST['MintPath']) && $_POST['MintPath'] == 'Auth') { if ($Mint->authenticate()) { return; } } include(MINT_ROOT.'app/paths/auth/login.php'); exit(); }

Notes
(0003956)
nshttpd   
04-18-09 14:20   
I was about to open up a new bug, but saw this one here. The problem with Mint not working looks to be that Quercus doesn't properly parse query string parameters that do not have values associated with them. This is something that Mint does on several levels. To reproduce and see the problem a simple test.php page with phpinfo() can be used. With a normal PHP CGI interpreter make a request with a query string of "?foo&bar=baz&poof"

PHP CGI has three _REQUEST var mapped to foo, bar (with value) and poof. the _GET structure is the same way.

Do the same thing in Quercus and the _REQUEST structure still has the three bar, foo, poof with baz as the value of bar, but the _GET structure has _GET["foo&bar"] with a value of baz and _GET["poof"] with no value. This _GET issue is what causes Mint to not work properly. Not sure if this also might be the cause of the Zend MVC bug I saw listed also or not since I haven't messed with the Zend setup.
(0003957)
nshttpd   
04-18-09 14:21   
oh, and forgot this. The product version on the bug is 3.1.5, but it's also there in 3.2.0.