[KVASIR-177] 存在しない静的コンテンツを指定すると内部的にArrayIndexOfBoundsExceptionが発生し、白紙ページが出力される Created: 2007-11-02  Updated: 2007-11-02  Resolved: 2007-11-02

Status: Closed
Project: Kvasir/Sora
Component/s: component/kvasir-webapp
Affects Version/s: 3.0.0-EA4-SNAPSHOT
Fix Version/s: 3.0.0-RC1

Type: Bug Priority: Minor
Reporter: tsuboi Assignee: skirnir
Resolution: Fixed Votes: 0
Labels: None
Environment:

PLUST-0.0.4で生成した新規サイト。変更なし



 Description   

(このエントリはKVASIR-39を作成しなおしたもの。)

存在しない静的なリソースを指定すると、内部的にはエラーページを出力しようとするが、
その途中にあるdomainURLを取得するロジックでArrayIndexOfBoundsExceptionが発生する。

具体的には、ServletUtils#getDomainURL()の418行目。
たとえば、存在しないリソースhttp://localhost:8080/toybox/sample.jpgをブラウザから入力すると、
入ってくる変数は
uri: /toybox/templates/exceptions/PageNotFoundRuntimeException
url: http://localhost:8080/toybox/sample.jpg
となり、uriの方が長くなる。

スタックトレースは下記の通り。

2007-01-28 18:38:33,025 ERROR http-8080-Processor23 [StandardPageExceptionHandler] - ...and tried to handle this exception, but couldn't forward to: /templates/exceptions/PageNotFoundRuntimeException
java.lang.StringIndexOutOfBoundsException: String index out of range: -18
at java.lang.String.substring(Unknown Source)
at org.seasar.kvasir.webapp.util.ServletUtils.getDomainURL(ServletUtils.java:418)
at org.seasar.kvasir.cms.impl.CmsPluginImpl.determineHeimId(CmsPluginImpl.java:310)
at org.seasar.kvasir.cms.filter.impl.PageRequestFilter.doFilter(PageRequestFilter.java:128)
at org.seasar.kvasir.webapp.filter.impl.FilteredRequestFilter.doFilter(FilteredRequestFilter.java:51)
at org.seasar.kvasir.webapp.chain.impl.RequestFilterChainImpl.doFilter(RequestFilterChainImpl.java:31)
at org.seasar.kvasir.webapp.servlet.KvasirFilter.processChain(KvasirFilter.java:222)
at org.seasar.kvasir.webapp.servlet.KvasirFilter.doFilter(KvasirFilter.java:157)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:704)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:474)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:409)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at org.seasar.kvasir.cms.handler.impl.StandardPageExceptionHandler.doHandle(StandardPageExceptionHandler.java:102)
at org.seasar.kvasir.cms.handler.impl.FilteredPageExceptionHandler.doHandle(FilteredPageExceptionHandler.java:49)
at org.seasar.kvasir.cms.handler.impl.PageExceptionHandlerChainImpl.doHandle(PageExceptionHandlerChainImpl.java:33)
at org.seasar.kvasir.cms.handler.impl.GardRootChangePageExceptionHandler.doHandle(GardRootChangePageExceptionHandler.java:30)
at org.seasar.kvasir.cms.handler.impl.PageExceptionHandlerChainImpl.doHandle(PageExceptionHandlerChainImpl.java:33)
at org.seasar.kvasir.cms.filter.impl.PageRequestFilter.processExceptionHandlerChain(PageRequestFilter.java:231)
at org.seasar.kvasir.cms.filter.impl.PageRequestFilter.doFilter(PageRequestFilter.java:176)
...



 Comments   
Comment by skirnir [ 2007-11-02 ]

無事、Page Not Foundが表示されるようになりました。
ありがとうございました。

Comment by skirnir [ 2007-11-02 ]

一応対処しました。試してみていただけますか?

Comment by skirnir [ 2007-11-02 ]

ServletAPIの仕様に沿っていないTomcat5.0でしか生じない現象なので、優先順位をMInor
に下げました。

Comment by skirnir [ 2007-11-02 ]

坪井です。
Tomcatはお察しのとおり5.0です。
ただ、修正された部分とは別の部分でのIndexOfBoundsが出ます。

変数:
requestURI_: /toybox/sample.jpg
requestURL_: http://localhost:8080/toybox/sample.jpg

2007-02-07 01:13:31,781 ERROR http-8080-Processor24 [StandardPageExceptionHandler] - ...and tried to handle this exception, but couldn't forward to: /templates/exceptions/PageNotFoundRuntimeException
java.lang.StringIndexOutOfBoundsException: String index out of range: -18
at java.lang.AbstractStringBuilder.delete(Unknown Source)
at java.lang.StringBuffer.delete(Unknown Source)
at org.seasar.kvasir.webapp.util.ServletUtils.getRequestRequestURL(ServletUtils.java:513)
at org.seasar.kvasir.webapp.util.ServletUtils.getDomainURL(ServletUtils.java:466)

Comment by skirnir [ 2007-11-02 ]

調査しました。KvasirはServletAPI2.4準拠のServletコンテナで動作します(web.xmlも2.4用になっています)が、
どうもServletAPI2.4SpecではHttpServlet#getRequestURI()とgetRequestURL()はともに
・フォワードされていなければリクエスト時の情報を返す
・フォワードされた後はフォワード先の情報を返す
となるっぽいです。

それで手元のTomcat5.5.20では現象が再現しませんでした。Jetty6.0.2でも(別の問題が発生しましたが^^;)
報告内容の現象は再現しませんでした。

調べた結果では、Tomcat5.0系だと発生する気がしていますが、ひょっとしてTomcat5.0系をお使いですか?
(参考:http://d.hatena.ne.jp/tanigon/20060824

で、一応Tomcat5.0系でも動くように修正してみました。(動作は未確認です)

Generated at Sat Apr 27 09:39:19 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.