@@ -295,20 +295,17 @@ struct curlFileTransfer : public FileTransfer
295295 return 0 ;
296296 }
297297
298- size_t readOffset = 0 ;
299-
300- size_t readCallback (char * buffer, size_t size, size_t nitems)
301- {
302- if (readOffset == request.data ->length ())
303- return 0 ;
304- auto count = std::min (size * nitems, request.data ->length () - readOffset);
305- assert (count);
306- memcpy (buffer, request.data ->data () + readOffset, count);
307- readOffset += count;
308- return count;
298+ size_t readCallback (char * buffer, size_t size, size_t nitems) noexcept
299+ try {
300+ auto data = request.data ;
301+ return data->source ->read (buffer, nitems * size);
302+ } catch (EndOfFile &) {
303+ return 0 ;
304+ } catch (...) {
305+ return CURL_READFUNC_ABORT;
309306 }
310307
311- static size_t readCallbackWrapper (char * buffer, size_t size, size_t nitems, void * userp)
308+ static size_t readCallbackWrapper (char * buffer, size_t size, size_t nitems, void * userp) noexcept
312309 {
313310 return ((TransferItem *) userp)->readCallback (buffer, size, nitems);
314311 }
@@ -322,19 +319,24 @@ struct curlFileTransfer : public FileTransfer
322319 }
323320#endif
324321
325- size_t seekCallback (curl_off_t offset, int origin)
326- {
322+ size_t seekCallback (curl_off_t offset, int origin) noexcept
323+ try {
324+ auto source = request.data ->source ;
327325 if (origin == SEEK_SET) {
328- readOffset = offset;
326+ source->restart ();
327+ source->skip (offset);
329328 } else if (origin == SEEK_CUR) {
330- readOffset += offset;
329+ source-> skip ( offset) ;
331330 } else if (origin == SEEK_END) {
332- readOffset = request.data ->length () + offset;
331+ NullSink sink{};
332+ source->drainInto (sink);
333333 }
334334 return CURL_SEEKFUNC_OK;
335+ } catch (...) {
336+ return CURL_SEEKFUNC_FAIL;
335337 }
336338
337- static size_t seekCallbackWrapper (void * clientp, curl_off_t offset, int origin)
339+ static size_t seekCallbackWrapper (void * clientp, curl_off_t offset, int origin) noexcept
338340 {
339341 return ((TransferItem *) clientp)->seekCallback (offset, origin);
340342 }
@@ -393,10 +395,10 @@ struct curlFileTransfer : public FileTransfer
393395 if (request.data ) {
394396 if (request.method == HttpMethod::POST) {
395397 curl_easy_setopt (req, CURLOPT_POST, 1L );
396- curl_easy_setopt (req, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t ) request.data ->length () );
398+ curl_easy_setopt (req, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t ) request.data ->sizeHint );
397399 } else {
398400 curl_easy_setopt (req, CURLOPT_UPLOAD, 1L );
399- curl_easy_setopt (req, CURLOPT_INFILESIZE_LARGE, (curl_off_t ) request.data ->length () );
401+ curl_easy_setopt (req, CURLOPT_INFILESIZE_LARGE, (curl_off_t ) request.data ->sizeHint );
400402 }
401403 curl_easy_setopt (req, CURLOPT_READFUNCTION, readCallbackWrapper);
402404 curl_easy_setopt (req, CURLOPT_READDATA, this );
0 commit comments