Changeset 206206 in webkit


Ignore:
Timestamp:
Sep 21, 2016 2:56:16 AM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[Fetch] Align Accept header default values with fetch spec
https://bugs.webkit.org/show_bug.cgi?id=162260

Patch by Youenn Fablet <youenn@apple.com> on 2016-09-21
Reviewed by Sam Weinig.

LayoutTests/imported/w3c:

Ensuring Accept and Accept-Language user-specific values are going up to the server.

  • web-platform-tests/fetch/api/basic/accept-header-expected.txt:
  • web-platform-tests/fetch/api/basic/accept-header-worker-expected.txt:
  • web-platform-tests/fetch/api/basic/accept-header.js:

(promise_test):

Source/WebCore:

Covered by existing and updated tests.

To start implementing step 1 to 7 of fetch algorithm, this patch updates Accept header handling.

Default values are set according the spec based on resource type.
Some resource types are not defined in the spec and we keep using existing values.

We check if Accept header is already present in the request. If that is the case, no change is done to that header.

If the Accept header is not set, the default value '*/*' is used.
An Accept header is therefore always set at CachedResourceLoader level.

  • loader/cache/CachedCSSStyleSheet.cpp:

(WebCore::CachedCSSStyleSheet::CachedCSSStyleSheet): Removing accept initialization.

  • loader/cache/CachedResource.cpp:

(WebCore::CachedResource::load): Removing accept header setting.

  • loader/cache/CachedResource.h:

(WebCore::CachedResource::accept): Deleted.
(WebCore::CachedResource::setAccept): Deleted.

  • loader/cache/CachedResourceLoader.cpp:

(WebCore::acceptHeaderValueFromType): helper routine merging fetch spec and existing WebKit accept values.
(WebCore::CachedResourceLoader::prepareFetch): Should implement step 1 to 7 of https://fetch.spec.whatwg.org/#fetching.
(WebCore::CachedResourceLoader::requestResource): Making use of prepareFetch.

  • loader/cache/CachedResourceLoader.h:
  • loader/cache/CachedSVGDocument.cpp:

(WebCore::CachedSVGDocument::CachedSVGDocument): Removing accept initialization.

  • loader/cache/CachedScript.cpp:

(WebCore::CachedScript::CachedScript): Removing accept initialization.

  • loader/cache/CachedXSLStyleSheet.cpp:

(WebCore::CachedXSLStyleSheet::CachedXSLStyleSheet): Removing accept initialization.

  • platform/network/ResourceRequestBase.cpp:

(WebCore::ResourceRequestBase::hasHTTPHeader): Introduced to check for header presence.

  • platform/network/ResourceRequestBase.h:

