int S3fsCurl::HeadRequest()

in src/curl.cpp [2963:3012]


int S3fsCurl::HeadRequest(const char* tpath, headers_t& meta)
{
    int result = -1;

    S3FS_PRN_INFO3("[tpath=%s]", SAFESTRPTR(tpath));

    // At first, try to get without SSE-C headers
    if(!PreHeadRequest(tpath) || !fpLazySetup || !fpLazySetup(this) || 0 != (result = RequestPerform())){
        // If has SSE-C keys, try to get with all SSE-C keys.
        for(size_t pos = 0; pos < S3fsCurl::sseckeys.size(); pos++){
            if(!DestroyCurlHandle()){
                break;
            }
            if(!PreHeadRequest(tpath, NULL, NULL, pos)){
                break;
            }
            if(!fpLazySetup || !fpLazySetup(this)){
                S3FS_PRN_ERR("Failed to lazy setup in single head request.");
                break;
            }
            if(0 == (result = RequestPerform())){
                break;
            }
        }
        if(0 != result){
            DestroyCurlHandle();  // not check result.
            return result;
        }
    }

    // file exists in s3
    // fixme: clean this up.
    meta.clear();
    for(headers_t::iterator iter = responseHeaders.begin(); iter != responseHeaders.end(); ++iter){
        std::string key   = lower(iter->first);
        std::string value = iter->second;
        if(key == "content-type"){
            meta[iter->first] = value;
        }else if(key == "content-length"){
            meta[iter->first] = value;
        }else if(key == "etag"){
            meta[iter->first] = value;
        }else if(key == "last-modified"){
            meta[iter->first] = value;
        }else if(is_prefix(key.c_str(), "x-oss")){
            meta[key] = value;        // key is lower case for "x-oss"
        }
    }
    return 0;
}