Changeset 942

Show
Ignore:
Timestamp:
2008-04-14 19:37:11 (7 months ago)
Author:
MaierMan
Message:

#602: Content-Disposition filenames decoded incorrectly
Do it like mozilla

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.0.x/chrome/content/dta/manager.js

    r909 r942  
    659659                        } 
    660660                        if ((header == 'content-type' || header == 'content-disposition') && this.fileName == null) { 
    661                                 // we have to handle headers like "content-disposition: inline; filename='dummy.txt'; title='dummy.txt';" 
    662                                 var value = aValue.match(/file(?:name)?=(["']?)([^\1;]+)\1(?:;.+)?/i); 
    663                                 if (!value) { 
    664                                         // workaround for bug #13959 
    665                                         // attachments on some vbulletin forums send nasty headers like "content-disposition: inline; filename*=utf-8''file.ext" 
    666                                         value = aValue.match(/file(?:name)?\*=(.*)''(.+)/i); 
    667                                         if (value) { 
    668                                                 this.overrideCharset = value[1]; 
     661                                let mhp = Serv('@mozilla.org/network/mime-hdrparam;1', 'nsIMIMEHeaderParam'); 
     662                                let fn; 
     663                                try { 
     664                                 fn = mhp.getParameter(aValue, 'filename', '', true, {}); 
     665                                } 
     666                                catch (ex) { 
     667                                        // no-op; handled below 
     668                                } 
     669                                if (!fn) { 
     670                                        try { 
     671                                         fn = mhp.getParameter(aValue, 'name', '', true, {}); 
    669672                                        } 
    670                                 } 
    671                                 if (value) { 
    672                                         this.fileName = value[2].getUsableFileName(); 
     673                                        catch (ex) { 
     674                                                // no-op; handled below 
     675                                        } 
     676                                } 
     677                                if (fn) { 
     678                                        this.fileName = fn.getUsableFileName(); 
    673679                                } 
    674680                        } 
     
    20232029                                newName += '.' + ext; 
    20242030                        } 
    2025                         let charset = visitor.overrideCharset ? visitor.overrideCharset : this.url.charset; 
    2026                         d.fileName = DTA_URLhelpers.decodeCharset(newName, charset).getUsableFileName(); 
     2031                        d.fileName = newName.getUsableFileName(); 
    20272032                } 
    20282033