LinkHeader::LinkHeader(CharType*& position, CharType* end) : m_crossOrigin(CrossOriginAttributeNotSet) , m_isValid(true) { if (!parseURL(position, end, m_url)) { m_isValid = false; findNextHeader(position, end); return; } while (m_isValid && position < end) { if (!parseParameterDelimiter(position, end, m_isValid)) { findNextHeader(position, end); return; } LinkParameterName parameterName; if (!parseParameterName(position, end, parameterName)) { findNextHeader(position, end); m_isValid = false; return; } String parameterValue; if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) { findNextHeader(position, end); m_isValid = false; return; } setValue(parameterName, parameterValue); } findNextHeader(position, end); }
LinkHeader::LinkHeader(CharacterType*& position, CharacterType* const end) { ASSERT(position <= end); auto urlResult = findURLBoundaries(position, end); if (urlResult == std::nullopt) { m_isValid = false; findNextHeader(position, end); return; } m_url = urlResult.value(); while (m_isValid && position < end) { if (!parseParameterDelimiter(position, end, m_isValid)) { findNextHeader(position, end); return; } LinkParameterName parameterName; if (!parseParameterName(position, end, parameterName)) { findNextHeader(position, end); m_isValid = false; return; } String parameterValue; if (!parseParameterValue(position, end, parameterValue) && !isExtensionParameter(parameterName)) { findNextHeader(position, end); m_isValid = false; return; } setValue(parameterName, parameterValue); } findNextHeader(position, end); }
static bool parseParameterName(CharType*& position, CharType* end, LinkHeader::LinkParameterName& name) { CharType* nameStart = position; skipWhile<CharType, isValidParameterNameChar>(position, end); CharType* nameEnd = position; skipWhile<CharType, isWhitespace>(position, end); bool hasEqual = skipExactly<CharType>(position, end, '='); skipWhile<CharType, isWhitespace>(position, end); name = paramterNameFromString(String(nameStart, nameEnd - nameStart)); if (hasEqual) return true; bool validParameterValueEnd = (position == end) || isValidParameterValueEnd(*position); return validParameterValueEnd && isExtensionParameter(name); }