bool S3fsCurl::RemakeHandle()

in src/curl.cpp [2005:2330]


bool S3fsCurl::RemakeHandle()
{
    S3FS_PRN_INFO3("Retry request. [type=%d][url=%s][path=%s]", type, url.c_str(), path.c_str());

    if(REQTYPE_UNSET == type){
        return false;
    }

    // rewind file
    struct stat st;
    if(b_infile){
        rewind(b_infile);
        if(-1 == fstat(fileno(b_infile), &st)){
            S3FS_PRN_WARN("Could not get file stat(fd=%d)", fileno(b_infile));
            return false;
        }
    }

    // reinitialize internal data
    requestHeaders = curl_slist_remove(requestHeaders, "Authorization");
    responseHeaders.clear();
    bodydata.clear();
    headdata.clear();
    LastResponseCode   = S3FSCURL_RESPONSECODE_NOTSET;

    // count up(only use for multipart)
    retry_count++;

    // set from backup
    postdata           = b_postdata;
    postdata_remaining = b_postdata_remaining;
    partdata.startpos  = b_partdata_startpos;
    partdata.size      = b_partdata_size;
    partdata.streambuffer = b_partdata_streambuff;
    partdata.streampos    = b_partdata_streampos;
    // reset handle
    ResetHandle();

    // set options
    switch(type){
        case REQTYPE_DELETE:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_CUSTOMREQUEST, "DELETE")){
                return false;
            }
            break;

        case REQTYPE_HEAD:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_NOBODY, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_FILETIME, true)){
                return false;
            }
            // responseHeaders
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERDATA, (void*)&responseHeaders)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERFUNCTION, HeaderCallback)){
                return false;
            }
            break;

        case REQTYPE_PUTHEAD:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_UPLOAD, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILESIZE, 0)){
                return false;
            }
            break;

        case REQTYPE_PUT:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_UPLOAD, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(b_infile){
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(st.st_size))){
                    return false;
                }
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILE, b_infile)){
                    return false;
                }
            }else{
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILESIZE, 0)){
                    return false;
                }
            }
            break;

        case REQTYPE_GET:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, S3fsCurl::DownloadWriteCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)this)){
                return false;
            }
            break;

        case REQTYPE_CHKBUCKET:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            break;

        case REQTYPE_LISTBUCKET:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            break;

        case REQTYPE_PREMULTIPOST:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POST, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POSTFIELDSIZE, 0)){
                return false;
            }
            break;

        case REQTYPE_COMPLETEMULTIPOST:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POST, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POSTFIELDSIZE, static_cast<curl_off_t>(postdata_remaining))){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READDATA, (void*)this)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READFUNCTION, S3fsCurl::ReadCallback)){
                return false;
            }
            break;

        case REQTYPE_UPLOADMULTIPOST:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_UPLOAD, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERDATA, (void*)&responseHeaders)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERFUNCTION, HeaderCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(partdata.size))){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READFUNCTION, S3fsCurl::UploadReadCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READDATA, (void*)this)){
                return false;
            }
            break;

        case REQTYPE_COPYMULTIPOST:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_UPLOAD, true)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERDATA, (void*)&headdata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_HEADERFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_INFILESIZE, 0)){
                return false;
            }
            break;

        case REQTYPE_MULTILIST:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            break;

        case REQTYPE_IAMCRED:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            if(S3fsCurl::ps3fscred->IsIBMIAMAuth()){
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POST, true)){
                    return false;
                }
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_POSTFIELDSIZE, static_cast<curl_off_t>(postdata_remaining))){
                    return false;
                }
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READDATA, (void*)this)){
                    return false;
                }
                if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_READFUNCTION, S3fsCurl::ReadCallback)){
                    return false;
                }
            }
            break;

        case REQTYPE_ABORTMULTIUPLOAD:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_CUSTOMREQUEST, "DELETE")){
                return false;
            }
            break;

        case REQTYPE_IAMROLE:
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)&bodydata)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback)){
                return false;
            }
            break;
        
        case REQTYPE_GET_STREAM:
            if (CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_URL, url.c_str())){
                return false;
            }
            if (CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, S3fsCurl::DownloadWriteStreamCallback)){
                return false;
            }
            if(CURLE_OK != curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void*)this)){
                return false;
            }
            break;
        
        default:
            S3FS_PRN_ERR("request type is unknown(%d)", type);
            return false;
    }
    if(!S3fsCurl::AddUserAgent(hCurl)){                            // put User-Agent
        return false;
    }

    return true;
}