int refresh_stat()

in fs/httpfs/httpfs.cpp [136:178]


    int refresh_stat() {
        Timeout tmo(conn_timeout);
        int ret = 0;
    again:
        auto curl = acuqire_curl();
        DEFER(release_curl(curl));
        net::HeaderMap headers;
        curl->set_header_container(&headers);
        curl->set_range(0, 0);
        net::DummyReaderWriter dummy;
        ret = curl->GET(get_url().c_str(), &dummy, tmo.timeout());
        if (ret < 200) {
            if (photon::now >= tmo.expiration()) {
                // set errno to ENOENT since stat should not ETIMEDOUT
                LOG_ERROR_RETURN(ENOENT, -1, "Failed to update file stat");
            }
            goto again;
        }
        stat_gettime = photon::now;
        authorized = (ret >= 0 && ret != 401 && ret != 403);
        exists = (ret == 200 || ret == 206);
        memset(&m_stat, 0, sizeof(m_stat));
        char buffer[256];
        uint64_t len = -1;
        if (headers.try_get("content-range", buffer) < 0) {
            if (headers.try_get("content-length", len) < 0) {
                LOG_ERROR("Unexpected http response header");
                stat_gettime = 0;
                exists = false;
            }
        } else {
            auto lenstr = strrchr(buffer, '/');
            if (lenstr == nullptr) {
                LOG_ERROR("Unexpected http response header");
                stat_gettime = 0;
                exists = false;
            }
            len = atoll(lenstr + 1);
        }
        m_stat.st_mode = S_IFREG;
        m_stat.st_size = len;
        return 0;
    }