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;
}