Пример #1
0
void body::initNewPart(shared_ptr <bodyPart> part)
{
	// A part can be in only one body at the same time: if part is
	// already attached to a parent part, remove it from the current
	// parent part
	if (part->getParentPart())
		part->getParentPart()->getBody()->removePart(part);

	if (m_part != NULL)
	{
		m_part->importChildPart(part);

		shared_ptr <header> hdr = m_part->getHeader();

		// Check whether we have a boundary string
		shared_ptr <contentTypeField> ctf =
			hdr->findField <contentTypeField>(fields::CONTENT_TYPE);

		if (ctf)
		{
			if (ctf->hasBoundary())
			{
				const string boundary = ctf->getBoundary();

				if (boundary.empty() || !isValidBoundary(boundary))
					ctf->setBoundary(generateRandomBoundaryString());
			}
			else
			{
				// No "boundary" parameter: generate a random one.
				ctf->setBoundary(generateRandomBoundaryString());
			}

			if (ctf->getValue <mediaType>()->getType() != mediaTypes::MULTIPART)
			{
				// Warning: multi-part body but the Content-Type is
				// not specified as "multipart/..."
			}
		}
		else
		{
			// No "Content-Type" field: create a new one and generate
			// a random boundary string.
			ctf = hdr->getField <contentTypeField>(fields::CONTENT_TYPE);

			ctf->setValue(mediaType(mediaTypes::MULTIPART, mediaTypes::MULTIPART_MIXED));
			ctf->setBoundary(generateRandomBoundaryString());
		}
	}
}
Пример #2
0
void body::initNewPart(ref <bodyPart> part)
{
    part->m_parent = m_part;

    ref <header> hdr = m_header.acquire();

    if (hdr != NULL)
    {
        // Check whether we have a boundary string
        try
        {
            ref <contentTypeField> ctf =
                hdr->findField(fields::CONTENT_TYPE).dynamicCast <contentTypeField>();

            try
            {
                const string boundary = ctf->getBoundary();

                if (boundary.empty() || !isValidBoundary(boundary))
                    ctf->setBoundary(generateRandomBoundaryString());
            }
            catch (exceptions::no_such_parameter&)
            {
                // No "boundary" parameter: generate a random one.
                ctf->setBoundary(generateRandomBoundaryString());
            }

            if (ctf->getValue().dynamicCast <const mediaType>()->getType() != mediaTypes::MULTIPART)
            {
                // Warning: multi-part body but the Content-Type is
                // not specified as "multipart/..."
            }
        }
        catch (exceptions::no_such_field&)
        {
            // No "Content-Type" field: create a new one and generate
            // a random boundary string.
            ref <contentTypeField> ctf =
                hdr->getField(fields::CONTENT_TYPE).dynamicCast <contentTypeField>();

            ctf->setValue(mediaType(mediaTypes::MULTIPART, mediaTypes::MULTIPART_MIXED));
            ctf->setBoundary(generateRandomBoundaryString());
        }
    }
}