aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libstore/filetransfer.cc19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc
index 601cb858a..c954ace7f 100644
--- a/src/libstore/filetransfer.cc
+++ b/src/libstore/filetransfer.cc
@@ -72,6 +72,17 @@ struct curlFileTransfer : public FileTransfer
curl_off_t writtenToSink = 0;
+ /* Get the HTTP status code, or 0 for other protocols. */
+ long getHTTPStatus()
+ {
+ long httpStatus = 0;
+ long protocol = 0;
+ curl_easy_getinfo(req, CURLINFO_PROTOCOL, &protocol);
+ if (protocol == CURLPROTO_HTTP || protocol == CURLPROTO_HTTPS)
+ curl_easy_getinfo(req, CURLINFO_RESPONSE_CODE, &httpStatus);
+ return httpStatus;
+ }
+
TransferItem(curlFileTransfer & fileTransfer,
const FileTransferRequest & request,
Callback<FileTransferResult> && callback)
@@ -83,8 +94,7 @@ struct curlFileTransfer : public FileTransfer
, callback(std::move(callback))
, finalSink([this](const unsigned char * data, size_t len) {
if (this->request.dataCallback) {
- long httpStatus = 0;
- curl_easy_getinfo(req, CURLINFO_RESPONSE_CODE, &httpStatus);
+ auto httpStatus = getHTTPStatus();
/* Only write data to the sink if this is a
successful response. */
@@ -316,8 +326,7 @@ struct curlFileTransfer : public FileTransfer
void finish(CURLcode code)
{
- long httpStatus = 0;
- curl_easy_getinfo(req, CURLINFO_RESPONSE_CODE, &httpStatus);
+ auto httpStatus = getHTTPStatus();
char * effectiveUriCStr;
curl_easy_getinfo(req, CURLINFO_EFFECTIVE_URL, &effectiveUriCStr);
@@ -344,7 +353,7 @@ struct curlFileTransfer : public FileTransfer
failEx(writeException);
else if (code == CURLE_OK &&
- (httpStatus == 200 || httpStatus == 201 || httpStatus == 204 || httpStatus == 206 || httpStatus == 304 || httpStatus == 226 /* FTP */ || httpStatus == 0 /* other protocol */))
+ (httpStatus == 200 || httpStatus == 201 || httpStatus == 204 || httpStatus == 206 || httpStatus == 304 || httpStatus == 0 /* other protocol */))
{
result.cached = httpStatus == 304;
act.progress(result.bodySize, result.bodySize);