@@ -130,7 +130,7 @@ std::string Utf8ToSystemLocale(const std::string& str)
130
130
#endif
131
131
132
132
FILE* Fopen (const char * filename, const char * mode) {
133
- #ifdef _WIN32
133
+ #ifdef _MSC_VER
134
134
return _wfopen (Utf8ToWide (filename).c_str (), Utf8ToWide (mode).c_str ());
135
135
#else
136
136
return fopen (filename, mode);
@@ -287,15 +287,15 @@ size_t NetworkClient::private_static_writer(char* data, size_t size, size_t nmem
287
287
return 0 ;
288
288
}
289
289
290
- void NetworkClient::setProxy (const NString & host, int port, int type) {
290
+ NetworkClient& NetworkClient::setProxy (const std::string & host, int port, int type) {
291
291
curl_easy_setopt (curlHandle_, CURLOPT_PROXY, host.c_str ());
292
292
curl_easy_setopt (curlHandle_, CURLOPT_PROXYPORT, static_cast <long >(port));
293
293
curl_easy_setopt (curlHandle_, CURLOPT_PROXYTYPE, static_cast <long >(type));
294
294
curl_easy_setopt (curlHandle_, CURLOPT_NOPROXY, " " );
295
- // curl_easy_setopt(curlHandle_, CURLOPT_NOPROXY, "localhost,127.0.0.1"); // test
295
+ return * this ;
296
296
}
297
297
298
- void NetworkClient::setProxyUserPassword (const NString & username, const NString & password) {
298
+ NetworkClient& NetworkClient::setProxyUserPassword (const std::string & username, const std::string & password) {
299
299
if (username.empty () && password.empty ()) {
300
300
curl_easy_setopt (curlHandle_, CURLOPT_PROXYUSERPWD, nullptr );
301
301
curl_easy_setopt (curlHandle_, CURLOPT_PROXYAUTH, nullptr );
@@ -305,6 +305,7 @@ void NetworkClient::setProxyUserPassword(const NString& username, const NString&
305
305
curl_easy_setopt (curlHandle_, CURLOPT_PROXYUSERPWD, authStr.c_str ());
306
306
curl_easy_setopt (curlHandle_, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
307
307
}
308
+ return *this ;
308
309
}
309
310
310
311
size_t NetworkClient::private_writer (char * data, size_t size, size_t nmemb) {
@@ -338,32 +339,36 @@ size_t NetworkClient::private_progress_func(void* clientp, double dltotal, doubl
338
339
return 0 ;
339
340
}
340
341
341
- void NetworkClient::setMethod (const NString & str) {
342
+ NetworkClient& NetworkClient::setMethod (const std::string & str) {
342
343
method_ = str;
344
+ return *this ;
343
345
}
344
346
345
- void NetworkClient::addQueryParam (const NString & name, const NString & value) {
347
+ NetworkClient& NetworkClient::addQueryParam (const std::string & name, const std::string & value) {
346
348
QueryParam newParam;
347
349
newParam.name = name;
348
350
newParam.value = value;
349
351
newParam.isFile = false ;
350
352
queryParams_.push_back (newParam);
353
+ return *this ;
351
354
}
352
355
353
- void NetworkClient::addQueryParamFile (const NString & name, const NString & fileName, const NString & displayName,
354
- const NString & contentType) {
356
+ NetworkClient& NetworkClient::addQueryParamFile (const std::string & name, const std::string & fileName, const std::string & displayName,
357
+ const std::string & contentType) {
355
358
QueryParam newParam;
356
359
newParam.name = name;
357
360
newParam.value = fileName;
358
361
newParam.isFile = true ;
359
362
newParam.contentType = contentType;
360
363
newParam.displayName = displayName;
361
364
queryParams_.push_back (newParam);
365
+ return *this ;
362
366
}
363
367
364
- void NetworkClient::setUrl (const NString & url) {
368
+ NetworkClient& NetworkClient::setUrl (const std::string & url) {
365
369
url_ = url;
366
370
curl_easy_setopt (curlHandle_, CURLOPT_URL, url.c_str ());
371
+ return *this ;
367
372
}
368
373
369
374
bool NetworkClient::doUploadMultipartData () {
@@ -438,8 +443,9 @@ int NetworkClient::responseCode() const {
438
443
return result;
439
444
}
440
445
441
- void NetworkClient::addQueryHeader (const NString & name, const NString & value) {
446
+ NetworkClient& NetworkClient::addQueryHeader (const std::string & name, const std::string & value) {
442
447
queryHeaders_.emplace_back (name, value);
448
+ return *this ;
443
449
}
444
450
445
451
bool NetworkClient::doGet (const std::string& url) {
@@ -455,7 +461,7 @@ bool NetworkClient::doGet(const std::string& url) {
455
461
456
462
}
457
463
458
- bool NetworkClient::doPost (const NString & data) {
464
+ bool NetworkClient::doPost (const std::string & data) {
459
465
private_init_transfer ();
460
466
if (!private_apply_method ())
461
467
curl_easy_setopt (curlHandle_, CURLOPT_POST, 1L );
@@ -467,30 +473,34 @@ bool NetworkClient::doPost(const NString& data) {
467
473
}
468
474
}
469
475
470
- if (data.empty ()) {
476
+ if (data.empty ()) {
471
477
curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDS, postData.c_str ());
472
- } else {
473
- curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDS, data.c_str ());
478
+ curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDSIZE, static_cast <long >(postData.length ()));
479
+ }
480
+ else {
481
+ curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDS, (const char *)data.data ());
482
+ curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDSIZE, (long )data.length ());
474
483
}
475
484
476
485
currentActionType_ = atPost;
477
486
curlResult_ = curl_easy_perform (curlHandle_);
478
487
return private_on_finish_request ();
479
488
}
480
489
481
- NString NetworkClient::urlEncode (const NString & str) {
490
+ std::string NetworkClient::urlEncode (const std::string & str) {
482
491
char * encoded = curl_easy_escape (curlHandle_, str.c_str (), str.length ());
483
492
std::string res = encoded;
484
493
curl_free (encoded);
485
494
return res;
486
495
}
487
496
488
- NString NetworkClient::errorString () const {
497
+ std::string NetworkClient::errorString () const {
489
498
return errorBuffer_;
490
499
}
491
500
492
- void NetworkClient::setUserAgent (const NString & userAgentStr) {
501
+ NetworkClient& NetworkClient::setUserAgent (const std::string & userAgentStr) {
493
502
userAgent_ = userAgentStr;
503
+ return *this ;
494
504
}
495
505
496
506
void NetworkClient::private_init_transfer () {
@@ -510,13 +520,14 @@ void NetworkClient::private_init_transfer() {
510
520
curl_easy_setopt (curlHandle_, CURLOPT_HTTPHEADER, chunk_);
511
521
}
512
522
513
- NString NetworkClient::responseHeaderText () const {
523
+ std::string NetworkClient::responseHeaderText () const {
514
524
return headerBuffer_;
515
525
}
516
526
517
- void NetworkClient::setProgressCallback (curl_progress_callback func, void * data) {
527
+ NetworkClient& NetworkClient::setProgressCallback (curl_progress_callback func, void * data) {
518
528
progressCallback_ = func;
519
529
progressData_ = data;
530
+ return *this ;
520
531
}
521
532
522
533
void NetworkClient::private_parse_headers () {
@@ -536,22 +547,22 @@ void NetworkClient::private_parse_headers() {
536
547
}
537
548
}
538
549
539
- NString NetworkClient::responseHeaderByName (const NString & name) const {
550
+ std::string NetworkClient::responseHeaderByName (const std::string & name) const {
540
551
std::string lowerName = NetworkClientInternal::StrToLower (name);
541
552
542
553
for (const auto & it: responseHeaders_) {
543
554
if (NetworkClientInternal::StrToLower (it.name ) == lowerName) {
544
555
return it.value ;
545
556
}
546
557
}
547
- return NString ();
558
+ return std::string ();
548
559
}
549
560
550
561
size_t NetworkClient::responseHeaderCount () const {
551
562
return responseHeaders_.size ();
552
563
}
553
564
554
- NString NetworkClient::responseHeaderByIndex (int index, NString & name) const {
565
+ std::string NetworkClient::responseHeaderByIndex (int index, std::string & name) const {
555
566
name = responseHeaders_[index].name ;
556
567
return responseHeaders_[index].value ;
557
568
}
@@ -577,6 +588,7 @@ void NetworkClient::private_cleanup_after() {
577
588
outFileName_.clear ();
578
589
method_.clear ();
579
590
curl_easy_setopt (curlHandle_, CURLOPT_INFILESIZE_LARGE, static_cast <curl_off_t >(-1 ));
591
+ curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDSIZE_LARGE, static_cast <curl_off_t >(-1 ));
580
592
581
593
uploadData_.clear ();
582
594
uploadingFile_ = nullptr ;
@@ -602,7 +614,7 @@ size_t NetworkClient::private_read_callback(void* ptr, size_t size, size_t nmemb
602
614
size_t wantsToRead = size * nmemb;
603
615
if (uploadingFile_) {
604
616
int64_t pos = NetworkClientInternal::Ftell64 (uploadingFile_);
605
- if (pos >= chunkOffset_ + currentUploadDataSize_) {
617
+ if (chunkOffset_ >= 0 && pos >= chunkOffset_ + currentUploadDataSize_) {
606
618
return 0 ;
607
619
}
608
620
retcode = fread (ptr, size, nmemb, uploadingFile_);
@@ -618,7 +630,36 @@ size_t NetworkClient::private_read_callback(void* ptr, size_t size, size_t nmemb
618
630
return retcode;
619
631
}
620
632
621
- bool NetworkClient::doUpload (const NString& fileName, const NString& data) {
633
+ int NetworkClient::private_seek_callback (void *userp, curl_off_t offset, int origin) {
634
+ auto * nc = static_cast <NetworkClient*>(userp);
635
+
636
+ if (nc->uploadingFile_ ) {
637
+ int64_t newOffset = offset;
638
+ int newOrigin = origin;
639
+ if (origin == SEEK_SET && nc->chunkOffset_ != -1 ) {
640
+ newOffset = nc->chunkOffset_ + offset;
641
+ } else if (origin == SEEK_END) {
642
+ // not implemented
643
+ return CURL_SEEKFUNC_CANTSEEK;
644
+ }
645
+ return NetworkClientInternal::Fseek64 (nc->uploadingFile_ , newOffset, newOrigin);
646
+ } else {
647
+ if (origin == SEEK_SET) {
648
+ if (offset < 0 || offset>= nc->uploadData_ .size ()) {
649
+ return CURL_SEEKFUNC_CANTSEEK;
650
+ }
651
+ nc->uploadDataOffset_ = offset;
652
+ } else if (origin == SEEK_CUR) {
653
+ nc->uploadDataOffset_ += offset;
654
+ } else {
655
+ // not implemented
656
+ return CURL_SEEKFUNC_CANTSEEK;
657
+ }
658
+ return CURL_SEEKFUNC_OK;
659
+ }
660
+ }
661
+
662
+ bool NetworkClient::doUpload (const std::string& fileName, const std::string& data) {
622
663
if (!fileName.empty ()) {
623
664
uploadingFile_ = NetworkClientInternal::Fopen (fileName.c_str (), " rb" );
624
665
if (!uploadingFile_) {
@@ -654,15 +695,15 @@ bool NetworkClient::doUpload(const NString& fileName, const NString& data) {
654
695
currentActionType_ = atPost;
655
696
}
656
697
private_init_transfer ();
657
- curl_easy_setopt (curlHandle_, CURLOPT_READFUNCTION, read_callback);
658
- if (!private_apply_method ())
659
- curl_easy_setopt (curlHandle_, CURLOPT_POST, 1L );
660
698
curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDS, nullptr );
699
+ if (!private_apply_method ()) {
700
+ curl_easy_setopt (curlHandle_, CURLOPT_POST, 1L );
701
+ }
702
+ curl_easy_setopt (curlHandle_, CURLOPT_READFUNCTION, read_callback);
661
703
curl_easy_setopt (curlHandle_, CURLOPT_READDATA, this );
704
+ curl_easy_setopt (curlHandle_, CURLOPT_SEEKFUNCTION, private_seek_callback);
705
+ curl_easy_setopt (curlHandle_, CURLOPT_SEEKDATA, this );
662
706
663
- /* if (m_method != "PUT") {
664
- addQueryHeader("Content-Length", std::to_string(currentUploadDataSize_));
665
- }*/
666
707
curl_easy_setopt (curlHandle_, CURLOPT_POSTFIELDSIZE_LARGE, static_cast <curl_off_t >(currentUploadDataSize_));
667
708
668
709
curl_easy_setopt (curlHandle_, CURLOPT_INFILESIZE_LARGE, static_cast <curl_off_t >(currentUploadDataSize_));
@@ -692,8 +733,9 @@ bool NetworkClient::private_apply_method() {
692
733
return true ;
693
734
}
694
735
695
- void NetworkClient::setReferer (const NString & str) {
736
+ NetworkClient& NetworkClient::setReferer (const std::string & str) {
696
737
curl_easy_setopt (curlHandle_, CURLOPT_REFERER, str.c_str ());
738
+ return *this ;
697
739
}
698
740
699
741
int NetworkClient::getCurlResult () const {
@@ -704,30 +746,36 @@ CURL* NetworkClient::getCurlHandle() {
704
746
return curlHandle_;
705
747
}
706
748
707
- void NetworkClient::setOutputFile (const NString & str) {
749
+ NetworkClient& NetworkClient::setOutputFile (const std::string & str) {
708
750
outFileName_ = str;
751
+ return *this ;
709
752
}
710
753
711
- void NetworkClient::setUploadBufferSize (int size) {
754
+ NetworkClient& NetworkClient::setUploadBufferSize (int size) {
712
755
uploadBufferSize_ = size;
756
+ return *this ;
713
757
}
714
758
715
- void NetworkClient::setChunkOffset (int64_t offset) {
759
+ NetworkClient& NetworkClient::setChunkOffset (int64_t offset) {
716
760
chunkOffset_ = offset;
761
+ return *this ;
717
762
}
718
763
719
- void NetworkClient::setChunkSize (int64_t size) {
764
+ NetworkClient& NetworkClient::setChunkSize (int64_t size) {
720
765
chunkSize_ = size;
766
+ return *this ;
721
767
}
722
768
723
- NString NetworkClient::getCurlResultString () const {
769
+ std::string NetworkClient::getCurlResultString () const {
724
770
return curl_easy_strerror (curlResult_);
725
771
}
726
772
727
- void NetworkClient::setCurlOption (int option, const NString & value) {
773
+ NetworkClient& NetworkClient::setCurlOption (int option, const std::string & value) {
728
774
curl_easy_setopt (curlHandle_, static_cast <CURLoption>(option), value.c_str ());
775
+ return *this ;
729
776
}
730
777
731
- void NetworkClient::setCurlOptionInt (int option, long value) {
778
+ NetworkClient& NetworkClient::setCurlOptionInt (int option, long value) {
732
779
curl_easy_setopt (curlHandle_, static_cast <CURLoption>(option), value);
780
+ return *this ;
733
781
}
0 commit comments