rack-mail_exception 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.rdoc +38 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/lib/rack/mail_exception.rb +103 -0
- data/test/helper.rb +13 -0
- data/test/test_rack_mail_exception.rb +93 -0
- data/vendor/mail/.bundle/config +2 -0
- data/vendor/mail/CHANGELOG.rdoc +370 -0
- data/vendor/mail/Dependencies.txt +3 -0
- data/vendor/mail/Gemfile +17 -0
- data/vendor/mail/README.rdoc +572 -0
- data/vendor/mail/ROADMAP +92 -0
- data/vendor/mail/Rakefile +41 -0
- data/vendor/mail/TODO.rdoc +9 -0
- data/vendor/mail/lib/mail.rb +76 -0
- data/vendor/mail/lib/mail/attachments_list.rb +99 -0
- data/vendor/mail/lib/mail/body.rb +287 -0
- data/vendor/mail/lib/mail/configuration.rb +67 -0
- data/vendor/mail/lib/mail/core_extensions/blank.rb +26 -0
- data/vendor/mail/lib/mail/core_extensions/nil.rb +11 -0
- data/vendor/mail/lib/mail/core_extensions/string.rb +27 -0
- data/vendor/mail/lib/mail/elements.rb +14 -0
- data/vendor/mail/lib/mail/elements/address.rb +306 -0
- data/vendor/mail/lib/mail/elements/address_list.rb +74 -0
- data/vendor/mail/lib/mail/elements/content_disposition_element.rb +30 -0
- data/vendor/mail/lib/mail/elements/content_location_element.rb +25 -0
- data/vendor/mail/lib/mail/elements/content_transfer_encoding_element.rb +24 -0
- data/vendor/mail/lib/mail/elements/content_type_element.rb +35 -0
- data/vendor/mail/lib/mail/elements/date_time_element.rb +26 -0
- data/vendor/mail/lib/mail/elements/envelope_from_element.rb +34 -0
- data/vendor/mail/lib/mail/elements/message_ids_element.rb +29 -0
- data/vendor/mail/lib/mail/elements/mime_version_element.rb +26 -0
- data/vendor/mail/lib/mail/elements/phrase_list.rb +21 -0
- data/vendor/mail/lib/mail/elements/received_element.rb +30 -0
- data/vendor/mail/lib/mail/encodings.rb +258 -0
- data/vendor/mail/lib/mail/encodings/7bit.rb +31 -0
- data/vendor/mail/lib/mail/encodings/8bit.rb +31 -0
- data/vendor/mail/lib/mail/encodings/base64.rb +33 -0
- data/vendor/mail/lib/mail/encodings/binary.rb +31 -0
- data/vendor/mail/lib/mail/encodings/quoted_printable.rb +38 -0
- data/vendor/mail/lib/mail/encodings/transfer_encoding.rb +58 -0
- data/vendor/mail/lib/mail/envelope.rb +35 -0
- data/vendor/mail/lib/mail/field.rb +223 -0
- data/vendor/mail/lib/mail/field_list.rb +33 -0
- data/vendor/mail/lib/mail/fields.rb +35 -0
- data/vendor/mail/lib/mail/fields/bcc_field.rb +56 -0
- data/vendor/mail/lib/mail/fields/cc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/comments_field.rb +41 -0
- data/vendor/mail/lib/mail/fields/common/address_container.rb +16 -0
- data/vendor/mail/lib/mail/fields/common/common_address.rb +125 -0
- data/vendor/mail/lib/mail/fields/common/common_date.rb +42 -0
- data/vendor/mail/lib/mail/fields/common/common_field.rb +50 -0
- data/vendor/mail/lib/mail/fields/common/common_message_id.rb +43 -0
- data/vendor/mail/lib/mail/fields/common/parameter_hash.rb +52 -0
- data/vendor/mail/lib/mail/fields/content_description_field.rb +19 -0
- data/vendor/mail/lib/mail/fields/content_disposition_field.rb +69 -0
- data/vendor/mail/lib/mail/fields/content_id_field.rb +63 -0
- data/vendor/mail/lib/mail/fields/content_location_field.rb +42 -0
- data/vendor/mail/lib/mail/fields/content_transfer_encoding_field.rb +50 -0
- data/vendor/mail/lib/mail/fields/content_type_field.rb +185 -0
- data/vendor/mail/lib/mail/fields/date_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/from_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/in_reply_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/keywords_field.rb +44 -0
- data/vendor/mail/lib/mail/fields/message_id_field.rb +83 -0
- data/vendor/mail/lib/mail/fields/mime_version_field.rb +53 -0
- data/vendor/mail/lib/mail/fields/optional_field.rb +13 -0
- data/vendor/mail/lib/mail/fields/received_field.rb +67 -0
- data/vendor/mail/lib/mail/fields/references_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/reply_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_bcc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_cc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_date_field.rb +35 -0
- data/vendor/mail/lib/mail/fields/resent_from_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_message_id_field.rb +34 -0
- data/vendor/mail/lib/mail/fields/resent_sender_field.rb +62 -0
- data/vendor/mail/lib/mail/fields/resent_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/return_path_field.rb +64 -0
- data/vendor/mail/lib/mail/fields/sender_field.rb +67 -0
- data/vendor/mail/lib/mail/fields/structured_field.rb +51 -0
- data/vendor/mail/lib/mail/fields/subject_field.rb +16 -0
- data/vendor/mail/lib/mail/fields/to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/unstructured_field.rb +166 -0
- data/vendor/mail/lib/mail/header.rb +262 -0
- data/vendor/mail/lib/mail/mail.rb +234 -0
- data/vendor/mail/lib/mail/message.rb +1867 -0
- data/vendor/mail/lib/mail/network.rb +9 -0
- data/vendor/mail/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
- data/vendor/mail/lib/mail/network/delivery_methods/sendmail.rb +62 -0
- data/vendor/mail/lib/mail/network/delivery_methods/smtp.rb +110 -0
- data/vendor/mail/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
- data/vendor/mail/lib/mail/network/retriever_methods/imap.rb +18 -0
- data/vendor/mail/lib/mail/network/retriever_methods/pop3.rb +149 -0
- data/vendor/mail/lib/mail/parsers/address_lists.rb +64 -0
- data/vendor/mail/lib/mail/parsers/address_lists.treetop +19 -0
- data/vendor/mail/lib/mail/parsers/content_disposition.rb +387 -0
- data/vendor/mail/lib/mail/parsers/content_disposition.treetop +46 -0
- data/vendor/mail/lib/mail/parsers/content_location.rb +139 -0
- data/vendor/mail/lib/mail/parsers/content_location.treetop +20 -0
- data/vendor/mail/lib/mail/parsers/content_transfer_encoding.rb +162 -0
- data/vendor/mail/lib/mail/parsers/content_transfer_encoding.treetop +20 -0
- data/vendor/mail/lib/mail/parsers/content_type.rb +539 -0
- data/vendor/mail/lib/mail/parsers/content_type.treetop +58 -0
- data/vendor/mail/lib/mail/parsers/date_time.rb +114 -0
- data/vendor/mail/lib/mail/parsers/date_time.treetop +11 -0
- data/vendor/mail/lib/mail/parsers/envelope_from.rb +194 -0
- data/vendor/mail/lib/mail/parsers/envelope_from.treetop +32 -0
- data/vendor/mail/lib/mail/parsers/message_ids.rb +45 -0
- data/vendor/mail/lib/mail/parsers/message_ids.treetop +15 -0
- data/vendor/mail/lib/mail/parsers/mime_version.rb +144 -0
- data/vendor/mail/lib/mail/parsers/mime_version.treetop +19 -0
- data/vendor/mail/lib/mail/parsers/phrase_lists.rb +45 -0
- data/vendor/mail/lib/mail/parsers/phrase_lists.treetop +15 -0
- data/vendor/mail/lib/mail/parsers/received.rb +71 -0
- data/vendor/mail/lib/mail/parsers/received.treetop +11 -0
- data/vendor/mail/lib/mail/parsers/rfc2045.rb +464 -0
- data/vendor/mail/lib/mail/parsers/rfc2045.treetop +36 -0
- data/vendor/mail/lib/mail/parsers/rfc2822.rb +5318 -0
- data/vendor/mail/lib/mail/parsers/rfc2822.treetop +410 -0
- data/vendor/mail/lib/mail/parsers/rfc2822_obsolete.rb +3757 -0
- data/vendor/mail/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
- data/vendor/mail/lib/mail/part.rb +102 -0
- data/vendor/mail/lib/mail/parts_list.rb +34 -0
- data/vendor/mail/lib/mail/patterns.rb +30 -0
- data/vendor/mail/lib/mail/utilities.rb +181 -0
- data/vendor/mail/lib/mail/version.rb +10 -0
- data/vendor/mail/lib/mail/version_specific/ruby_1_8.rb +97 -0
- data/vendor/mail/lib/mail/version_specific/ruby_1_9.rb +87 -0
- data/vendor/mail/lib/tasks/corpus.rake +125 -0
- data/vendor/mail/lib/tasks/treetop.rake +10 -0
- data/vendor/mail/mail.gemspec +20 -0
- data/vendor/mail/reference/US ASCII Table.txt +130 -0
- data/vendor/mail/reference/rfc1035 Domain Implementation and Specification.txt +3083 -0
- data/vendor/mail/reference/rfc1049 Content-Type Header Field for Internet Messages.txt +451 -0
- data/vendor/mail/reference/rfc1344 Implications of MIME for Internet Mail Gateways.txt +586 -0
- data/vendor/mail/reference/rfc1345 Character Mnemonics & Character Sets.txt +5761 -0
- data/vendor/mail/reference/rfc1524 A User Agent Configuration Mechanism For Multimedia Mail Format Information.txt +675 -0
- data/vendor/mail/reference/rfc1652 SMTP Service Extension for 8bit-MIMEtransport.txt +339 -0
- data/vendor/mail/reference/rfc1892 Multipart Report .txt +227 -0
- data/vendor/mail/reference/rfc1893 Mail System Status Codes.txt +843 -0
- data/vendor/mail/reference/rfc2045 Multipurpose Internet Mail Extensions (1).txt +1739 -0
- data/vendor/mail/reference/rfc2046 Multipurpose Internet Mail Extensions (2).txt +2467 -0
- data/vendor/mail/reference/rfc2047 Multipurpose Internet Mail Extensions (3).txt +843 -0
- data/vendor/mail/reference/rfc2048 Multipurpose Internet Mail Extensions (4).txt +1180 -0
- data/vendor/mail/reference/rfc2049 Multipurpose Internet Mail Extensions (5).txt +1347 -0
- data/vendor/mail/reference/rfc2111 Content-ID and Message-ID URLs.txt +283 -0
- data/vendor/mail/reference/rfc2183 Content-Disposition Header Field.txt +675 -0
- data/vendor/mail/reference/rfc2231 MIME Parameter Value and Encoded Word Extensions.txt +563 -0
- data/vendor/mail/reference/rfc2387 MIME Multipart-Related Content-type.txt +563 -0
- data/vendor/mail/reference/rfc2821 Simple Mail Transfer Protocol.txt +3711 -0
- data/vendor/mail/reference/rfc2822 Internet Message Format.txt +2859 -0
- data/vendor/mail/reference/rfc3462 Reporting of Mail System Administrative Messages.txt +396 -0
- data/vendor/mail/reference/rfc3696 Checking and Transformation of Names.txt +898 -0
- data/vendor/mail/reference/rfc4155 The application-mbox Media Type.txt +502 -0
- data/vendor/mail/reference/rfc4234 Augmented BNF for Syntax Specifications: ABNF.txt +899 -0
- data/vendor/mail/reference/rfc822 Standard for the Format of ARPA Internet Text Messages.txt +2900 -0
- data/vendor/mail/spec/environment.rb +15 -0
- data/vendor/mail/spec/features/making_a_new_message.feature +14 -0
- data/vendor/mail/spec/features/steps/env.rb +6 -0
- data/vendor/mail/spec/features/steps/making_a_new_message_steps.rb +11 -0
- data/vendor/mail/spec/fixtures/attachments/basic_email.eml +31 -0
- data/vendor/mail/spec/fixtures/attachments/test.gif +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.jpg +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.pdf +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.png +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.tiff +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.zip +0 -0
- data/vendor/mail/spec/fixtures/attachments//343/201/246/343/201/231/343/201/250.txt +2 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_content_disposition.eml +29 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_content_location.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_message_rfc822.eml +92 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_only_email.eml +17 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_pdf.eml +70 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_with_encoded_name.eml +47 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_with_quoted_filename.eml +60 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/cant_parse_from.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_7-bit.eml +231 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_empty.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_plain.eml +148 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_qp_with_space.eml +53 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_spam.eml +44 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_text-html.eml +50 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_with_8bits.eml +770 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_with_semi_colon.eml +269 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_x_uuencode.eml +79 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/empty_group_lists.eml +162 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/header_fields_with_empty_values.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/missing_body.eml +16 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/missing_content_disposition.eml +43 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/multiple_content_types.eml +25 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email11.eml +34 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email12.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email2.eml +114 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email4.eml +59 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email7.eml +66 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_encoded_stack_level_too_deep.eml +53 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_illegal_boundary.eml +58 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_mimepart_without_content_type.eml +94 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_multipart_mixed_quoted_boundary.eml +50 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_nested_attachment.eml +100 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_quoted_illegal_boundary.eml +58 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/sig_only_email.eml +29 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/two_from_in_message.eml +42 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese_attachment.eml +27 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese_attachment_long_name.eml +44 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/multi_address_bounce1.eml +179 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/multi_address_bounce2.eml +179 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/report_422.eml +98 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/report_530.eml +97 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/basic_email.eml +31 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email10.eml +20 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email5.eml +19 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email6.eml +20 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email8.eml +47 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_bad_time.eml +62 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_double_at_in_header.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_incorrect_header.eml +28 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_multiple_from.eml +30 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_quoted_with_0d0a.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_reply.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_simple.eml +11 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_string_in_date_field.eml +17 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_trailing_dot.eml +21 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_with_bad_date.eml +48 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_with_partially_quoted_subject.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example01.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example02.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example03.eml +7 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example04.eml +7 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example05.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example06.eml +10 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example07.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example08.eml +12 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example09.eml +15 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example10.eml +15 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example11.eml +6 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example12.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example13.eml +10 -0
- data/vendor/mail/spec/fixtures/emails/sample_output_multipart +0 -0
- data/vendor/mail/spec/mail/attachments_list_spec.rb +214 -0
- data/vendor/mail/spec/mail/body_spec.rb +385 -0
- data/vendor/mail/spec/mail/configuration_spec.rb +19 -0
- data/vendor/mail/spec/mail/core_extensions/string_spec.rb +62 -0
- data/vendor/mail/spec/mail/core_extensions_spec.rb +99 -0
- data/vendor/mail/spec/mail/elements/address_list_spec.rb +109 -0
- data/vendor/mail/spec/mail/elements/address_spec.rb +609 -0
- data/vendor/mail/spec/mail/elements/date_time_element_spec.rb +20 -0
- data/vendor/mail/spec/mail/elements/envelope_from_element_spec.rb +31 -0
- data/vendor/mail/spec/mail/elements/message_ids_element_spec.rb +43 -0
- data/vendor/mail/spec/mail/elements/phrase_list_spec.rb +22 -0
- data/vendor/mail/spec/mail/elements/received_element_spec.rb +34 -0
- data/vendor/mail/spec/mail/encoding_spec.rb +189 -0
- data/vendor/mail/spec/mail/encodings/base64_spec.rb +25 -0
- data/vendor/mail/spec/mail/encodings/quoted_printable_spec.rb +25 -0
- data/vendor/mail/spec/mail/encodings_spec.rb +664 -0
- data/vendor/mail/spec/mail/example_emails_spec.rb +303 -0
- data/vendor/mail/spec/mail/field_list_spec.rb +33 -0
- data/vendor/mail/spec/mail/field_spec.rb +198 -0
- data/vendor/mail/spec/mail/fields/bcc_field_spec.rb +89 -0
- data/vendor/mail/spec/mail/fields/cc_field_spec.rb +79 -0
- data/vendor/mail/spec/mail/fields/comments_field_spec.rb +25 -0
- data/vendor/mail/spec/mail/fields/common/address_container_spec.rb +18 -0
- data/vendor/mail/spec/mail/fields/common/common_address_spec.rb +132 -0
- data/vendor/mail/spec/mail/fields/common/common_date_spec.rb +25 -0
- data/vendor/mail/spec/mail/fields/common/common_field_spec.rb +69 -0
- data/vendor/mail/spec/mail/fields/common/common_message_id_spec.rb +30 -0
- data/vendor/mail/spec/mail/fields/common/parameter_hash_spec.rb +56 -0
- data/vendor/mail/spec/mail/fields/content_description_field_spec.rb +39 -0
- data/vendor/mail/spec/mail/fields/content_disposition_field_spec.rb +55 -0
- data/vendor/mail/spec/mail/fields/content_id_field_spec.rb +117 -0
- data/vendor/mail/spec/mail/fields/content_location_field_spec.rb +46 -0
- data/vendor/mail/spec/mail/fields/content_transfer_encoding_field_spec.rb +113 -0
- data/vendor/mail/spec/mail/fields/content_type_field_spec.rb +678 -0
- data/vendor/mail/spec/mail/fields/date_field_spec.rb +73 -0
- data/vendor/mail/spec/mail/fields/envelope_spec.rb +48 -0
- data/vendor/mail/spec/mail/fields/from_field_spec.rb +89 -0
- data/vendor/mail/spec/mail/fields/in_reply_to_field_spec.rb +62 -0
- data/vendor/mail/spec/mail/fields/keywords_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/message_id_field_spec.rb +147 -0
- data/vendor/mail/spec/mail/fields/mime_version_field_spec.rb +166 -0
- data/vendor/mail/spec/mail/fields/received_field_spec.rb +44 -0
- data/vendor/mail/spec/mail/fields/references_field_spec.rb +35 -0
- data/vendor/mail/spec/mail/fields/reply_to_field_spec.rb +67 -0
- data/vendor/mail/spec/mail/fields/resent_bcc_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_cc_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_date_field_spec.rb +39 -0
- data/vendor/mail/spec/mail/fields/resent_from_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_message_id_field_spec.rb +24 -0
- data/vendor/mail/spec/mail/fields/resent_sender_field_spec.rb +58 -0
- data/vendor/mail/spec/mail/fields/resent_to_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/return_path_field_spec.rb +52 -0
- data/vendor/mail/spec/mail/fields/sender_field_spec.rb +58 -0
- data/vendor/mail/spec/mail/fields/structured_field_spec.rb +72 -0
- data/vendor/mail/spec/mail/fields/to_field_spec.rb +92 -0
- data/vendor/mail/spec/mail/fields/unstructured_field_spec.rb +134 -0
- data/vendor/mail/spec/mail/header_spec.rb +578 -0
- data/vendor/mail/spec/mail/mail_spec.rb +34 -0
- data/vendor/mail/spec/mail/message_spec.rb +1409 -0
- data/vendor/mail/spec/mail/mime_messages_spec.rb +435 -0
- data/vendor/mail/spec/mail/multipart_report_spec.rb +112 -0
- data/vendor/mail/spec/mail/network/delivery_methods/file_delivery_spec.rb +79 -0
- data/vendor/mail/spec/mail/network/delivery_methods/sendmail_spec.rb +125 -0
- data/vendor/mail/spec/mail/network/delivery_methods/smtp_spec.rb +133 -0
- data/vendor/mail/spec/mail/network/delivery_methods/test_mailer_spec.rb +57 -0
- data/vendor/mail/spec/mail/network/retriever_methods/pop3_spec.rb +180 -0
- data/vendor/mail/spec/mail/network_spec.rb +359 -0
- data/vendor/mail/spec/mail/parsers/address_lists_parser_spec.rb +15 -0
- data/vendor/mail/spec/mail/parsers/content_transfer_encoding_parser_spec.rb +72 -0
- data/vendor/mail/spec/mail/part_spec.rb +129 -0
- data/vendor/mail/spec/mail/parts_list_spec.rb +12 -0
- data/vendor/mail/spec/mail/round_tripping_spec.rb +44 -0
- data/vendor/mail/spec/mail/utilities_spec.rb +327 -0
- data/vendor/mail/spec/mail/version_specific/escape_paren_1_8_spec.rb +32 -0
- data/vendor/mail/spec/matchers/break_down_to.rb +35 -0
- data/vendor/mail/spec/spec_helper.rb +163 -0
- metadata +442 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mail/fields/common/parameter_hash'
|
3
|
+
|
4
|
+
describe Mail::ParameterHash do
|
5
|
+
it "should return the values in the hash" do
|
6
|
+
hash = Mail::ParameterHash.new
|
7
|
+
hash.merge!({'value1' => 'one', 'value2' => 'two'})
|
8
|
+
hash.keys.should == ['value1', 'value2']
|
9
|
+
hash.values.should == ['one', 'two']
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return the values in the hash regardless of symbol or string" do
|
13
|
+
hash = Mail::ParameterHash.new
|
14
|
+
hash.merge!({'value1' => 'one', 'value2' => 'two'})
|
15
|
+
hash['value1'].should == 'one'
|
16
|
+
hash['value2'].should == 'two'
|
17
|
+
hash[:value1].should == 'one'
|
18
|
+
hash[:value2].should == 'two'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return the correct value if they are not encoded" do
|
22
|
+
hash = Mail::ParameterHash.new
|
23
|
+
hash.merge!({'value1' => 'one', 'value2' => 'two'})
|
24
|
+
hash['value1'].should == 'one'
|
25
|
+
hash['value2'].should == 'two'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return a name list concatenated" do
|
29
|
+
hash = Mail::ParameterHash.new
|
30
|
+
hash.merge!({'value*1' => 'one', 'value*2' => 'two'})
|
31
|
+
hash['value'].should == 'onetwo'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return a name list concatenated and unencoded" do
|
35
|
+
hash = Mail::ParameterHash.new
|
36
|
+
hash.merge!({'value*0*' => "us-ascii'en'This%20is%20even%20more%20",
|
37
|
+
'value*1*' => "%2A%2A%2Afun%2A%2A%2A%20",
|
38
|
+
'value*2' => "isn't it"})
|
39
|
+
hash['value'].should == "This is even more ***fun*** isn't it"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should allow us to add a value" do
|
43
|
+
hash = Mail::ParameterHash.new
|
44
|
+
hash['value'] = 'bob'
|
45
|
+
hash['value'].should == 'bob'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return an encoded value" do
|
49
|
+
hash = Mail::ParameterHash.new
|
50
|
+
hash.merge!({'value*0*' => "us-ascii'en'This%20is%20even%20more%20",
|
51
|
+
'value*1*' => "%2A%2A%2Afun%2A%2A%2A%20",
|
52
|
+
'value*2' => "isn't it"})
|
53
|
+
hash.encoded.should == %Q{value*0*=us-ascii'en'This%20is%20even%20more%20;\r\n\tvalue*1*=%2A%2A%2Afun%2A%2A%2A%20;\r\n\tvalue*2="isn't it"}
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentDescriptionField do
|
4
|
+
# Content-Description Header Field
|
5
|
+
#
|
6
|
+
# The ability to associate some descriptive information with a given
|
7
|
+
# body is often desirable. For example, it may be useful to mark an
|
8
|
+
# "image" body as "a picture of the Space Shuttle Endeavor." Such text
|
9
|
+
# may be placed in the Content-Description header field. This header
|
10
|
+
# field is always optional.
|
11
|
+
#
|
12
|
+
# description := "Content-Description" ":" *text
|
13
|
+
#
|
14
|
+
# The description is presumed to be given in the US-ASCII character
|
15
|
+
# set, although the mechanism specified in RFC 2047 may be used for
|
16
|
+
# non-US-ASCII Content-Description values.
|
17
|
+
#
|
18
|
+
|
19
|
+
describe "initialization" do
|
20
|
+
|
21
|
+
it "should initialize" do
|
22
|
+
doing { Mail::ContentDescriptionField.new("Content-Description: This is a description") }.should_not raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should accept a string with the field name" do
|
26
|
+
t = Mail::ContentDescriptionField.new('Content-Description: This is a description')
|
27
|
+
t.name.should == 'Content-Description'
|
28
|
+
t.value.should == 'This is a description'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should accept a string without the field name" do
|
32
|
+
t = Mail::ContentDescriptionField.new('This is a description')
|
33
|
+
t.name.should == 'Content-Description'
|
34
|
+
t.value.should == 'This is a description'
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentDispositionField do
|
4
|
+
|
5
|
+
describe "initialization" do
|
6
|
+
|
7
|
+
it "should initialize" do
|
8
|
+
doing { Mail::ContentDispositionField.new("attachment; filename=File") }.should_not raise_error
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should accept a string with the field name" do
|
12
|
+
c = Mail::ContentDispositionField.new('Content-Disposition: attachment; filename=File')
|
13
|
+
c.name.should == 'Content-Disposition'
|
14
|
+
c.value.should == 'attachment; filename=File'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should accept a string without the field name" do
|
18
|
+
c = Mail::ContentDispositionField.new('attachment; filename=File')
|
19
|
+
c.name.should == 'Content-Disposition'
|
20
|
+
c.value.should == 'attachment; filename=File'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should accept a nil value and generate a disposition type" do
|
24
|
+
c = Mail::ContentDispositionField.new(nil)
|
25
|
+
c.name.should == 'Content-Disposition'
|
26
|
+
c.value.should_not be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should render encoded" do
|
30
|
+
c = Mail::ContentDispositionField.new('Content-Disposition: attachment; filename=File')
|
31
|
+
c.encoded.should == "Content-Disposition: attachment;\r\n\tfilename=File\r\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should render decoded" do
|
35
|
+
c = Mail::ContentDispositionField.new('Content-Disposition: attachment; filename=File')
|
36
|
+
c.decoded.should == 'attachment; filename=File'
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "instance methods" do
|
42
|
+
it "should give it's disposition type" do
|
43
|
+
c = Mail::ContentDispositionField.new('Content-Disposition: attachment; filename=File')
|
44
|
+
c.disposition_type.should == 'attachment'
|
45
|
+
c.parameters.should == {'filename' => 'File'}
|
46
|
+
end
|
47
|
+
|
48
|
+
# see spec/fixtures/trec_2005_corpus/missing_content_disposition.eml
|
49
|
+
it "should accept a blank disposition type" do
|
50
|
+
c = Mail::ContentDispositionField.new('Content-Disposition: ')
|
51
|
+
c.disposition_type.should_not be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentIdField do
|
4
|
+
# Content-ID Header Field
|
5
|
+
#
|
6
|
+
# In constructing a high-level user agent, it may be desirable to allow
|
7
|
+
# one body to make reference to another. Accordingly, bodies may be
|
8
|
+
# labelled using the "Content-ID" header field, which is syntactically
|
9
|
+
# identical to the "Content-ID" header field:
|
10
|
+
#
|
11
|
+
# id := "Content-ID" ":" msg-id
|
12
|
+
#
|
13
|
+
# Like the Content-ID values, Content-ID values must be generated to be
|
14
|
+
# world-unique.
|
15
|
+
#
|
16
|
+
# The Content-ID value may be used for uniquely identifying MIME
|
17
|
+
# entities in several contexts, particularly for caching data
|
18
|
+
# referenced by the message/external-body mechanism. Although the
|
19
|
+
# Content-ID header is generally optional, its use is MANDATORY in
|
20
|
+
# implementations which generate data of the optional MIME media type
|
21
|
+
# "message/external-body". That is, each message/external-body entity
|
22
|
+
# must have a Content-ID field to permit caching of such data.
|
23
|
+
#
|
24
|
+
# It is also worth noting that the Content-ID value has special
|
25
|
+
# semantics in the case of the multipart/alternative media type. This
|
26
|
+
# is explained in the section of RFC 2046 dealing with
|
27
|
+
# multipart/alternative.
|
28
|
+
|
29
|
+
|
30
|
+
describe "initialization" do
|
31
|
+
|
32
|
+
it "should initialize" do
|
33
|
+
doing { Mail::ContentIdField.new("<1234@test.lindsaar.net>") }.should_not raise_error
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should accept a string with the field name" do
|
37
|
+
c = Mail::ContentIdField.new('Content-ID: <1234@test.lindsaar.net>')
|
38
|
+
c.name.should == 'Content-ID'
|
39
|
+
c.value.should == '<1234@test.lindsaar.net>'
|
40
|
+
c.content_id.should == '1234@test.lindsaar.net'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should accept a string without the field name" do
|
44
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
45
|
+
m.name.should == 'Content-ID'
|
46
|
+
m.value.should == '<1234@test.lindsaar.net>'
|
47
|
+
m.content_id.should == '1234@test.lindsaar.net'
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should accept a nil value and generate a content_id" do
|
51
|
+
m = Mail::ContentIdField.new(nil)
|
52
|
+
m.name.should == 'Content-ID'
|
53
|
+
m.value.should_not be_nil
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should allow it to be encoded" do
|
57
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
58
|
+
m.encoded.should == "Content-ID: <1234@test.lindsaar.net>\r\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should allow it to be decoded" do
|
62
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
63
|
+
m.decoded.should == "<1234@test.lindsaar.net>"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "ensuring only one message ID" do
|
69
|
+
|
70
|
+
it "should not accept a string with multiple message IDs but only return the first" do
|
71
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net> <4567@test.lindsaar.net>')
|
72
|
+
m.name.should == 'Content-ID'
|
73
|
+
m.to_s.should == '<1234@test.lindsaar.net>'
|
74
|
+
m.content_id.should == '1234@test.lindsaar.net'
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should change the message id if given a new message id" do
|
78
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
79
|
+
m.to_s.should == '<1234@test.lindsaar.net>'
|
80
|
+
m.value = '<4567@test.lindsaar.net>'
|
81
|
+
m.to_s.should == '<4567@test.lindsaar.net>'
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "instance methods" do
|
87
|
+
it "should provide to_s" do
|
88
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
89
|
+
m.to_s.should == '<1234@test.lindsaar.net>'
|
90
|
+
m.content_id.to_s.should == '1234@test.lindsaar.net'
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should provide encoded" do
|
94
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
95
|
+
m.encoded.should == "Content-ID: <1234@test.lindsaar.net>\r\n"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should respond to :responsible_for?" do
|
99
|
+
m = Mail::ContentIdField.new('<1234@test.lindsaar.net>')
|
100
|
+
m.should respond_to(:responsible_for?)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "generating a message id" do
|
105
|
+
it "should generate a message ID if it has no value" do
|
106
|
+
m = Mail::ContentIdField.new
|
107
|
+
m.content_id.should_not be_blank
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should generate a random message ID" do
|
111
|
+
m = Mail::ContentIdField.new
|
112
|
+
1.upto(100) do
|
113
|
+
m.content_id.should_not == Mail::ContentIdField.new.content_id
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentLocationField do
|
4
|
+
|
5
|
+
# Content-Location Header Field
|
6
|
+
#
|
7
|
+
describe "initialization" do
|
8
|
+
|
9
|
+
it "should initialize" do
|
10
|
+
doing { Mail::ContentLocationField.new("Content-Location", "7bit") }.should_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should accept a string with the field name" do
|
14
|
+
t = Mail::ContentLocationField.new('Content-Location: photo.jpg')
|
15
|
+
t.name.should == 'Content-Location'
|
16
|
+
t.value.should == 'photo.jpg'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should accept a string without the field name" do
|
20
|
+
t = Mail::ContentLocationField.new('photo.jpg')
|
21
|
+
t.name.should == 'Content-Location'
|
22
|
+
t.value.should == 'photo.jpg'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should render an encoded field" do
|
26
|
+
t = Mail::ContentLocationField.new('photo.jpg')
|
27
|
+
t.encoded.should == "Content-Location: photo.jpg\r\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should render a decoded field" do
|
31
|
+
t = Mail::ContentLocationField.new('photo.jpg')
|
32
|
+
t.decoded.should == 'photo.jpg'
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "parsing the value" do
|
38
|
+
|
39
|
+
it "should return an encoding string unquoted" do
|
40
|
+
t = Mail::ContentLocationField.new('"A quoted filename.jpg"')
|
41
|
+
t.location.should == 'A quoted filename.jpg'
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentTransferEncodingField do
|
4
|
+
|
5
|
+
# Content-Transfer-Encoding Header Field
|
6
|
+
#
|
7
|
+
# Many media types which could be usefully transported via email are
|
8
|
+
# represented, in their "natural" format, as 8bit character or binary
|
9
|
+
# data. Such data cannot be transmitted over some transfer protocols.
|
10
|
+
# For example, RFC 821 (SMTP) restricts mail messages to 7bit US-ASCII
|
11
|
+
# data with lines no longer than 1000 characters including any trailing
|
12
|
+
# CRLF line separator.
|
13
|
+
#
|
14
|
+
# It is necessary, therefore, to define a standard mechanism for
|
15
|
+
# encoding such data into a 7bit short line format. Proper labelling
|
16
|
+
# of unencoded material in less restrictive formats for direct use over
|
17
|
+
# less restrictive transports is also desireable. This document
|
18
|
+
# specifies that such encodings will be indicated by a new "Content-
|
19
|
+
# Transfer-Encoding" header field. This field has not been defined by
|
20
|
+
# any previous standard.
|
21
|
+
#
|
22
|
+
# 6.1. Content-Transfer-Encoding Syntax
|
23
|
+
#
|
24
|
+
# The Content-Transfer-Encoding field's value is a single token
|
25
|
+
# specifying the type of encoding, as enumerated below. Formally:
|
26
|
+
#
|
27
|
+
# encoding := "Content-Transfer-Encoding" ":" mechanism
|
28
|
+
#
|
29
|
+
# mechanism := "7bit" / "8bit" / "binary" /
|
30
|
+
# "quoted-printable" / "base64" /
|
31
|
+
# ietf-token / x-token
|
32
|
+
#
|
33
|
+
# These values are not case sensitive -- Base64 and BASE64 and bAsE64
|
34
|
+
# are all equivalent. An encoding type of 7BIT requires that the body
|
35
|
+
#
|
36
|
+
# is already in a 7bit mail-ready representation. This is the default
|
37
|
+
# value -- that is, "Content-Transfer-Encoding: 7BIT" is assumed if the
|
38
|
+
# Content-Transfer-Encoding header field is not present.
|
39
|
+
#
|
40
|
+
describe "initialization" do
|
41
|
+
|
42
|
+
it "should initialize" do
|
43
|
+
doing { Mail::ContentTransferEncodingField.new("Content-Transfer-Encoding: 7bit") }.should_not raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should accept a string with the field name" do
|
47
|
+
t = Mail::ContentTransferEncodingField.new('Content-Transfer-Encoding: 7bit')
|
48
|
+
t.name.should == 'Content-Transfer-Encoding'
|
49
|
+
t.value.should == '7bit'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should accept a string without the field name" do
|
53
|
+
t = Mail::ContentTransferEncodingField.new('7bit')
|
54
|
+
t.name.should == 'Content-Transfer-Encoding'
|
55
|
+
t.value.should == '7bit'
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should render an encoded field" do
|
59
|
+
t = Mail::ContentTransferEncodingField.new('7bit')
|
60
|
+
t.encoded.should == "Content-Transfer-Encoding: 7bit\r\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should render a decoded field" do
|
64
|
+
t = Mail::ContentTransferEncodingField.new('7bit')
|
65
|
+
t.decoded.should == '7bit'
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "parsing the value" do
|
71
|
+
|
72
|
+
it "should return an encoding string" do
|
73
|
+
["7bit", "8bit", "binary", 'quoted-printable', "base64"].each do |encoding|
|
74
|
+
t = Mail::ContentTransferEncodingField.new(encoding)
|
75
|
+
t.encoding.should == encoding
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should handle any valid 'x-token' value" do
|
80
|
+
t = Mail::ContentTransferEncodingField.new('X-This-is_MY-encoding')
|
81
|
+
t.encoding.should == 'x-this-is_my-encoding'
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should handle an x-encoding" do
|
85
|
+
t = Mail::ContentTransferEncodingField.new("x-uuencode")
|
86
|
+
t.encoding.should == "x-uuencode"
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should replace the existing value" do
|
90
|
+
t = Mail::ContentTransferEncodingField.new("7bit")
|
91
|
+
t.parse("quoted-printable")
|
92
|
+
t.encoding.should == 'quoted-printable'
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should raise an error on bogus values" do
|
96
|
+
doing { Mail::ContentTransferEncodingField.new("broken@foo") }.should raise_error
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should handle an empty content transfer encoding" do
|
100
|
+
t = Mail::ContentTransferEncodingField.new("")
|
101
|
+
t.encoding.should == ""
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should handle a hyphen" do
|
105
|
+
t = Mail::ContentTransferEncodingField.new('7-bit')
|
106
|
+
t.decoded.should == '7bit'
|
107
|
+
t = Mail::ContentTransferEncodingField.new('8-bit')
|
108
|
+
t.decoded.should == '8bit'
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,678 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mail::ContentTypeField do
|
4
|
+
# Content-Type Header Field
|
5
|
+
#
|
6
|
+
# The purpose of the Content-Type field is to describe the data
|
7
|
+
# contained in the body fully enough that the receiving user agent can
|
8
|
+
# pick an appropriate agent or mechanism to present the data to the
|
9
|
+
# user, or otherwise deal with the data in an appropriate manner. The
|
10
|
+
# value in this field is called a media type.
|
11
|
+
#
|
12
|
+
# HISTORICAL NOTE: The Content-Type header field was first defined in
|
13
|
+
# RFC 1049. RFC 1049 used a simpler and less powerful syntax, but one
|
14
|
+
# that is largely compatible with the mechanism given here.
|
15
|
+
#
|
16
|
+
# The Content-Type header field specifies the nature of the data in the
|
17
|
+
# body of an entity by giving media type and subtype identifiers, and
|
18
|
+
# by providing auxiliary information that may be required for certain
|
19
|
+
# media types. After the media type and subtype names, the remainder
|
20
|
+
# of the header field is simply a set of parameters, specified in an
|
21
|
+
# attribute=value notation. The ordering of parameters is not
|
22
|
+
# significant.
|
23
|
+
#
|
24
|
+
# In general, the top-level media type is used to declare the general
|
25
|
+
# type of data, while the subtype specifies a specific format for that
|
26
|
+
# type of data. Thus, a media type of "image/xyz" is enough to tell a
|
27
|
+
# user agent that the data is an image, even if the user agent has no
|
28
|
+
# knowledge of the specific image format "xyz". Such information can
|
29
|
+
# be used, for example, to decide whether or not to show a user the raw
|
30
|
+
# data from an unrecognized subtype -- such an action might be
|
31
|
+
# reasonable for unrecognized subtypes of text, but not for
|
32
|
+
# unrecognized subtypes of image or audio. For this reason, registered
|
33
|
+
# subtypes of text, image, audio, and video should not contain embedded
|
34
|
+
# information that is really of a different type. Such compound
|
35
|
+
# formats should be represented using the "multipart" or "application"
|
36
|
+
# types.
|
37
|
+
#
|
38
|
+
# Parameters are modifiers of the media subtype, and as such do not
|
39
|
+
# fundamentally affect the nature of the content. The set of
|
40
|
+
# meaningful parameters depends on the media type and subtype. Most
|
41
|
+
# parameters are associated with a single specific subtype. However, a
|
42
|
+
# given top-level media type may define parameters which are applicable
|
43
|
+
# to any subtype of that type. Parameters may be required by their
|
44
|
+
# defining content type or subtype or they may be optional. MIME
|
45
|
+
# implementations must ignore any parameters whose names they do not
|
46
|
+
# recognize.
|
47
|
+
#
|
48
|
+
# For example, the "charset" parameter is applicable to any subtype of
|
49
|
+
# "text", while the "boundary" parameter is required for any subtype of
|
50
|
+
# the "multipart" media type.
|
51
|
+
#
|
52
|
+
# There are NO globally-meaningful parameters that apply to all media
|
53
|
+
# types. Truly global mechanisms are best addressed, in the MIME
|
54
|
+
# model, by the definition of additional Content-* header fields.
|
55
|
+
#
|
56
|
+
# An initial set of seven top-level media types is defined in RFC 2046.
|
57
|
+
# Five of these are discrete types whose content is essentially opaque
|
58
|
+
# as far as MIME processing is concerned. The remaining two are
|
59
|
+
# composite types whose contents require additional handling by MIME
|
60
|
+
# processors.
|
61
|
+
#
|
62
|
+
# This set of top-level media types is intended to be substantially
|
63
|
+
# complete. It is expected that additions to the larger set of
|
64
|
+
# supported types can generally be accomplished by the creation of new
|
65
|
+
# subtypes of these initial types. In the future, more top-level types
|
66
|
+
# may be defined only by a standards-track extension to this standard.
|
67
|
+
# If another top-level type is to be used for any reason, it must be
|
68
|
+
# given a name starting with "X-" to indicate its non-standard status
|
69
|
+
# and to avoid a potential conflict with a future official name.
|
70
|
+
#
|
71
|
+
describe "initialization" do
|
72
|
+
|
73
|
+
it "should initialize" do
|
74
|
+
doing { Mail::ContentTypeField.new("<1234@test.lindsaar.net>") }.should_not raise_error
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should accept a string with the field name" do
|
78
|
+
c = Mail::ContentTypeField.new('Content-Type: text/plain')
|
79
|
+
c.name.should == 'Content-Type'
|
80
|
+
c.value.should == 'text/plain'
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should accept a string without the field name" do
|
84
|
+
c = Mail::ContentTypeField.new('text/plain')
|
85
|
+
c.name.should == 'Content-Type'
|
86
|
+
c.value.should == 'text/plain'
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should accept a nil value and generate a content_type" do
|
90
|
+
c = Mail::ContentTypeField.new('Content-Type', nil)
|
91
|
+
c.name.should == 'Content-Type'
|
92
|
+
c.value.should_not be_nil
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should render encoded" do
|
96
|
+
c = Mail::ContentTypeField.new('text/plain; charset=US-ASCII; format=flowed')
|
97
|
+
c.encoded.should == %Q{Content-Type: text/plain;\r\n\tcharset=US-ASCII;\r\n\tformat=flowed\r\n}
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should render quoted values encoded" do
|
101
|
+
c = Mail::ContentTypeField.new('text/plain; example="foo bar"')
|
102
|
+
c.encoded.should == %Q{Content-Type: text/plain;\r\n\texample="foo bar"\r\n}
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should render decoded" do
|
106
|
+
c = Mail::ContentTypeField.new('text/plain; charset=US-ASCII; format=flowed')
|
107
|
+
c.decoded.should == 'text/plain; charset=US-ASCII; format=flowed'
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should render quoted values decoded" do
|
111
|
+
c = Mail::ContentTypeField.new('text/plain; example="foo bar"')
|
112
|
+
c.decoded.should == 'text/plain; example="foo bar"'
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should render " do
|
116
|
+
c = Mail::ContentTypeField.new('message/delivery-status')
|
117
|
+
c.main_type.should == 'message'
|
118
|
+
c.sub_type.should == 'delivery-status'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "instance methods" do
|
123
|
+
it "should return a content_type" do
|
124
|
+
c = Mail::ContentTypeField.new('text/plain')
|
125
|
+
c.content_type.should == 'text/plain'
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should return a content_type for the :string method" do
|
129
|
+
c = Mail::ContentTypeField.new('text/plain')
|
130
|
+
c.string.should == 'text/plain'
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should return a main_type" do
|
134
|
+
c = Mail::ContentTypeField.new('text/plain')
|
135
|
+
c.main_type.should == 'text'
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return a sub_type" do
|
139
|
+
c = Mail::ContentTypeField.new('text/plain')
|
140
|
+
c.main_type.should == 'text'
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should return a parameter as a hash" do
|
144
|
+
c = Mail::ContentTypeField.new('text/plain; charset=US-ASCII')
|
145
|
+
c.parameters.should == {'charset' => 'US-ASCII'}
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should return multiple parameters as a hash" do
|
149
|
+
c = Mail::ContentTypeField.new('text/plain; charset=US-ASCII; format=flowed')
|
150
|
+
c.parameters.should == {'charset' => 'US-ASCII', 'format' => 'flowed'}
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should return boundry parameters" do
|
154
|
+
c = Mail::ContentTypeField.new('multipart/mixed; boundary=Apple-Mail-13-196941151')
|
155
|
+
c.parameters.should == {'boundary' => 'Apple-Mail-13-196941151'}
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should be indifferent with the access" do
|
159
|
+
c = Mail::ContentTypeField.new('multipart/mixed; boundary=Apple')
|
160
|
+
c.parameters[:boundary].should == "Apple"
|
161
|
+
c.parameters['boundary'].should == "Apple"
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "class methods" do
|
167
|
+
it "should give back an initialized instance with a unique boundary" do
|
168
|
+
boundary = Mail::ContentTypeField.with_boundary('multipart/mixed')
|
169
|
+
boundary.encoded.should =~ %r{Content-Type: multipart/mixed;\r\n\tboundary="--==_mimepart_[\w\d]+_[\w\d]+"\r\n}
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should give back an initialized instance with different type with a unique boundary" do
|
173
|
+
boundary = Mail::ContentTypeField.with_boundary('multipart/alternative')
|
174
|
+
boundary.encoded.should =~ %r{Content-Type: multipart/alternative;\r\n\tboundary="--==_mimepart_[\w\d]+_[\w\d]+"\r\n}
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should give unique boundaries" do
|
178
|
+
boundary1 = Mail::ContentTypeField.with_boundary('multipart/alternative').parameters['boundary']
|
179
|
+
0.upto(250) do
|
180
|
+
boundary2 = Mail::ContentTypeField.with_boundary('multipart/alternative').parameters['boundary']
|
181
|
+
boundary1.should_not == boundary2
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "Testing a bunch of email Content-Type fields" do
|
188
|
+
|
189
|
+
it "should handle 'application/octet-stream; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%8aat.%20Pitbull.mp3'" do
|
190
|
+
string = %q{application/octet-stream; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%8aat.%20Pitbull.mp3}
|
191
|
+
c = Mail::ContentTypeField.new(string)
|
192
|
+
c.content_type.should == 'application/octet-stream'
|
193
|
+
c.main_type.should == 'application'
|
194
|
+
c.sub_type.should == 'octet-stream'
|
195
|
+
c.parameters.should == {'name*' => "iso-2022-jp'ja'01%20Quien%20Te%20Dij%8aat.%20Pitbull.mp3"}
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should handle 'application/pdf;'" do
|
199
|
+
string = %q{application/pdf;}
|
200
|
+
c = Mail::ContentTypeField.new(string)
|
201
|
+
c.content_type.should == 'application/pdf'
|
202
|
+
c.main_type.should == 'application'
|
203
|
+
c.sub_type.should == 'pdf'
|
204
|
+
c.parameters.should == {}
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should handle 'application/pdf; name=\"broken.pdf\"'" do
|
208
|
+
string = %q{application/pdf; name="broken.pdf"}
|
209
|
+
c = Mail::ContentTypeField.new(string)
|
210
|
+
c.content_type.should == 'application/pdf'
|
211
|
+
c.main_type.should == 'application'
|
212
|
+
c.sub_type.should == 'pdf'
|
213
|
+
c.parameters.should == {"name" => "broken.pdf"}
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should handle 'application/pkcs7-signature;'" do
|
217
|
+
string = %q{application/pkcs7-signature;}
|
218
|
+
c = Mail::ContentTypeField.new(string)
|
219
|
+
c.content_type.should == 'application/pkcs7-signature'
|
220
|
+
c.main_type.should == 'application'
|
221
|
+
c.sub_type.should == 'pkcs7-signature'
|
222
|
+
c.parameters.should == {}
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should handle 'application/pkcs7-signature; name=smime.p7s'" do
|
226
|
+
string = %q{application/pkcs7-signature; name=smime.p7s}
|
227
|
+
c = Mail::ContentTypeField.new(string)
|
228
|
+
c.content_type.should == 'application/pkcs7-signature'
|
229
|
+
c.main_type.should == 'application'
|
230
|
+
c.sub_type.should == 'pkcs7-signature'
|
231
|
+
c.parameters.should == {"name" => "smime.p7s"}
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should handle 'application/x-gzip; NAME=blah.gz'" do
|
235
|
+
string = %q{application/x-gzip; NAME=blah.gz}
|
236
|
+
c = Mail::ContentTypeField.new(string)
|
237
|
+
c.content_type.should == 'application/x-gzip'
|
238
|
+
c.main_type.should == 'application'
|
239
|
+
c.sub_type.should == 'x-gzip'
|
240
|
+
c.parameters.should == {"NAME" => "blah.gz"}
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should handle 'image/jpeg'" do
|
244
|
+
string = %q{image/jpeg}
|
245
|
+
c = Mail::ContentTypeField.new(string)
|
246
|
+
c.content_type.should == 'image/jpeg'
|
247
|
+
c.main_type.should == 'image'
|
248
|
+
c.sub_type.should == 'jpeg'
|
249
|
+
c.parameters.should == {}
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should handle 'image/jpeg'" do
|
253
|
+
string = %q{image/jpeg}
|
254
|
+
c = Mail::ContentTypeField.new(string)
|
255
|
+
c.content_type.should == 'image/jpeg'
|
256
|
+
c.main_type.should == 'image'
|
257
|
+
c.sub_type.should == 'jpeg'
|
258
|
+
c.parameters.should == {}
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should handle 'image/jpeg;'" do
|
262
|
+
string = %q{image/jpeg}
|
263
|
+
c = Mail::ContentTypeField.new(string)
|
264
|
+
c.content_type.should == 'image/jpeg'
|
265
|
+
c.main_type.should == 'image'
|
266
|
+
c.sub_type.should == 'jpeg'
|
267
|
+
c.parameters.should == {}
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should handle 'image/png;'" do
|
271
|
+
string = %q{image/png}
|
272
|
+
c = Mail::ContentTypeField.new(string)
|
273
|
+
c.content_type.should == 'image/png'
|
274
|
+
c.main_type.should == 'image'
|
275
|
+
c.sub_type.should == 'png'
|
276
|
+
c.parameters.should == {}
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should handle 'message/delivery-status'" do
|
280
|
+
string = %q{message/delivery-status}
|
281
|
+
c = Mail::ContentTypeField.new(string)
|
282
|
+
c.content_type.should == 'message/delivery-status'
|
283
|
+
c.main_type.should == 'message'
|
284
|
+
c.sub_type.should == 'delivery-status'
|
285
|
+
c.parameters.should == {}
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should handle 'message/rfc822'" do
|
289
|
+
string = %q{message/rfc822}
|
290
|
+
c = Mail::ContentTypeField.new(string)
|
291
|
+
c.content_type.should == 'message/rfc822'
|
292
|
+
c.main_type.should == 'message'
|
293
|
+
c.sub_type.should == 'rfc822'
|
294
|
+
c.parameters.should == {}
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should handle 'multipart/alternative;'" do
|
298
|
+
string = %q{multipart/alternative;}
|
299
|
+
c = Mail::ContentTypeField.new(string)
|
300
|
+
c.content_type.should == 'multipart/alternative'
|
301
|
+
c.main_type.should == 'multipart'
|
302
|
+
c.sub_type.should == 'alternative'
|
303
|
+
c.parameters.should == {}
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should handle 'multipart/alternative; boundary=\"----=_NextPart_000_0093_01C81419.EB75E850\"'" do
|
307
|
+
string = %q{multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"}
|
308
|
+
c = Mail::ContentTypeField.new(string)
|
309
|
+
c.content_type.should == 'multipart/alternative'
|
310
|
+
c.main_type.should == 'multipart'
|
311
|
+
c.sub_type.should == 'alternative'
|
312
|
+
c.parameters.should == {"boundary" =>"----=_NextPart_000_0093_01C81419.EB75E850"}
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should handle 'multipart/alternative; boundary=----=_NextPart_000_0093_01C81419.EB75E850'" do
|
316
|
+
string = %q{multipart/alternative; boundary="----=_NextPart_000_0093_01C81419.EB75E850"}
|
317
|
+
c = Mail::ContentTypeField.new(string)
|
318
|
+
c.content_type.should == 'multipart/alternative'
|
319
|
+
c.main_type.should == 'multipart'
|
320
|
+
c.sub_type.should == 'alternative'
|
321
|
+
c.parameters.should == {"boundary" =>"----=_NextPart_000_0093_01C81419.EB75E850"}
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should handle 'multipart/mixed'" do
|
325
|
+
string = %q{multipart/mixed}
|
326
|
+
c = Mail::ContentTypeField.new(string)
|
327
|
+
c.content_type.should == 'multipart/mixed'
|
328
|
+
c.main_type.should == 'multipart'
|
329
|
+
c.sub_type.should == 'mixed'
|
330
|
+
c.parameters.should == {}
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should handle 'multipart/mixed;'" do
|
334
|
+
string = %q{multipart/mixed;}
|
335
|
+
c = Mail::ContentTypeField.new(string)
|
336
|
+
c.content_type.should == 'multipart/mixed'
|
337
|
+
c.main_type.should == 'multipart'
|
338
|
+
c.sub_type.should == 'mixed'
|
339
|
+
c.parameters.should == {}
|
340
|
+
end
|
341
|
+
|
342
|
+
it "should handle 'multipart/mixed; boundary=Apple-Mail-13-196941151'" do
|
343
|
+
string = %q{multipart/mixed; boundary=Apple-Mail-13-196941151}
|
344
|
+
c = Mail::ContentTypeField.new(string)
|
345
|
+
c.content_type.should == 'multipart/mixed'
|
346
|
+
c.main_type.should == 'multipart'
|
347
|
+
c.sub_type.should == 'mixed'
|
348
|
+
c.parameters.should == {"boundary" => "Apple-Mail-13-196941151"}
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should handle 'multipart/mixed; boundary=mimepart_427e4cb4ca329_133ae40413c81ef'" do
|
352
|
+
string = %q{multipart/mixed; boundary=mimepart_427e4cb4ca329_133ae40413c81ef}
|
353
|
+
c = Mail::ContentTypeField.new(string)
|
354
|
+
c.content_type.should == 'multipart/mixed'
|
355
|
+
c.main_type.should == 'multipart'
|
356
|
+
c.sub_type.should == 'mixed'
|
357
|
+
c.parameters.should == {"boundary" => "mimepart_427e4cb4ca329_133ae40413c81ef"}
|
358
|
+
end
|
359
|
+
|
360
|
+
it "should handle 'multipart/report; report-type=delivery-status;'" do
|
361
|
+
string = %q{multipart/report; report-type=delivery-status;}
|
362
|
+
c = Mail::ContentTypeField.new(string)
|
363
|
+
c.content_type.should == 'multipart/report'
|
364
|
+
c.main_type.should == 'multipart'
|
365
|
+
c.sub_type.should == 'report'
|
366
|
+
c.parameters.should == {"report-type" => "delivery-status"}
|
367
|
+
end
|
368
|
+
|
369
|
+
it "should handle 'multipart/signed;'" do
|
370
|
+
string = %q{multipart/signed;}
|
371
|
+
c = Mail::ContentTypeField.new(string)
|
372
|
+
c.content_type.should == 'multipart/signed'
|
373
|
+
c.main_type.should == 'multipart'
|
374
|
+
c.sub_type.should == 'signed'
|
375
|
+
c.parameters.should == {}
|
376
|
+
end
|
377
|
+
|
378
|
+
it "should handle 'text/enriched;'" do
|
379
|
+
string = %q{text/enriched;}
|
380
|
+
c = Mail::ContentTypeField.new(string)
|
381
|
+
c.content_type.should == 'text/enriched'
|
382
|
+
c.main_type.should == 'text'
|
383
|
+
c.sub_type.should == 'enriched'
|
384
|
+
c.parameters.should == {}
|
385
|
+
end
|
386
|
+
|
387
|
+
it "should handle 'text/html;'" do
|
388
|
+
string = %q{text/html;}
|
389
|
+
c = Mail::ContentTypeField.new(string)
|
390
|
+
c.content_type.should == 'text/html'
|
391
|
+
c.main_type.should == 'text'
|
392
|
+
c.sub_type.should == 'html'
|
393
|
+
c.parameters.should == {}
|
394
|
+
end
|
395
|
+
|
396
|
+
it "should handle 'text/html; charset=iso-8859-1;'" do
|
397
|
+
string = %q{text/html; charset=iso-8859-1;}
|
398
|
+
c = Mail::ContentTypeField.new(string)
|
399
|
+
c.content_type.should == 'text/html'
|
400
|
+
c.main_type.should == 'text'
|
401
|
+
c.sub_type.should == 'html'
|
402
|
+
c.parameters.should == {'charset' => 'iso-8859-1'}
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should handle 'text/plain'" do
|
406
|
+
string = %q{text/plain}
|
407
|
+
c = Mail::ContentTypeField.new(string)
|
408
|
+
c.content_type.should == 'text/plain'
|
409
|
+
c.main_type.should == 'text'
|
410
|
+
c.sub_type.should == 'plain'
|
411
|
+
c.parameters.should == {}
|
412
|
+
end
|
413
|
+
|
414
|
+
it "should handle 'text/plain;'" do
|
415
|
+
string = %q{text/plain;}
|
416
|
+
c = Mail::ContentTypeField.new(string)
|
417
|
+
c.content_type.should == 'text/plain'
|
418
|
+
c.main_type.should == 'text'
|
419
|
+
c.sub_type.should == 'plain'
|
420
|
+
c.parameters.should == {}
|
421
|
+
end
|
422
|
+
|
423
|
+
it "should handle 'text/plain; charset=ISO-8859-1'" do
|
424
|
+
string = %q{text/plain; charset=ISO-8859-1}
|
425
|
+
c = Mail::ContentTypeField.new(string)
|
426
|
+
c.content_type.should == 'text/plain'
|
427
|
+
c.main_type.should == 'text'
|
428
|
+
c.sub_type.should == 'plain'
|
429
|
+
c.parameters.should == {'charset' => 'ISO-8859-1'}
|
430
|
+
end
|
431
|
+
|
432
|
+
it "should handle 'text/plain; charset=ISO-8859-1;'" do
|
433
|
+
string = %q{text/plain; charset=ISO-8859-1; format=flowed}
|
434
|
+
c = Mail::ContentTypeField.new(string)
|
435
|
+
c.content_type.should == 'text/plain'
|
436
|
+
c.main_type.should == 'text'
|
437
|
+
c.sub_type.should == 'plain'
|
438
|
+
c.parameters.should == {'charset' => 'ISO-8859-1', 'format' => 'flowed'}
|
439
|
+
end
|
440
|
+
|
441
|
+
it "should handle 'text/plain; charset=us-ascii;'" do
|
442
|
+
string = %q{text/plain; charset=us-ascii}
|
443
|
+
c = Mail::ContentTypeField.new(string)
|
444
|
+
c.content_type.should == 'text/plain'
|
445
|
+
c.main_type.should == 'text'
|
446
|
+
c.sub_type.should == 'plain'
|
447
|
+
c.parameters.should == {'charset' => 'us-ascii'}
|
448
|
+
end
|
449
|
+
|
450
|
+
it "should handle 'text/plain; charset=US-ASCII; format=flowed'" do
|
451
|
+
string = %q{text/plain; charset=US-ASCII; format=flowed}
|
452
|
+
c = Mail::ContentTypeField.new(string)
|
453
|
+
c.content_type.should == 'text/plain'
|
454
|
+
c.main_type.should == 'text'
|
455
|
+
c.sub_type.should == 'plain'
|
456
|
+
c.parameters.should == {'charset' => 'US-ASCII', 'format' => 'flowed'}
|
457
|
+
end
|
458
|
+
|
459
|
+
it "should handle 'text/plain; charset=US-ASCII; format=flowed'" do
|
460
|
+
string = %q{text/plain; charset=US-ASCII; format=flowed}
|
461
|
+
c = Mail::ContentTypeField.new(string)
|
462
|
+
c.content_type.should == 'text/plain'
|
463
|
+
c.main_type.should == 'text'
|
464
|
+
c.sub_type.should == 'plain'
|
465
|
+
c.parameters.should == {'charset' => 'US-ASCII', 'format' => 'flowed'}
|
466
|
+
end
|
467
|
+
|
468
|
+
it "should handle 'text/plain; charset=utf-8'" do
|
469
|
+
string = %q{text/plain; charset=utf-8}
|
470
|
+
c = Mail::ContentTypeField.new(string)
|
471
|
+
c.content_type.should == 'text/plain'
|
472
|
+
c.main_type.should == 'text'
|
473
|
+
c.sub_type.should == 'plain'
|
474
|
+
c.parameters.should == {'charset' => 'utf-8'}
|
475
|
+
end
|
476
|
+
|
477
|
+
it "should handle 'text/plain; charset=utf-8'" do
|
478
|
+
string = %q{text/plain; charset=X-UNKNOWN}
|
479
|
+
c = Mail::ContentTypeField.new(string)
|
480
|
+
c.content_type.should == 'text/plain'
|
481
|
+
c.main_type.should == 'text'
|
482
|
+
c.sub_type.should == 'plain'
|
483
|
+
c.parameters.should == {'charset' => 'X-UNKNOWN'}
|
484
|
+
end
|
485
|
+
|
486
|
+
it "should handle 'text/x-ruby-script;'" do
|
487
|
+
string = %q{text/x-ruby-script;}
|
488
|
+
c = Mail::ContentTypeField.new(string)
|
489
|
+
c.content_type.should == 'text/x-ruby-script'
|
490
|
+
c.main_type.should == 'text'
|
491
|
+
c.sub_type.should == 'x-ruby-script'
|
492
|
+
c.parameters.should == {}
|
493
|
+
end
|
494
|
+
|
495
|
+
it "should handle 'text/x-ruby-script; name=\"hello.rb\"'" do
|
496
|
+
string = %q{text/x-ruby-script; name="hello.rb"}
|
497
|
+
c = Mail::ContentTypeField.new(string)
|
498
|
+
c.content_type.should == 'text/x-ruby-script'
|
499
|
+
c.main_type.should == 'text'
|
500
|
+
c.sub_type.should == 'x-ruby-script'
|
501
|
+
c.parameters.should == {'name' => 'hello.rb'}
|
502
|
+
end
|
503
|
+
|
504
|
+
it "should handle 'multipart/mixed; boundary=\"=_NextPart_Lycos_15031600484464_ID\"" do
|
505
|
+
string = %q{multipart/mixed; boundary="=_NextPart_Lycos_15031600484464_ID"}
|
506
|
+
c = Mail::ContentTypeField.new(string)
|
507
|
+
c.content_type.should == 'multipart/mixed'
|
508
|
+
c.main_type.should == 'multipart'
|
509
|
+
c.sub_type.should == 'mixed'
|
510
|
+
c.parameters.should == {'boundary' => '=_NextPart_Lycos_15031600484464_ID'}
|
511
|
+
end
|
512
|
+
|
513
|
+
it "should handle 'multipart/alternative; boundary=----=_=NextPart_000_0093_01C81419.EB75E850" do
|
514
|
+
string = %q{multipart/alternative; boundary=----=_=NextPart_000_0093_01C81419.EB75E850}
|
515
|
+
c = Mail::ContentTypeField.new(string)
|
516
|
+
c.content_type.should == 'multipart/alternative'
|
517
|
+
c.main_type.should == 'multipart'
|
518
|
+
c.sub_type.should == 'alternative'
|
519
|
+
c.parameters.should == {'boundary' => '----=_=NextPart_000_0093_01C81419.EB75E850'}
|
520
|
+
end
|
521
|
+
|
522
|
+
it "should handle 'multipart/alternative; boundary=\"----=_=NextPart_000_0093_01C81419.EB75E850\"" do
|
523
|
+
string = %q{multipart/alternative; boundary="----=_=NextPart_000_0093_01C81419.EB75E850"}
|
524
|
+
c = Mail::ContentTypeField.new(string)
|
525
|
+
c.content_type.should == 'multipart/alternative'
|
526
|
+
c.main_type.should == 'multipart'
|
527
|
+
c.sub_type.should == 'alternative'
|
528
|
+
c.parameters.should == {'boundary' => '----=_=NextPart_000_0093_01C81419.EB75E850'}
|
529
|
+
end
|
530
|
+
|
531
|
+
it "should handle 'multipart/related;boundary=1_4626B816_9F1690;Type=\"application/smil\";Start=\"<mms.smil.txt>\"'" do
|
532
|
+
string = %q{multipart/related;boundary=1_4626B816_9F1690;Type="application/smil";Start="<mms.smil.txt>"}
|
533
|
+
c = Mail::ContentTypeField.new(string)
|
534
|
+
c.content_type.should == 'multipart/related'
|
535
|
+
c.main_type.should == 'multipart'
|
536
|
+
c.sub_type.should == 'related'
|
537
|
+
c.parameters.should == {'boundary' => '1_4626B816_9F1690', 'Type' => 'application/smil', 'Start' => '<mms.smil.txt>'}
|
538
|
+
end
|
539
|
+
|
540
|
+
end
|
541
|
+
|
542
|
+
describe "finding a filename" do
|
543
|
+
|
544
|
+
it "should locate a filename if there is a filename" do
|
545
|
+
string = %q{application/octet-stream; filename=mikel.jpg}
|
546
|
+
c = Mail::ContentTypeField.new(string)
|
547
|
+
c.filename.should == 'mikel.jpg'
|
548
|
+
end
|
549
|
+
|
550
|
+
it "should locate a name if there is no filename" do
|
551
|
+
string = %q{application/octet-stream; name=mikel.jpg}
|
552
|
+
c = Mail::ContentTypeField.new(string)
|
553
|
+
c.filename.should == 'mikel.jpg'
|
554
|
+
end
|
555
|
+
|
556
|
+
it "should locate an encoded name as a filename" do
|
557
|
+
string = %q{application/octet-stream; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%91at.%20Pitbull.mp3}
|
558
|
+
c = Mail::ContentTypeField.new(string)
|
559
|
+
if RUBY_VERSION >= '1.9'
|
560
|
+
expected = "01 Quien Te Dij\221at. Pitbull.mp3".force_encoding(Encoding::BINARY)
|
561
|
+
result = c.filename.force_encoding(Encoding::BINARY)
|
562
|
+
else
|
563
|
+
expected = "01 Quien Te Dij\221at. Pitbull.mp3"
|
564
|
+
result = c.filename
|
565
|
+
end
|
566
|
+
expected.should == result
|
567
|
+
end
|
568
|
+
|
569
|
+
it "should encode a non us-ascii filename" do
|
570
|
+
@original = $KCODE if RUBY_VERSION < '1.9'
|
571
|
+
Mail.defaults do
|
572
|
+
param_encode_language('jp')
|
573
|
+
end
|
574
|
+
c = Mail::ContentTypeField.new('application/octet-stream')
|
575
|
+
string = "01 Quien Te Dij\221at. Pitbull.mp3"
|
576
|
+
if RUBY_VERSION >= '1.9'
|
577
|
+
string.force_encoding('SJIS')
|
578
|
+
result = %Q{Content-Type: application/octet-stream;\r\n\tfilename*=shift_jis'jp'01%20Quien%20Te%20Dij%91%61t.%20Pitbull.mp3\r\n}
|
579
|
+
else
|
580
|
+
storedkcode = $KCODE
|
581
|
+
$KCODE = 'SJIS'
|
582
|
+
result = %Q{Content-Type: application/octet-stream;\r\n\tfilename*=sjis'jp'01%20Quien%20Te%20Dij%91at.%20Pitbull.mp3\r\n}
|
583
|
+
end
|
584
|
+
c.filename = string
|
585
|
+
c.parameters.should == {'filename' => string}
|
586
|
+
c.encoded.should == result
|
587
|
+
$KCODE = @original if RUBY_VERSION < '1.9'
|
588
|
+
end
|
589
|
+
|
590
|
+
end
|
591
|
+
|
592
|
+
describe "handling badly formated content-type fields" do
|
593
|
+
|
594
|
+
it "should handle missing sub-type on a text content type" do
|
595
|
+
c = Mail::ContentTypeField.new('Content-Type: text')
|
596
|
+
c.content_type.should == 'text/plain'
|
597
|
+
end
|
598
|
+
|
599
|
+
it "should handle missing ; after content-type" do
|
600
|
+
c = Mail::ContentTypeField.new('Content-Type: multipart/mixed boundary="----=_NextPart_000_000F_01C17754.8C3CAF30"')
|
601
|
+
c.content_type.should == 'multipart/mixed'
|
602
|
+
c.parameters['boundary'].should == '----=_NextPart_000_000F_01C17754.8C3CAF30'
|
603
|
+
end
|
604
|
+
|
605
|
+
end
|
606
|
+
|
607
|
+
describe "initializing with an array" do
|
608
|
+
it "should initialize with an array" do
|
609
|
+
c = Mail::ContentTypeField.new(['text', 'html', {'charset' => 'UTF-8'}])
|
610
|
+
c.content_type.should == 'text/html'
|
611
|
+
c.parameters['charset'].should == 'UTF-8'
|
612
|
+
end
|
613
|
+
|
614
|
+
it "should allow many parameters to be passed in" do
|
615
|
+
c = Mail::ContentTypeField.new(['text', 'html', {"format"=>"flowed", "charset"=>"utf-8"}])
|
616
|
+
c.content_type.should == 'text/html'
|
617
|
+
c.parameters['charset'].should == 'utf-8'
|
618
|
+
c.parameters['format'].should == 'flowed'
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
describe "special case values needing sanity" do
|
623
|
+
it "should handle 'text/plain;ISO-8559-1'" do
|
624
|
+
c = Mail::ContentTypeField.new('text/plain;ISO-8559-1')
|
625
|
+
c.string.should == 'text/plain'
|
626
|
+
c.parameters['charset'].should == 'ISO-8559-1'
|
627
|
+
end
|
628
|
+
|
629
|
+
it "should handle text; params" do
|
630
|
+
c = Mail::ContentTypeField.new('text; charset=utf-8')
|
631
|
+
c.string.should == 'text/plain'
|
632
|
+
c.parameters['charset'].should == 'utf-8'
|
633
|
+
end
|
634
|
+
|
635
|
+
it 'should handle text/html; charset="charset="GB2312""' do
|
636
|
+
c = Mail::ContentTypeField.new('text/html; charset="charset="GB2312""')
|
637
|
+
c.string.should == 'text/html'
|
638
|
+
c.parameters['charset'].should == 'GB2312'
|
639
|
+
end
|
640
|
+
|
641
|
+
it "should handle application/octet-stream; name=archiveshelp1[1].htm" do
|
642
|
+
c = Mail::ContentTypeField.new('application/octet-stream; name=archiveshelp1[1].htm')
|
643
|
+
c.string.should == 'application/octet-stream'
|
644
|
+
c.parameters['name'].should == 'archiveshelp1[1].htm'
|
645
|
+
end
|
646
|
+
|
647
|
+
it 'should handle text/plain;; format="flowed"' do
|
648
|
+
c = Mail::ContentTypeField.new('text/plain;; format="flowed"')
|
649
|
+
c.string.should == 'text/plain'
|
650
|
+
c.parameters['format'].should == 'flowed'
|
651
|
+
end
|
652
|
+
|
653
|
+
it 'set an empty content type to text/plain' do
|
654
|
+
c = Mail::ContentTypeField.new('')
|
655
|
+
c.string.should == 'text/plain'
|
656
|
+
end
|
657
|
+
|
658
|
+
it "should just ignore illegal params like audio/x-midi;\r\n\tname=Part .exe" do
|
659
|
+
c = Mail::ContentTypeField.new("audio/x-midi;\r\n\tname=Part .exe")
|
660
|
+
c.string.should == 'audio/x-midi'
|
661
|
+
c.parameters['name'].should == nil
|
662
|
+
end
|
663
|
+
|
664
|
+
it "should handle: rfc822; format=flowed; charset=iso-8859-15" do
|
665
|
+
c = Mail::ContentTypeField.new("rfc822; format=flowed; charset=iso-8859-15")
|
666
|
+
c.string.should == 'text/plain'
|
667
|
+
c.parameters['format'].should == 'flowed'
|
668
|
+
c.parameters['charset'].should == 'iso-8859-15'
|
669
|
+
end
|
670
|
+
|
671
|
+
it "should just get the mime type if all else fails with some real garbage" do
|
672
|
+
c = Mail::ContentTypeField.new("text/html; format=flowed; charset=iso-8859-15 Mime-Version: 1.0")
|
673
|
+
c.string.should == 'text/html'
|
674
|
+
end
|
675
|
+
|
676
|
+
end
|
677
|
+
|
678
|
+
end
|