[Mono-list] response.writefile
Peter Hagen
peter at wingsofdeath.net
Wed Mar 2 06:05:49 EST 2011
Hi
I have a issue with the Response.WriteFile(string filename) in the
HttpResponse, since I updated to 2.10.1. I use to add a full rooted path
to this method, without problems, but if I do that now, it will add my
application path to it. Looking at the code, I see there is a
GetNormalizedFileName, which checks nicely if its a windows path or an
unc path, but it wont check if its a unix path. I guess this is not
preferred behavior for Linux systems.
This is what happens in my case: I call my download method with the
following path:
/home/willowmedia/wingsofdeath/wod_storage/55/1
and then on Response.WriteFile() I get this exception:
[02-03-2011 11:48:25|7] ClientResponse.DownloadFile:Exception=Could not
find file
"/home/willowmedia/wingsofdeath/www/home/willowmedia/wingsofdeath/wod_storage/55/1".
at System.IO.FileInfo.get_Length () [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.IO.FileInfo:get_Length
()
at System.Web.HttpResponse.WriteFile (System.String filename, Boolean
readIntoMemory) [0x00000] in <filename unknown>:0
at System.Web.HttpResponse.WriteFile (System.String filename)
[0x00000] in <filename unknown>:0
/home/willowmedia/wingsofdeath/www is my application path in this case.
My solution is to check if the file exists in the normalize method:
string GetNormalizedFileName (string fn)
{
if (String.IsNullOrEmpty (fn))
return fn;
if (File.Exists(fn))
return fn;
// On Linux we don't change \ to / since
filenames with \ are valid. We also
// don't remove drive: designator for the same
reason.
int len = fn.Length;
if (len >= 3 && fn [1] == ':' &&
IsFileSystemDirSeparator (fn [2]))
return Path.GetFullPath (fn); //
drive-qualified absolute file path
if (len >= 2 && IsFileSystemDirSeparator (fn
[0]) && IsFileSystemDirSeparator (fn [1]))
return Path.GetFullPath (fn); // UNC
path
HttpContext ctx = context ??
HttpContext.Current;
HttpRequest req = ctx != null ? ctx.Request :
null;
if (req != null)
return req.MapPath (fn);
return fn; // Or should we rather throw?
}
But I'm not sure if that would be a solution for everyone. If I would
want to report a bug on it, in which product should this be added?
'Mono: Class libraries'?
Cheers
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20110302/5c6b940a/attachment.html
More information about the Mono-list
mailing list