LayoutTests:

  • http/tests/misc/resources/image-checks-for-accept.php: Updated according new image Accept header value.
Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r206201 r206206  
     12016-09-21  Youenn Fablet  <youenn@apple.com>
     2
     3        [Fetch] Align Accept header default values with fetch spec
     4        https://bugs.webkit.org/show_bug.cgi?id=162260
     5
     6        Reviewed by Sam Weinig.
     7
     8        * http/tests/misc/resources/image-checks-for-accept.php: Updated according new image Accept header value.
     9
    1102016-09-21  Chris Dumez  <cdumez@apple.com>
    211
  • trunk/LayoutTests/http/tests/misc/resources/image-checks-for-accept.php

    r54892 r206206  
    11<?php
    2     if($_SERVER["HTTP_ACCEPT"] == "*/*" || $_SERVER["HTTP_ACCEPT"] == "image/*" || $_SERVER["HTTP_ACCEPT"] == "image/jpg")
     2    if($_SERVER["HTTP_ACCEPT"] == "image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5")
    33    {
    44        header("Content-Type: image/jpg");
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r206201 r206206  
     12016-09-21  Youenn Fablet  <youenn@apple.com>
     2
     3        [Fetch] Align Accept header default values with fetch spec
     4        https://bugs.webkit.org/show_bug.cgi?id=162260
     5
     6        Reviewed by Sam Weinig.
     7
     8        Ensuring Accept and Accept-Language user-specific values are going up to the server.
     9
     10        * web-platform-tests/fetch/api/basic/accept-header-expected.txt:
     11        * web-platform-tests/fetch/api/basic/accept-header-worker-expected.txt:
     12        * web-platform-tests/fetch/api/basic/accept-header.js:
     13        (promise_test):
     14
    1152016-09-21  Chris Dumez  <cdumez@apple.com>
    216
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/accept-header-expected.txt

    r198665 r206206  
    11
    22PASS Request through fetch should have 'accept' header with value '*/*'
     3PASS Request through fetch should have 'accept' header with value 'custom/*'
     4PASS Request through fetch should have a 'accept-language' header
     5PASS Request through fetch should have 'accept-language' header with value 'bzh'
    36
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/accept-header-worker-expected.txt

    r198891 r206206  
    11
    22PASS Request through fetch should have 'accept' header with value '*/*'
     3PASS Request through fetch should have 'accept' header with value 'custom/*'
     4PASS Request through fetch should have a 'accept-language' header
     5PASS Request through fetch should have 'accept-language' header with value 'bzh'
    36
  • trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/accept-header.js

    r197748 r206206  
    1212}, "Request through fetch should have 'accept' header with value '*/*'");
    1313
     14promise_test(function() {
     15  return fetch(RESOURCES_DIR + "inspect-headers.py?headers=Accept", {"headers": [["Accept", "custom/*"]]}).then(function(response) {
     16    assert_equals(response.status, 200, "HTTP status is 200");
     17    assert_equals(response.type , "basic", "Response's type is basic");
     18    assert_equals(response.headers.get("x-request-accept"), "custom/*", "Request has accept header with value 'custom/*'");
     19  });
     20}, "Request through fetch should have 'accept' header with value 'custom/*'");
     21
     22promise_test(function() {
     23  return fetch(RESOURCES_DIR + "inspect-headers.py?headers=Accept-Language").then(function(response) {
     24    assert_equals(response.status, 200, "HTTP status is 200");
     25    assert_equals(response.type , "basic", "Response's type is basic");
     26    assert_true(response.headers.has("x-request-accept-language"));
     27  });
     28}, "Request through fetch should have a 'accept-language' header");
     29
     30promise_test(function() {
     31  return fetch(RESOURCES_DIR + "inspect-headers.py?headers=Accept-Language", {"headers": [["Accept-Language", "bzh"]]}).then(function(response) {
     32    assert_equals(response.status, 200, "HTTP status is 200");
     33    assert_equals(response.type , "basic", "Response's type is basic");
     34    assert_equals(response.headers.get("x-request-accept-language"), "bzh", "Request has accept header with value 'bzh'");
     35  });
     36}, "Request through fetch should have 'accept-language' header with value 'bzh'");
     37
    1438done();
  • trunk/Source/WebCore/ChangeLog

    r206205 r206206  
     12016-09-21  Youenn Fablet  <youenn@apple.com>
     2
     3        [Fetch] Align Accept header default values with fetch spec
     4        https://bugs.webkit.org/show_bug.cgi?id=162260
     5
     6        Reviewed by Sam Weinig.
     7
     8        Covered by existing and updated tests.
     9
     10        To start implementing step 1 to 7 of fetch algorithm, this patch updates Accept header handling.
     11
     12        Default values are set according the spec based on resource type.
     13        Some resource types are not defined in the spec and we keep using existing values.
     14
     15        We check if Accept header is already present in the request. If that is the case, no change is done to that header.
     16
     17        If the Accept header is not set, the default value '*/*' is used.
     18        An Accept header is therefore always set at CachedResourceLoader level.
     19
     20        * loader/cache/CachedCSSStyleSheet.cpp:
     21        (WebCore::CachedCSSStyleSheet::CachedCSSStyleSheet): Removing accept initialization.
     22        * loader/cache/CachedResource.cpp:
     23        (WebCore::CachedResource::load): Removing accept header setting.
     24        * loader/cache/CachedResource.h:
     25        (WebCore::CachedResource::accept): Deleted.
     26        (WebCore::CachedResource::setAccept): Deleted.
     27        * loader/cache/CachedResourceLoader.cpp:
     28        (WebCore::acceptHeaderValueFromType): helper routine merging fetch spec and existing WebKit accept values.
     29        (WebCore::CachedResourceLoader::prepareFetch): Should implement step 1 to 7 of https://fetch.spec.whatwg.org/#fetching.
     30        (WebCore::CachedResourceLoader::requestResource): Making use of prepareFetch.
     31        * loader/cache/CachedResourceLoader.h:
     32        * loader/cache/CachedSVGDocument.cpp:
     33        (WebCore::CachedSVGDocument::CachedSVGDocument): Removing accept initialization.
     34        * loader/cache/CachedScript.cpp:
     35        (WebCore::CachedScript::CachedScript): Removing accept initialization.
     36        * loader/cache/CachedXSLStyleSheet.cpp:
     37        (WebCore::CachedXSLStyleSheet::CachedXSLStyleSheet): Removing accept initialization.
     38        * platform/network/ResourceRequestBase.cpp:
     39        (WebCore::ResourceRequestBase::hasHTTPHeader): Introduced to check for header presence.
     40        * platform/network/ResourceRequestBase.h:
     41
    1422016-09-21  Jeremy Huddleston Sequoia  <jeremyhu@apple.com>
    243
  • trunk/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp

    r206016 r206206  
    4646    , m_decoder(TextResourceDecoder::create("text/css", request.charset()))
    4747{
    48     // Prefer text/css but accept any type (dell.com serves a stylesheet
    49     // as text/html; see <http://bugs.webkit.org/show_bug.cgi?id=11451>).
    50     setAccept("text/css,*/*;q=0.1");
    5148}
    5249
  • trunk/Source/WebCore/loader/cache/CachedResource.cpp

    r206189 r206206  
    308308#endif
    309309
    310     if (!accept().isEmpty())
    311         m_resourceRequest.setHTTPAccept(accept());
    312 
    313310    if (isCacheValidator()) {
    314311        CachedResource* resourceToRevalidate = m_resourceToRevalidate;
  • trunk/Source/WebCore/loader/cache/CachedResource.h

    r206016 r206206  
    221221    bool isExpired() const;
    222222
    223     // List of acceptable MIME types separated by ",".
    224     // A MIME type may contain a wildcard, e.g. "text/*".
    225     String accept() const { return m_accept; }
    226     void setAccept(const String& accept) { m_accept = accept; }
    227 
    228223    void cancelLoad();
    229224    bool wasCanceled() const { return m_error.isCancellation(); }
     
    320315    HashMap<CachedResourceClient*, std::unique_ptr<Callback>> m_clientsAwaitingCallback;
    321316    SessionID m_sessionID;
    322     String m_accept;
    323317    ResourceLoadPriority m_loadPriority;
    324318    std::chrono::system_clock::time_point m_responseTimestamp;
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp

    r206203 r206206  
    571571}
    572572
     573static inline String acceptHeaderValueFromType(CachedResource::Type type)
     574{
     575    switch (type) {
     576    case CachedResource::Type::MainResource:
     577        return ASCIILiteral("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
     578    case CachedResource::Type::ImageResource:
     579        return ASCIILiteral("image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5");
     580    case CachedResource::Type::CSSStyleSheet:
     581        return ASCIILiteral("text/css,*/*;q=0.1");
     582    case CachedResource::Type::SVGDocumentResource:
     583        return ASCIILiteral("image/svg+xml");
     584#if ENABLE(XSLT)
     585    case CachedResource::Type::XSLStyleSheet:
     586        // FIXME: This should accept more general xml formats */*+xml, image/svg+xml for example.
     587        return ASCIILiteral("text/xml,application/xml,application/xhtml+xml,text/xsl,application/rss+xml,application/atom+xml");
     588#endif
     589    default:
     590        return ASCIILiteral("*/*");
     591    }
     592}
     593
     594void CachedResourceLoader::prepareFetch(CachedResource::Type type, CachedResourceRequest& request)
     595{
     596    // Implementing step 1 to 7 of https://fetch.spec.whatwg.org/#fetching
     597
     598    if (!request.resourceRequest().hasHTTPHeader(HTTPHeaderName::Accept))
     599        request.mutableResourceRequest().setHTTPHeaderField(HTTPHeaderName::Accept, acceptHeaderValueFromType(type));
     600
     601    // Accept-Language value is handled in underlying port-specific code.
     602    // FIXME: Decide whether to support client hints
     603}
     604
    573605CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(CachedResource::Type type, CachedResourceRequest&& request)
    574606{
     
    587619        return nullptr;
    588620    }
     621
     622    prepareFetch(type, request);
    589623
    590624    if (!canRequest(type, url, request.options(), request.forPreload())) {
  • trunk/Source/WebCore/loader/cache/CachedResourceLoader.h

    r206203 r206206  
    152152
    153153    CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, CachedResourceRequest&&);
     154    void prepareFetch(CachedResource::Type, CachedResourceRequest&);
    154155    CachedResourceHandle<CachedResource> revalidateResource(CachedResourceRequest&&, CachedResource&);
    155156    CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, CachedResourceRequest&&);
  • trunk/Source/WebCore/loader/cache/CachedSVGDocument.cpp

    r206016 r206206  
    3232    , m_decoder(TextResourceDecoder::create("application/xml"))
    3333{
    34     setAccept("image/svg+xml");
    3534}
    3635
  • trunk/Source/WebCore/loader/cache/CachedScript.cpp

    r206016 r206206  
    4545    , m_decoder(TextResourceDecoder::create(ASCIILiteral("application/javascript"), request.charset()))
    4646{
    47     // It's javascript we want.
    48     // But some websites think their scripts are <some wrong mimetype here>
    49     // and refuse to serve them if we only accept application/x-javascript.
    50     setAccept("*/*");
    5147}
    5248
  • trunk/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp

    r206016 r206206  
    4141    , m_decoder(TextResourceDecoder::create("text/xsl"))
    4242{
    43     // It's XML we want.
    44     // FIXME: This should accept more general xml formats */*+xml, image/svg+xml for example.
    45     setAccept("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml");
    4643}
    4744
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.cpp

    r206009 r206206  
    334334}
    335335
     336bool ResourceRequestBase::hasHTTPHeader(HTTPHeaderName name) const
     337{
     338    return m_httpHeaderFields.contains(name);
     339}
     340
    336341String ResourceRequestBase::httpUserAgent() const
    337342{
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.h

    r206009 r206206  
    9898    void clearHTTPContentType();
    9999
     100    bool hasHTTPHeader(HTTPHeaderName) const;
     101
    100102    WEBCORE_EXPORT String httpReferrer() const;
    101103    bool hasHTTPReferrer() const;
Note: See TracChangeset for help on using the changeset viewer.