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()); } } }
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()); } } }