Author: markt Date: Mon Nov 2 20:56:28 2009 New Revision: 832102 URL: http://svn.apache.org/viewvc?rev=832102&view=rev Log: When a JSP is deleted, make sure the first request post deletion receives the correct response (404)
Modified: tomcat/tc6.0.x/trunk/ (props changed) tomcat/tc6.0.x/trunk/STATUS.txt tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc6.0.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Mon Nov 2 20:56:28 2009 @@ -1 +1 @@ -/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,677910,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,770876,776921,776924,776935,776945,77 7464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809603,812125,812137,812432,813001,813013,813866,814180,815972,817442,819339,819361,820110,820132,820874,820954 +/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,753039,757335,757774,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770809,770876,776921,776924,776935,77 6945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809603,812125,812137,812432,813001,813013,813866,814180,815972,817442,819339,819361,820110,820132,820874,820954,831850 Modified: tomcat/tc6.0.x/trunk/STATUS.txt URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/STATUS.txt (original) +++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Nov 2 20:56:28 2009 @@ -31,21 +31,6 @@ PATCHES PROPOSED TO BACKPORT: [ New proposals should be added at the end of the list ] -* Fix issue where the first request for a deleted JSPs returns as if the JSP - still exists. - http://svn.apache.org/viewvc?view=rev&revision=683969 - +1: markt, funkman, kkolinko - 0: remm (looks risky, very minor problem), fhanik - minor problem, jim - -1: - - kkolinko: ( - - This issue does occur only when development = true. - When development is false JSP removal is not detected at all. - - - I think that, strictly speaking, JspCompilationContext#removed field - has to be volatile. I am proposing the change below (backport of r.831850) - ) - * Backport cleanup of semantics of thisAccessedTime and lastAccessedTime for sessions: - preparational whitespace changes @@ -417,11 +402,6 @@ +1: kkolinko, rjung -1: -* Mark JspCompilationContext#removed as volatile - http://svn.apache.org/viewvc?rev=831850&view=rev - +1: kkolinko, rjung, markt - -1: - * Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=47881 Fix processing of "startd" and "stopd" arguments, when they are not alone. http://svn.apache.org/viewvc?rev=831860&view=rev Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/JspCompilationContext.java Mon Nov 2 20:56:28 2009 @@ -81,7 +81,7 @@ protected JspRuntimeContext rctxt; - protected int removed = 0; + protected volatile int removed = 0; protected URLClassLoader jspLoader; protected URL baseUrl; @@ -569,7 +569,7 @@ } public boolean isRemoved() { - if (removed > 1 ) { + if (removed > 0 ) { return true; } return false; @@ -580,6 +580,9 @@ public void compile() throws JasperException, FileNotFoundException { createCompiler(); if (jspCompiler.isOutDated()) { + if (isRemoved()) { + throw new FileNotFoundException(jspUri); + } try { jspCompiler.removeGeneratedFiles(); jspLoader = null; Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/Compiler.java Mon Nov 2 20:56:28 2009 @@ -408,7 +408,7 @@ URL jspUrl = ctxt.getResource(jsp); if (jspUrl == null) { ctxt.incrementRemoved(); - return false; + return true; } URLConnection uc = jspUrl.openConnection(); if (uc instanceof JarURLConnection) { Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java Mon Nov 2 20:56:28 2009 @@ -17,6 +17,7 @@ package org.apache.jasper.servlet; +import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Constructor; @@ -289,38 +290,15 @@ Throwable exception, boolean precompile) throws ServletException, IOException { - JspServletWrapper wrapper = - (JspServletWrapper) rctxt.getWrapper(jspUri); + JspServletWrapper wrapper = rctxt.getWrapper(jspUri); if (wrapper == null) { synchronized(this) { - wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri); + wrapper = rctxt.getWrapper(jspUri); if (wrapper == null) { // Check if the requested JSP page exists, to avoid // creating unnecessary directories and files. if (null == context.getResource(jspUri)) { - String includeRequestUri = (String) - request.getAttribute( - "javax.servlet.include.request_uri"); - if (includeRequestUri != null) { - // This file was included. Throw an exception as - // a response.sendError() will be ignored - String msg = Localizer.getMessage( - "jsp.error.file.not.found",jspUri); - // Strictly, filtering this is an application - // responsibility but just in case... - throw new ServletException( - SecurityUtil.filter(msg)); - } else { - try { - response.sendError( - HttpServletResponse.SC_NOT_FOUND, - request.getRequestURI()); - } catch (IllegalStateException ise) { - log.error(Localizer.getMessage( - "jsp.error.file.not.found", - jspUri)); - } - } + handleMissingResource(request, response, jspUri); return; } boolean isErrorPage = exception != null; @@ -331,8 +309,40 @@ } } - wrapper.service(request, response, precompile); + try { + wrapper.service(request, response, precompile); + } catch (FileNotFoundException fnfe) { + handleMissingResource(request, response, jspUri); + } + + } + + private void handleMissingResource(HttpServletRequest request, + HttpServletResponse response, String jspUri) + throws ServletException, IOException { + + String includeRequestUri = + (String)request.getAttribute("javax.servlet.include.request_uri"); + + if (includeRequestUri != null) { + // This file was included. Throw an exception as + // a response.sendError() will be ignored + String msg = + Localizer.getMessage("jsp.error.file.not.found",jspUri); + // Strictly, filtering this is an application + // responsibility but just in case... + throw new ServletException(SecurityUtil.filter(msg)); + } else { + try { + response.sendError(HttpServletResponse.SC_NOT_FOUND, + request.getRequestURI()); + } catch (IllegalStateException ise) { + log.error(Localizer.getMessage("jsp.error.file.not.found", + jspUri)); + } + } + return; } Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Mon Nov 2 20:56:28 2009 @@ -339,6 +339,9 @@ } else { throw ex; } + } catch (FileNotFoundException fnfe) { + // File has been removed. Let caller handle this. + throw fnfe; } catch (IOException ex) { if (options.getDevelopment()) { throw handleJspException(ex); Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=832102&r1=832101&r2=832102&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Nov 2 20:56:28 2009 @@ -285,6 +285,11 @@ <fix> Make constants in the TagHandlerPool really constant. (markt) </fix> + <fix> + When development mode is enabled and a JSP is deleted, ensure next + request for that JSP is consistent with the JSP having been removed. + (markt/kkolinko) + </fix> </changelog> </subsection> <subsection name="Cluster"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org