mirror of
https://github.com/NixOS/nix
synced 2025-06-25 10:41:16 +02:00
fix: allow redirected HTTP uploads
When a PUT is redirected, some of the data can be sent by curl before headers are read. This means the subsequent PUT operation needs to seek back to origin.
(cherry picked from commit 90deb665eb
)
This commit is contained in:
parent
8de4c272dc
commit
f9dd4e5605
1 changed files with 19 additions and 0 deletions
|
@ -309,6 +309,23 @@ struct curlFileTransfer : public FileTransfer
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
size_t seekCallback(curl_off_t offset, int origin)
|
||||||
|
{
|
||||||
|
if (origin == SEEK_SET) {
|
||||||
|
readOffset = offset;
|
||||||
|
} else if (origin == SEEK_CUR) {
|
||||||
|
readOffset += offset;
|
||||||
|
} else if (origin == SEEK_END) {
|
||||||
|
readOffset = request.data->length() + offset;
|
||||||
|
}
|
||||||
|
return CURL_SEEKFUNC_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t seekCallbackWrapper(void *clientp, curl_off_t offset, int origin)
|
||||||
|
{
|
||||||
|
return ((TransferItem *) clientp)->seekCallback(offset, origin);
|
||||||
|
}
|
||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
if (!req) req = curl_easy_init();
|
if (!req) req = curl_easy_init();
|
||||||
|
@ -361,6 +378,8 @@ struct curlFileTransfer : public FileTransfer
|
||||||
curl_easy_setopt(req, CURLOPT_READFUNCTION, readCallbackWrapper);
|
curl_easy_setopt(req, CURLOPT_READFUNCTION, readCallbackWrapper);
|
||||||
curl_easy_setopt(req, CURLOPT_READDATA, this);
|
curl_easy_setopt(req, CURLOPT_READDATA, this);
|
||||||
curl_easy_setopt(req, CURLOPT_INFILESIZE_LARGE, (curl_off_t) request.data->length());
|
curl_easy_setopt(req, CURLOPT_INFILESIZE_LARGE, (curl_off_t) request.data->length());
|
||||||
|
curl_easy_setopt(req, CURLOPT_SEEKFUNCTION, seekCallbackWrapper);
|
||||||
|
curl_easy_setopt(req, CURLOPT_SEEKDATA, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.verifyTLS) {
|
if (request.verifyTLS) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue