XBOX::VError VHTTPWebsocketHandler::ValidateHeader(const XBOX::VHTTPHeader& hdr,XBOX::VString & outKey) { XBOX::VError l_err; XBOX::VString l_hdrstr; XBOX::VString l_tmp; l_err = VE_OK; hdr.ToString(l_hdrstr); if ( !hdr.GetHeaderValue(K_UPGRADE,l_tmp) || !l_tmp.EqualToString(K_WEBSOCKET,true) ) { l_err = VE_INVALID_PARAMETER; } if ( !l_err && ( !hdr.GetHeaderValue(HEADER_CONNECTION,l_tmp) || (l_tmp.Find(K_UPGRADE) < 1 ) ) ) { l_err = VE_INVALID_PARAMETER; } if ( !l_err && ( !hdr.GetHeaderValue(K_WBSCK_VERS,l_tmp) || (l_tmp.GetWord() < 13) ) ) { l_err = VE_INVALID_PARAMETER; } if ( !l_err && !hdr.GetHeaderValue(K_WBSCK_KEY,outKey) ) { l_err = VE_INVALID_PARAMETER; } return l_err; }
void VMIMEMessage::_ReadMultiPartMail (const XBOX::VStream &inStream) { XBOX::VStream &stream = const_cast<XBOX::VStream&>(inStream); VMIMEReader reader(fBoundary, stream); while (reader.HasNextPart()) { XBOX::VHTTPMessage message; reader.GetNextPart(message); // Parse header of part. XBOX::VHTTPHeader header = message.GetHeaders(); const XBOX::VNameValueCollection &headerList = header.GetHeaderList(); XBOX::VNameValueCollection::ConstIterator it; XBOX::VString name, fileName, contentType, contentID; bool isInline, isBase64, isQuotedPrintable; isInline = isBase64 = isQuotedPrintable = false; for (it = headerList.begin(); it != headerList.end(); it++) { XBOX::VString value; XBOX::VNameValueCollection params; if (HTTPTools::EqualASCIIVString(it->first, "Content-Type", false)) { header.GetHeaderValue(it->first, contentType); VHTTPHeader::SplitParameters(contentType, value, params); if (params.Has("name")) { name = params.Get("name"); _UnQuote(&name, '"', '"'); } } else if (HTTPTools::EqualASCIIVString(it->first, "Content-Disposition", false)) { XBOX::VString disposition; header.GetHeaderValue(it->first, value); VHTTPHeader::SplitParameters(value, disposition, params); isInline = HTTPTools::EqualASCIIVString(disposition, "inline"); if (params.Has("filename")) { fileName = params.Get("filename"); _UnQuote(&fileName, '"', '"'); } } else if (HTTPTools::EqualASCIIVString(it->first, "Content-Transfer-Encoding", false)) { XBOX::VString encoding; header.GetHeaderValue(it->first, value); VHTTPHeader::SplitParameters(value, encoding, params); if (!(isBase64 = HTTPTools::EqualASCIIVString(encoding, "base64"))) isQuotedPrintable = HTTPTools::EqualASCIIVString(encoding, "quoted-printable"); } else if (HTTPTools::EqualASCIIVString(it->first, "Content-ID", false)) { header.GetHeaderValue(it->first, value); VHTTPHeader::SplitParameters(value, contentID, params); _UnQuote(&contentID, '<', '>'); } else { // Ignore unknown fields. } } // Get body of part, decode it if need. XBOX::VMemoryBuffer<> decodedData; XBOX::VPtrStream decodedBody; XBOX::VPtrStream *body = message.GetBodyPtr(); if (isBase64) { XBOX::Base64Coder::Decode(body->GetDataPtr(), body->GetDataSize(), decodedData); decodedBody.SetDataPtr(decodedData.GetDataPtr(), decodedData.GetDataSize()); decodedData.ForgetData(); body = &decodedBody; } else if (isQuotedPrintable) { VMIMEReader::DecodeQuotedPrintable (body->GetDataPtr(), body->GetDataSize(), &decodedData); decodedBody.SetDataPtr(decodedData.GetDataPtr(), decodedData.GetDataSize()); decodedData.ForgetData(); body = &decodedBody; } if (fileName.IsEmpty()) _AddTextPart(name, isInline, contentType, contentID, *body); else _AddFilePart(name, fileName, isInline, contentType, contentID, *body); decodedBody.Clear(); } }