void ResourceResponse::updateFromSoupMessage(SoupMessage* soupMessage)
{
    SoupURI* soupURI = soup_message_get_uri(soupMessage);
    GOwnPtr<gchar> uri(soup_uri_to_string(soupURI, FALSE));
    m_url = KURL(KURL(), String::fromUTF8(uri.get()));

    m_httpStatusCode = soupMessage->status_code;

    SoupMessageHeadersIter headersIter;
    const char* headerName;
    const char* headerValue;

    soup_message_headers_iter_init(&headersIter, soupMessage->response_headers);
    while (soup_message_headers_iter_next(&headersIter, &headerName, &headerValue))
        m_httpHeaderFields.set(String::fromUTF8(headerName), String::fromUTF8(headerValue));

    m_soupFlags = soup_message_get_flags(soupMessage);

    String contentType = soup_message_headers_get_one(soupMessage->response_headers, "Content-Type");
    setMimeType(extractMIMETypeFromMediaType(contentType));

    setTextEncodingName(extractCharsetFromMediaType(contentType));
    setExpectedContentLength(soup_message_headers_get_content_length(soupMessage->response_headers));
    setHTTPStatusText(soupMessage->reason_phrase);
    setSuggestedFilename(filenameFromHTTPContentDisposition(httpHeaderField("Content-Disposition")));
}
const CacheControlDirectiveMap& ResourceResponseBase::parseCacheControlDirectives() const
{
    lazyInit();

    if (m_haveParsedCacheControlHeader)
        return m_cacheControlDirectiveMap;

    m_cacheControlDirectiveMap.clear();
    m_haveParsedCacheControlHeader = true;

    const String cacheControlHeader = httpHeaderField("Cache-Control");
    if (cacheControlHeader.isEmpty())
        return m_cacheControlDirectiveMap;

    Vector<pair<String, String> > directives;
    parseCacheHeader(cacheControlHeader, directives);

    unsigned iMax = directives.size();
    for (unsigned i = 0; i < iMax; ++i) {
        Vector<String> directiveValues;
        if ((equalIgnoringCase(directives[i].first, "private") || equalIgnoringCase(directives[i].first, "no-cache")) && !directives[i].second.isEmpty())
            parseCacheControlDirectiveValues(directives[i].second, directiveValues);
        else
            directiveValues.append(directives[i].second);

        if (m_cacheControlDirectiveMap.contains(directives[i].first)) {
            CacheControlDirectiveMap::iterator entry = m_cacheControlDirectiveMap.find(directives[i].first);
            unsigned jMax = directiveValues.size();
            for (unsigned j = 0; j < jMax; ++j)
                entry->second.add(directiveValues[j]);
        } else {
            HashSet<String> values;
            unsigned jMax = directiveValues.size();
            for (unsigned j = 0; j < jMax; ++j)
                values.add(directiveValues[j]);
            m_cacheControlDirectiveMap.set(directives[i].first, values);
        }
    }

    return m_cacheControlDirectiveMap;
}
const PragmaDirectiveMap& ResourceResponseBase::parsePragmaDirectives() const
{
    lazyInit();

    if (m_haveParsedPragmaHeader)
        return m_pragmaDirectiveMap;

    m_pragmaDirectiveMap.clear();
    m_haveParsedPragmaHeader = true;

    const String pragmaHeader = httpHeaderField("Pragma");
    if (pragmaHeader.isEmpty())
        return m_pragmaDirectiveMap;

    Vector<pair<String, String> > directives;
    parseCacheHeader(pragmaHeader, directives);

    unsigned max = directives.size();
    for (unsigned i = 0; i < max; ++i)
        m_pragmaDirectiveMap.set(directives[i].first, directives[i].second);

    return m_pragmaDirectiveMap;
}
예제 #4
0
void ResourceResponse::updateFromSoupMessageHeaders(const SoupMessageHeaders* messageHeaders)
{
    SoupMessageHeaders* headers = const_cast<SoupMessageHeaders*>(messageHeaders);
    SoupMessageHeadersIter headersIter;
    const char* headerName;
    const char* headerValue;

    // updateFromSoupMessage could be called several times for the same ResourceResponse object,
    // thus, we need to clear old header values and update m_httpHeaderFields from soupMessage headers.
    m_httpHeaderFields.clear();

    soup_message_headers_iter_init(&headersIter, headers);
    while (soup_message_headers_iter_next(&headersIter, &headerName, &headerValue)) {
        String headerNameString = String::fromUTF8WithLatin1Fallback(headerName, strlen(headerName));
        HTTPHeaderMap::const_iterator it = m_httpHeaderFields.find(headerNameString);
        if (it == m_httpHeaderFields.end() || (it != m_httpHeaderFields.end() && it->value.isEmpty()))
            m_httpHeaderFields.set(headerNameString, String::fromUTF8WithLatin1Fallback(headerValue, strlen(headerValue)));
        else {
            StringBuilder builder;
            builder.append(it->value);
            builder.appendLiteral(", ");
            builder.append(String::fromUTF8WithLatin1Fallback(headerValue, strlen(headerValue)));
            m_httpHeaderFields.set(headerNameString, builder.toString());
        }
    }

    String contentType;
    const char* officialType = soup_message_headers_get_one(headers, "Content-Type");
    if (!m_sniffedContentType.isEmpty() && m_sniffedContentType != officialType)
        contentType = m_sniffedContentType;
    else
        contentType = officialType;
    setMimeType(extractMIMETypeFromMediaType(contentType));
    setTextEncodingName(extractCharsetFromMediaType(contentType));

    setExpectedContentLength(soup_message_headers_get_content_length(headers));
    setSuggestedFilename(filenameFromHTTPContentDisposition(httpHeaderField("Content-Disposition")));}
예제 #5
0
String ResourceRequestBase::httpAccept() const
{
    return httpHeaderField(HTTPHeaderName::Accept);
}
예제 #6
0
String ResourceRequestBase::httpUserAgent() const
{
    return httpHeaderField(HTTPHeaderName::UserAgent);
}
예제 #7
0
String ResourceRequestBase::httpOrigin() const
{
    return httpHeaderField(HTTPHeaderName::Origin);
}
예제 #8
0
String ResourceRequestBase::httpReferrer() const
{
    return httpHeaderField(HTTPHeaderName::Referer);
}
예제 #9
0
String ResourceRequestBase::httpContentType() const
{
    return httpHeaderField(HTTPHeaderName::ContentType);
}
예제 #10
0
String ResourceRequestBase::httpAccept() const
{
    return httpHeaderField("Accept");
}
예제 #11
0
String ResourceRequestBase::httpUserAgent() const
{
    return httpHeaderField("User-Agent");
}
예제 #12
0
String ResourceRequestBase::httpOrigin() const
{
    return httpHeaderField("Origin");
}
예제 #13
0
String ResourceRequestBase::httpReferrer() const
{
    return httpHeaderField("Referer");
}
예제 #14
0
String ResourceRequestBase::httpContentType() const
{
    return httpHeaderField("Content-Type");
}