Re: Exporting files with spaces in filenames
Martin Simmons <[email protected]> Fri, 20 Feb 2004 12:40:06 GMT
| Newsgroups | gmane.lisp.cl-http |
|---|---|
| Message-ID | <[email protected]> |
>>>>> On Fri, 20 Feb 2004 10:09:28 +0000, David Johnson-Davies <[email protected]> said: David> Can anyone help? David> I am exporting a directory of GIF images with: David> (export-url "/gifs/" :directory "recursive-p t) David> so I can link to them in Web pages. However, some of the filenames contain David> spaces, eg "my font.gif", and it doesn't seem to work whether I put: David> <a href="http://www.mysite.com/my%20font.gif">Link</a> David> or: David> <a href="http://www.mysite.com/my font.gif">Link</a> David> Is there some way I can turn on escaping of filenames on export, or do I David> need to do this by hand somehow? Looks like a bug in CL-HTTP's url interning. The browser always sends "my%20font.gif" but the URL entries created for recursive exports contain the spaced version "my font.gif". This happens because URL::%UNESCAPE-URL (called from URL:CANONICALIZE-URL and URL::%CANONICALIZE-HOST-PREFIXED-URL) only removes "safe" escapes like %41, but leaves %20 etc. Does it work if you define URL::%UNESCAPE-URL like this (and recompile the rest of url.lisp because it is inlined)? (defun %unescape-url (url-string start end destructive-p) (declare (fixnum start end) (values canonical-url new-start new-end)) (cond (*escape-urls* (http::with-bad-escaping-resignalled (url-string :start start :end end :reason "Bad Escaping: Ill-escaped URL") (cond (destructive-p (multiple-value-bind (unescaped-string new-end) (http::nstring-unescape-special-chars url-string start end t #\space) (values unescaped-string start new-end))) (t (multiple-value-bind (unescaped-string chars-unescaped-p new-url-string-p) (string-unescape-special-chars url-string start end) (declare (ignore chars-unescaped-p)) (unless new-url-string-p (setq unescaped-string (subseq url-string start end))) (values unescaped-string 0 (length unescaped-string))))))) (destructive-p (values url-string start end)) (t (values (subseq url-string start end) (- end start))))) __Martin