void mime_parse_object_t::test<1>() { // parse one mime object const std::string SERIALIZED_MIME("Content-Length: 200\r\nContent-Type: text/plain\r\n\r\naaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccc\r\n"); std::stringstream istr; istr.str(SERIALIZED_MIME); LLMimeIndex mime; LLMimeParser parser; bool ok = parser.parseIndex(istr, mime); ensure("Parse successful.", ok); ensure_equals("content type", mime.contentType(), "text/plain"); ensure_equals("content length", mime.contentLength(), 200); ensure_equals("offset", mime.offset(), 49); }
void mime_index_object_t::test<1>() { LLMimeIndex mime; ensure("no headers", mime.headers().isUndefined()); ensure_equals("invalid offset", mime.offset(), -1); ensure_equals("invalid content length", mime.contentLength(), -1); ensure("no content type", mime.contentType().empty()); ensure("not multipart", !mime.isMultipart()); ensure_equals("no attachments", mime.subPartCount(), 0); }
void mime_parse_object_t::test<5>() { // test multi-part with multiple params const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary=segment; comment=\"testing multiple params.\"\r\nContent-Length: 220\r\n\r\n--segment\r\nContent-Type: text/plain\r\nContent-Length: 55\r\n\r\nhow are you today?\r\nI do not know. I guess I am:\n'fine'\r\n\r\n--segment\r\nContent-Type: text/xml; charset=UTF-8\r\nContent-Length: 22\r\n\r\n<llsd><undef /></llsd>\r\n\r\n"); std::stringstream istr; istr.str(SERIALIZED_MIME); LLMimeIndex mime; LLMimeParser parser; bool ok = parser.parseIndex(istr, mime); ensure("Parse successful.", ok); ensure("is multipart.", mime.isMultipart()); ensure_equals("sub-part count", mime.subPartCount(), 2); ensure_equals("content length", mime.contentLength(), 220); LLMimeIndex mime_plain(mime.subPart(0)); ensure_equals( "first part type", mime_plain.contentType(), "text/plain"); ensure_equals( "first part content length", mime_plain.contentLength(), 55); LLMimeIndex mime_xml(mime.subPart(1)); ensure_equals( "second part type", mime_xml.contentType(), "text/xml; charset=UTF-8"); ensure_equals( "second part content length", mime_xml.contentLength(), 22); }
bool LLMimeParser::Impl::parseIndex( std::istream& istr, S32 limit, const std::string& separator, bool is_subpart, LLMimeIndex& index) { LLSD headers; bool parsed_something = false; if(parseHeaders(istr, limit, headers)) { parsed_something = true; LLMimeIndex mime(headers, mScanCount); index = mime; if(index.isMultipart()) { // Figure out the separator, scan past it, and recurse. std::string ct = headers[CONTENT_TYPE].asString(); std::string sep = findSeparator(ct); scanPastSeparator(istr, limit, sep); while(continueParse() && parseIndex(istr, limit, sep, true, mime)) { index.attachSubPart(mime); } } else { // Scan to the end of content. scanPastContent(istr, limit, headers, separator); if(is_subpart) { scanPastSeparator(istr, limit, separator); } } } if(mError) return false; return parsed_something; }
void mime_parse_object_t::test<6>() { // test multi-part with no specified boundary and eof /* Content-Type: multipart/relatedrnContent-Length: 220rnrn--rnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--rnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn */ const std::string SERIALIZED_MIME("Content-Type: multipart/related\r\nContent-Length: 500\r\n\r\n--\r\nContent-Type: text/plain\r\nContent-Length: 55\r\n\r\nhow are you today?\r\nI do not know. I guess I am:\n'fine'\r\n\r\n--\r\nContent-Type: text/xml; charset=UTF-8\r\nContent-Length: 22\r\n\r\n<llsd><undef /></llsd>\r\n\r\n"); std::stringstream istr; istr.str(SERIALIZED_MIME); LLMimeIndex mime; LLMimeParser parser; bool ok = parser.parseIndex(istr, mime); ensure("Parse successful.", ok); ensure("is multipart.", mime.isMultipart()); ensure_equals("sub-part count", mime.subPartCount(), 2); ensure_equals("content length", mime.contentLength(), 500); ensure_equals("data offset for multipart", mime.offset(), 56); LLMimeIndex mime_plain(mime.subPart(0)); ensure_equals( "first part type", mime_plain.contentType(), "text/plain"); ensure_equals( "first part content length", mime_plain.contentLength(), 55); ensure_equals("first part offset", mime_plain.offset(), 108); LLMimeIndex mime_xml(mime.subPart(1)); ensure_equals( "second part type", mime_xml.contentType(), "text/xml; charset=UTF-8"); ensure_equals( "second part content length", mime_xml.contentLength(), 22); ensure_equals("second part offset", mime_xml.offset(), 232); }
void mime_parse_object_t::test<3>() { // test multi-part and lack of content length for some of it. /* Content-Type: multipart/mixed; boundary="segment"rnContent-Length: 148rnrn--segmentrnContent-Type: text/plainrnrnsome datarnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn */ const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary=\"segment\"\r\nContent-Length: 150\r\n\r\n--segment\r\nContent-Type: text/plain\r\n\r\nsome data\r\n\r\n--segment\r\nContent-Type: text/xml; charset=UTF-8\r\nContent-Length: 22\r\n\r\n<llsd><undef /></llsd>\r\n\r\n"); std::stringstream istr; istr.str(SERIALIZED_MIME); LLMimeIndex mime; LLMimeParser parser; bool ok = parser.parseIndex(istr, mime); ensure("Parse successful.", ok); ensure("is multipart.", mime.isMultipart()); ensure_equals("sub-part count", mime.subPartCount(), 2); ensure_equals("content length", mime.contentLength(), 150); ensure_equals("data offset for multipart", mime.offset(), 74); LLMimeIndex mime_plain(mime.subPart(0)); ensure_equals( "first part type", mime_plain.contentType(), "text/plain"); ensure_equals( "first part content length not known.", mime_plain.contentLength(), -1); ensure_equals("first part offset", mime_plain.offset(), 113); LLMimeIndex mime_xml(mime.subPart(1)); ensure_equals( "second part type", mime_xml.contentType(), "text/xml; charset=UTF-8"); ensure_equals( "second part content length", mime_xml.contentLength(), 22); ensure_equals("second part offset", mime_xml.offset(), 198); }
void mime_parse_object_t::test<4>() { // test multi-part, unquoted separator, and premature eof conditions /* Content-Type: multipart/mixed; boundary=segmentrnContent-Length: 220rnrn--segmentrnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn */ const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary=segment\r\nContent-Length: 220\r\n\r\n--segment\r\nContent-Type: text/plain\r\nContent-Length: 55\r\n\r\nhow are you today?\r\nI do not know. I guess I am:\n'fine'\r\n\r\n--segment\r\nContent-Type: text/xml; charset=UTF-8\r\nContent-Length: 22\r\n\r\n<llsd><undef /></llsd>\r\n\r\n"); std::stringstream istr; istr.str(SERIALIZED_MIME); LLMimeIndex mime; LLMimeParser parser; bool ok = parser.parseIndex(istr, mime); ensure("Parse successful.", ok); ensure("is multipart.", mime.isMultipart()); ensure_equals("sub-part count", mime.subPartCount(), 2); ensure_equals("content length", mime.contentLength(), 220); ensure_equals("data offset for multipart", mime.offset(), 72); LLMimeIndex mime_plain(mime.subPart(0)); ensure_equals( "first part type", mime_plain.contentType(), "text/plain"); ensure_equals( "first part content length", mime_plain.contentLength(), 55); ensure_equals("first part offset", mime_plain.offset(), 131); LLMimeIndex mime_xml(mime.subPart(1)); ensure_equals( "second part type", mime_xml.contentType(), "text/xml; charset=UTF-8"); ensure_equals( "second part content length", mime_xml.contentLength(), 22); ensure_equals("second part offset", mime_xml.offset(), 262); }