You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Rob Walker (JIRA)" <ji...@apache.org> on 2008/10/13 08:06:44 UTC

[jira] Closed: (FELIX-407) Enhance default Http resource handling to support "conditional GET"

     [ https://issues.apache.org/jira/browse/FELIX-407?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rob Walker closed FELIX-407.
----------------------------

    Resolution: Fixed

Fix applied - code based on solution used in standard Jnlp servlet.

Might still need checks / extension for Jar based resources to ensure timestamps retrieved correctly.

> Enhance default Http resource handling to support "conditional GET"
> -------------------------------------------------------------------
>
>                 Key: FELIX-407
>                 URL: https://issues.apache.org/jira/browse/FELIX-407
>             Project: Felix
>          Issue Type: Improvement
>          Components: HTTP Service
>            Reporter: Rob Walker
>            Assignee: Rob Walker
>            Priority: Minor
>
> Whilst creating a generic "file serving" servlet, I realised our default HTTP resource serving in org.apache.felix.http.jetty.OsgiResourceHandler does not actually support "conditional GET" functionalty.
> A few, relatively simple, mods could be made to support this:
> (1) - enhance default handler to include last modified time in responses  e.g.
>         response.setDateHeader("Last-Modified", urlConn.lastModified());
> Note however, that Sun in their JNLP servlet document a bug where "file:" URL resources do not return last modified correctly, so an extra test is needed for file URLs. Following is from Sun JnlpDownloadServlet:
> <code>
> 	try {
> 	    // Get last modified time
> 	    conn = resource.openConnection();
> 	    lastModified = conn.getLastModified();
> 	} catch (Exception e) {
> 	    // do nothing
> 	}
> 	
> 	if (lastModified == 0) {
> 	    // Arguably a bug in the JRE will not set the lastModified for file URLs, and
> 	    // always return 0. This is a workaround for that problem.
> 	    String filepath = context.getRealPath(path); 
> 	    if (filepath != null) {
> 		File f = new File(filepath);	    
> 		if (f.exists()) {
> 		    lastModified = f.lastModified();
> 		}
> 	    }
> <code>
> (2) check incoming requests for a "If-Modified-Since" header, and if present check against the file timestamp. If server file has not change since this time, return a 304 (SC_NOT_MODIFIED) status
> Found a useful summary from which I based the above here:
> (3) for extra robustness on "file" resources the above can be extended to also use a combination of an "ETag" header e.g. made up of file timestamp + file size & a check against the "If-None-Match" request header
> http://fishbowl.pastiche.org/2002/10/21/http_conditional_get_for_rss_hackers

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.