Page caching of urls with spaces in them using WEBrick and Mongrel is
broken in Edge Rails (and Rails 1.1.6, where I started). This is due
to the dispatch flow of control in both servers converting '+' in
requested paths into ' ' chars, whereas the page caching system writes
cache files for URLs with spaces in them out as encoded '+' characters
This issue does *not* occur with lighttpd, as the lighttpd.conf url
rewriting to look for <name>.html does not convert '+' to ' ' when it
looks for the file on the local filesystem to serve up.
I claim that we should fix WEBrick/Mongrel to also not convert '+' to '
' when looking for a file on the local filesystem.
Dissenters or those who know more than I before I go down the
ticket/patch/test path? Also, if I'm incorrect thinking this is the
right place to discuss this pre-ticket let me know.
I only hesitate on the proposed fix as one assumes the culprit line in
webrick_server.rb (detail below) was added for a reason, but it's not
clear to me what specific scenario would have one wanting to serve up a
local file with ' ' in its name via a request specified as '+'. And
putting an actual space in filenames is so declasse.
While investigating why using caches_page() to cache urls that have a
space in them encoded as either '+' or '%20' doesn't work (the cache
files are generated but never used, and continually regenerated on page
reload) led me to this line in webrick_server.rb handle_file():
path.gsub!('+', ' ') # Unescape + since FileHandler doesn't do
Commenting this line out restores page caching to proper functionality,
as the filename is written to disk with '+' (and '%20' is also
normalized to a '+' in the cache file filename), but this code converts
them to an actual space character which then means the cache files are
always incorrectly overlooked.
Similar line in mongrel's handlers.rb can_serve():
where unescaping the path turns the '+' into a ' '.
- Walter Korman -- http://www.lemurware.com