Changeset 229138 in webkit


Ignore:
Timestamp:
Mar 1, 2018, 12:39:00 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

[Curl] Split DNS cache expiration and connection timeout setting.
https://bugs.webkit.org/show_bug.cgi?id=182979

It was mis-implemented and was named ambiguous name 'enableTimeout'.
Implement each feature correctly.

Patch by Basuke Suzuki <Basuke Suzuki> on 2018-03-01
Reviewed by Per Arne Vollan.

  • platform/network/curl/CurlContext.cpp:

(WebCore::EnvironmentVariableReader::read):
(WebCore::EnvironmentVariableReader::defined):
(WebCore::EnvironmentVariableReader::readAs):
(WebCore::EnvironmentVariableReader::sscanTemplate):
(WebCore::EnvironmentVariableReader::sscanTemplate<unsigned>):
(WebCore::CurlContext::CurlContext):
(WebCore::safeTimeValue):
(WebCore::CurlHandle::setDnsCacheTimeout):
(WebCore::CurlHandle::setConnectTimeout):
(WebCore::CurlHandle::setTimeout):
(WebCore::CurlHandle::enableTimeout): Deleted.

  • platform/network/curl/CurlContext.h:

(WebCore::CurlContext::dnsCacheTimeout const):
(WebCore::CurlContext::connectTimeout const):

  • platform/network/curl/CurlRequest.cpp:

