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);
}
Example #2
0
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);
}