main_type()
click to toggle source
# File lib/mail/fields/content_type_field.rb, line 51 51: def main_type 52: @main_type ||= element.main_type 53: end
# File lib/mail/fields/content_type_field.rb, line 81 81: def ContentTypeField.generate_boundary 82: "--==_mimepart_#{Mail.random_tag}" 83: end
# File lib/mail/fields/content_type_field.rb, line 10 10: def initialize(value = nil, charset = 'utf-8') 11: self.charset = charset 12: if value.class == Array 13: @main_type = value[0] 14: @sub_type = value[1] 15: @parameters = ParameterHash.new.merge!(value.last) 16: else 17: @main_type = nil 18: @sub_type = nil 19: @parameters = nil 20: value = strip_field(FIELD_NAME, value) 21: end 22: super(CAPITALIZED_FIELD, value, charset) 23: self.parse 24: self 25: end
# File lib/mail/fields/content_type_field.rb, line 43 43: def attempt_to_clean 44: # Sanitize the value, handle special cases 45: @element ||= Mail::ContentTypeElement.new(sanatize(value)) 46: rescue 47: # All else fails, just get the MIME media type 48: @element ||= Mail::ContentTypeElement.new(get_mime_type(value)) 49: end
# File lib/mail/fields/content_type_field.rb, line 119 119: def decoded 120: if parameters.length > 0 121: p = "; #{parameters.decoded}" 122: else 123: p = "" 124: end 125: "#{content_type}" + p 126: end
# File lib/mail/fields/content_type_field.rb, line 63 63: def default 64: decoded 65: end
# File lib/mail/fields/content_type_field.rb, line 35 35: def element 36: begin 37: @element ||= Mail::ContentTypeElement.new(value) 38: rescue 39: attempt_to_clean 40: end 41: end
TODO: Fix this up
# File lib/mail/fields/content_type_field.rb, line 110 110: def encoded 111: if parameters.length > 0 112: p = ";\r\n\s#{parameters.encoded}" 113: else 114: p = "" 115: end 116: "#{CAPITALIZED_FIELD}: #{content_type}#{p}\r\n" 117: end
# File lib/mail/fields/content_type_field.rb, line 97 97: def filename 98: case 99: when parameters['filename'] 100: @filename = parameters['filename'] 101: when parameters['name'] 102: @filename = parameters['name'] 103: else 104: @filename = nil 105: end 106: @filename 107: end
# File lib/mail/fields/content_type_field.rb, line 51 51: def main_type 52: @main_type ||= element.main_type 53: end
# File lib/mail/fields/content_type_field.rb, line 69 69: def parameters 70: unless @parameters 71: @parameters = ParameterHash.new 72: element.parameters.each { |p| @parameters.merge!(p) } 73: end 74: @parameters 75: end
# File lib/mail/fields/content_type_field.rb, line 27 27: def parse(val = value) 28: unless val.blank? 29: self.value = val 30: @element = nil 31: element 32: end 33: end
# File lib/mail/fields/content_type_field.rb, line 59 59: def string 60: "#{main_type}/#{sub_type}" 61: end
# File lib/mail/fields/content_type_field.rb, line 93 93: def stringify(params) 94: params.map { |k,v| "#{k}=#{Encodings.param_encode(v)}" }.join("; ") 95: end
# File lib/mail/fields/content_type_field.rb, line 189 189: def get_mime_type( val ) 190: case 191: when val =~ /^([\w\d\-_]+)\/([\w\d\-_]+);.+$/ 192: "#{$1}/#{$2}" 193: else 194: 'text/plain' 195: end 196: end
# File lib/mail/fields/content_type_field.rb, line 130 130: def method_missing(name, *args, &block) 131: if name.to_s =~ /([\w_]+)=/ 132: self.parameters[$1] = args.first 133: @value = "#{content_type}; #{stringify(parameters)}" 134: else 135: super 136: end 137: end
Various special cases from random emails found that I am not going to change the parser for
# File lib/mail/fields/content_type_field.rb, line 141 141: def sanatize( val ) 142: 143: # TODO: check if there are cases where whitespace is not a separator 144: val = val.tr(' ',';'). 145: squeeze(';'). 146: gsub(';', '; '). #use '; ' as a separator (or EOL) 147: gsub(/;\s*$/,'') #remove trailing to keep examples below 148: 149: if val =~ /(boundary=(\S*))/ 150: val = "#{$`.downcase}boundary=#{$2}#{$'.downcase}" 151: else 152: val.downcase! 153: end 154: 155: case 156: when val.chomp =~ /^\s*([\w\d\-_]+)\/([\w\d\-_]+)\s*;;+(.*)$/ 157: # Handles 'text/plain;; format="flowed"' (double semi colon) 158: "#{$1}/#{$2}; #{$3}" 159: when val.chomp =~ /^\s*([\w\d\-_]+)\/([\w\d\-_]+)\s*;\s?(ISO[\w\d\-_]+)$/ 160: # Microsoft helper: 161: # Handles 'type/subtype;ISO-8559-1' 162: "#{$1}/#{$2}; charset=#{quote_atom($3)}" 163: when val.chomp =~ /^text;?$/ 164: # Handles 'text;' and 'text' 165: "text/plain;" 166: when val.chomp =~ /^(\w+);\s(.*)$/ 167: # Handles 'text; <parameters>' 168: "text/plain; #{$2}" 169: when val =~ /([\w\d\-_]+\/[\w\d\-_]+);\scharset="charset="(\w+)""/ 170: # Handles text/html; charset="charset="GB2312"" 171: "#{$1}; charset=#{quote_atom($2)}" 172: when val =~ /([\w\d\-_]+\/[\w\d\-_]+);\s+(.*)/ 173: type = $1 174: # Handles misquoted param values 175: # e.g: application/octet-stream; name=archiveshelp1[1].htm 176: # and: audio/x-midi;\r\n\sname=Part .exe 177: params = $2.to_s.split(/\s+/) 178: params = params.map { |i| i.to_s.chomp.strip } 179: params = params.map { |i| i.split(/\s*\=\s*/) } 180: params = params.map { |i| "#{i[0]}=#{dquote(i[1].to_s)}" }.join('; ') 181: "#{type}; #{params}" 182: when val =~ /^\s*$/ 183: 'text/plain' 184: else 185: '' 186: end 187: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.