(WebCore::CurlRequest::setupTransfer):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r229137 r229138  
     12018-03-01  Basuke Suzuki  <Basuke.Suzuki@sony.com>
     2
     3        [Curl] Split DNS cache expiration and connection timeout setting.
     4        https://bugs.webkit.org/show_bug.cgi?id=182979
     5
     6        It was mis-implemented and was named ambiguous name 'enableTimeout'.
     7        Implement each feature correctly.
     8
     9        Reviewed by Per Arne Vollan.
     10
     11        * platform/network/curl/CurlContext.cpp:
     12        (WebCore::EnvironmentVariableReader::read):
     13        (WebCore::EnvironmentVariableReader::defined):
     14        (WebCore::EnvironmentVariableReader::readAs):
     15        (WebCore::EnvironmentVariableReader::sscanTemplate):
     16        (WebCore::EnvironmentVariableReader::sscanTemplate<unsigned>):
     17        (WebCore::CurlContext::CurlContext):
     18        (WebCore::safeTimeValue):
     19        (WebCore::CurlHandle::setDnsCacheTimeout):
     20        (WebCore::CurlHandle::setConnectTimeout):
     21        (WebCore::CurlHandle::setTimeout):
     22        (WebCore::CurlHandle::enableTimeout): Deleted.
     23        * platform/network/curl/CurlContext.h:
     24        (WebCore::CurlContext::dnsCacheTimeout const):
     25        (WebCore::CurlContext::connectTimeout const):
     26        * platform/network/curl/CurlRequest.cpp:
     27        (WebCore::CurlRequest::setupTransfer):
     28
    1292018-03-01  Zalan Bujtas  <zalan@apple.com>
    230
  • trunk/Source/WebCore/platform/network/curl/CurlContext.cpp

    r227987 r229138  
    4343namespace WebCore {
    4444
     45class EnvironmentVariableReader {
     46public:
     47    const char* read(const char* name) { return ::getenv(name); }
     48    bool defined(const char* name) { return read(name) != nullptr; }
     49
     50    template<typename T> std::optional<T> readAs(const char* name)
     51    {
     52        if (const char* valueStr = read(name)) {
     53            T value;
     54            if (sscanf(valueStr, sscanTemplate<T>(), &value) == 1)
     55                return value;
     56        }
     57
     58        return std::nullopt;
     59    }
     60
     61private:
     62    template<typename T> const char* sscanTemplate()
     63    {
     64        ASSERT_NOT_REACHED();
     65        return nullptr;
     66    }
     67
     68    // define specialized member function for specific type.
     69    template<> constexpr const char* sscanTemplate<unsigned>() { return "%u"; }
     70};
     71
    4572// CurlContext -------------------------------------------------------------------
    4673
     
    5582    initShareHandle();
    5683
     84    EnvironmentVariableReader envVar;
     85
     86    if (auto value = envVar.readAs<unsigned>("WEBKIT_CURL_DNS_CACHE_TIMEOUT"))
     87        m_dnsCacheTimeout = Seconds(*value);
     88
     89    if (auto value = envVar.readAs<unsigned>("WEBKIT_CURL_CONNECT_TIMEOUT"))
     90        m_connectTimeout = Seconds(*value);
     91
    5792#ifndef NDEBUG
    58     m_verbose = getenv("DEBUG_CURL");
    59 
    60     char* logFile = getenv("CURL_LOG_FILE");
     93    m_verbose = envVar.defined("DEBUG_CURL");
     94
     95    auto logFile = envVar.read("CURL_LOG_FILE");
    6196    if (logFile)
    6297        m_logFile = fopen(logFile, "a");
     
    448483}
    449484
    450 void CurlHandle::enableTimeout()
    451 {
    452     static const long dnsCacheTimeout = 5 * 60; // [sec.]
    453 
    454     curl_easy_setopt(m_handle, CURLOPT_DNS_CACHE_TIMEOUT, dnsCacheTimeout);
    455 }
    456 
    457 void CurlHandle::setTimeout(long timeoutMilliseconds)
    458 {
    459     curl_easy_setopt(m_handle, CURLOPT_TIMEOUT_MS, timeoutMilliseconds);
     485static CURLoption safeTimeValue(double time)
     486{
     487    auto value = static_cast<unsigned>(time >= 0.0 ? time : 0);
     488    return static_cast<CURLoption>(value);
     489}
     490
     491void CurlHandle::setDnsCacheTimeout(Seconds timeout)
     492{
     493    curl_easy_setopt(m_handle, CURLOPT_DNS_CACHE_TIMEOUT, safeTimeValue(timeout.seconds()));
     494}
     495
     496void CurlHandle::setConnectTimeout(Seconds timeout)
     497{
     498    curl_easy_setopt(m_handle, CURLOPT_CONNECTTIMEOUT, safeTimeValue(timeout.seconds()));
     499}
     500
     501void CurlHandle::setTimeout(Seconds timeout)
     502{
     503    curl_easy_setopt(m_handle, CURLOPT_TIMEOUT_MS, safeTimeValue(timeout.milliseconds()));
    460504}
    461505
  • trunk/Source/WebCore/platform/network/curl/CurlContext.h

    r229132 r229138  
    3333#include <wtf/NeverDestroyed.h>
    3434#include <wtf/Noncopyable.h>
     35#include <wtf/Seconds.h>
    3536#include <wtf/Threading.h>
    3637
     
    121122    bool isHttp2Enabled() const;
    122123
     124    // Timeout
     125    Seconds dnsCacheTimeout() const { return m_dnsCacheTimeout; }
     126    Seconds connectTimeout() const { return m_connectTimeout; }
     127
    123128#ifndef NDEBUG
    124129    FILE* getLogFile() const { return m_logFile; }
     
    127132
    128133private:
     134    CurlContext();
     135    void initShareHandle();
     136
    129137    ProxyInfo m_proxy;
    130138    CurlShareHandle m_shareHandle;
    131139    CurlSSLHandle m_sslHandle;
    132140
    133     CurlContext();
    134     void initShareHandle();
     141    Seconds m_dnsCacheTimeout { Seconds::fromMinutes(5) };
     142    Seconds m_connectTimeout { 30.0 };
    135143
    136144#ifndef NDEBUG
     
    251259    void enableProxyIfExists();
    252260
    253     void enableTimeout();
    254     void setTimeout(long timeoutMilliseconds);
     261    void setDnsCacheTimeout(Seconds);
     262    void setConnectTimeout(Seconds);
     263    void setTimeout(Seconds);
    255264
    256265    // Callback function
  • trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp

    r228577 r229138  
    195195    m_curlHandle->enableAllowedProtocols();
    196196    m_curlHandle->enableAcceptEncoding();
    197     m_curlHandle->enableTimeout();
    198 
    199     long timeoutMilliseconds = (m_request.timeoutInterval() > 0.0) ? static_cast<long>(m_request.timeoutInterval() * 1000.0) : 0;
    200     m_curlHandle->setTimeout(timeoutMilliseconds);
     197
     198    m_curlHandle->setTimeout(Seconds(m_request.timeoutInterval()));
     199    m_curlHandle->setDnsCacheTimeout(CurlContext::singleton().dnsCacheTimeout());
     200    m_curlHandle->setConnectTimeout(CurlContext::singleton().connectTimeout());
    201201
    202202    m_curlHandle->enableProxyIfExists();
Note: See TracChangeset for help on using the changeset viewer.