Skip to content

Commit 18273ea

Browse files
committed
Fix bugs
1 parent ec26443 commit 18273ea

File tree

2 files changed

+121
-74
lines changed

2 files changed

+121
-74
lines changed

NetworkClient.cpp

Lines changed: 86 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ std::string Utf8ToSystemLocale(const std::string& str)
130130
#endif
131131

132132
FILE* Fopen(const char* filename, const char* mode) {
133-
#ifdef _WIN32
133+
#ifdef _MSC_VER
134134
return _wfopen(Utf8ToWide(filename).c_str(), Utf8ToWide(mode).c_str());
135135
#else
136136
return fopen(filename, mode);
@@ -287,15 +287,15 @@ size_t NetworkClient::private_static_writer(char* data, size_t size, size_t nmem
287287
return 0;
288288
}
289289

290-
void NetworkClient::setProxy(const NString& host, int port, int type) {
290+
NetworkClient& NetworkClient::setProxy(const std::string& host, int port, int type) {
291291
curl_easy_setopt(curlHandle_, CURLOPT_PROXY, host.c_str());
292292
curl_easy_setopt(curlHandle_, CURLOPT_PROXYPORT, static_cast<long>(port));
293293
curl_easy_setopt(curlHandle_, CURLOPT_PROXYTYPE, static_cast<long>(type));
294294
curl_easy_setopt(curlHandle_, CURLOPT_NOPROXY, "");
295-
//curl_easy_setopt(curlHandle_, CURLOPT_NOPROXY, "localhost,127.0.0.1"); // test
295+
return *this;
296296
}
297297

298-
void NetworkClient::setProxyUserPassword(const NString& username, const NString& password) {
298+
NetworkClient& NetworkClient::setProxyUserPassword(const std::string& username, const std::string& password) {
299299
if (username.empty() && password.empty()) {
300300
curl_easy_setopt(curlHandle_, CURLOPT_PROXYUSERPWD, nullptr);
301301
curl_easy_setopt(curlHandle_, CURLOPT_PROXYAUTH, nullptr);
@@ -305,6 +305,7 @@ void NetworkClient::setProxyUserPassword(const NString& username, const NString&
305305
curl_easy_setopt(curlHandle_, CURLOPT_PROXYUSERPWD, authStr.c_str());
306306
curl_easy_setopt(curlHandle_, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
307307
}
308+
return *this;
308309
}
309310

310311
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
338339
return 0;
339340
}
340341

341-
void NetworkClient::setMethod(const NString& str) {
342+
NetworkClient& NetworkClient::setMethod(const std::string& str) {
342343
method_ = str;
344+
return *this;
343345
}
344346

345-
void NetworkClient::addQueryParam(const NString& name, const NString& value) {
347+
NetworkClient& NetworkClient::addQueryParam(const std::string& name, const std::string& value) {
346348
QueryParam newParam;
347349
newParam.name = name;
348350
newParam.value = value;
349351
newParam.isFile = false;
350352
queryParams_.push_back(newParam);
353+
return *this;
351354
}
352355

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) {
355358
QueryParam newParam;
356359
newParam.name = name;
357360
newParam.value = fileName;
358361
newParam.isFile = true;
359362
newParam.contentType = contentType;
360363
newParam.displayName = displayName;
361364
queryParams_.push_back(newParam);
365+
return *this;
362366
}
363367

364-
void NetworkClient::setUrl(const NString& url) {
368+
NetworkClient& NetworkClient::setUrl(const std::string& url) {
365369
url_ = url;
366370
curl_easy_setopt(curlHandle_, CURLOPT_URL, url.c_str());
371+
return *this;
367372
}
368373

369374
bool NetworkClient::doUploadMultipartData() {
@@ -438,8 +443,9 @@ int NetworkClient::responseCode() const {
438443
return result;
439444
}
440445

441-
void NetworkClient::addQueryHeader(const NString& name, const NString& value) {
446+
NetworkClient& NetworkClient::addQueryHeader(const std::string& name, const std::string& value) {
442447
queryHeaders_.emplace_back(name, value);
448+
return *this;
443449
}
444450

445451
bool NetworkClient::doGet(const std::string& url) {
@@ -455,7 +461,7 @@ bool NetworkClient::doGet(const std::string& url) {
455461

456462
}
457463

458-
bool NetworkClient::doPost(const NString& data) {
464+
bool NetworkClient::doPost(const std::string& data) {
459465
private_init_transfer();
460466
if (!private_apply_method())
461467
curl_easy_setopt(curlHandle_, CURLOPT_POST, 1L);
@@ -467,30 +473,34 @@ bool NetworkClient::doPost(const NString& data) {
467473
}
468474
}
469475

470-
if (data.empty()) {
476+
if(data.empty()) {
471477
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());
474483
}
475484

476485
currentActionType_ = atPost;
477486
curlResult_ = curl_easy_perform(curlHandle_);
478487
return private_on_finish_request();
479488
}
480489

481-
NString NetworkClient::urlEncode(const NString& str) {
490+
std::string NetworkClient::urlEncode(const std::string& str) {
482491
char* encoded = curl_easy_escape(curlHandle_, str.c_str(), str.length());
483492
std::string res = encoded;
484493
curl_free(encoded);
485494
return res;
486495
}
487496

488-
NString NetworkClient::errorString() const {
497+
std::string NetworkClient::errorString() const {
489498
return errorBuffer_;
490499
}
491500

492-
void NetworkClient::setUserAgent(const NString& userAgentStr) {
501+
NetworkClient& NetworkClient::setUserAgent(const std::string& userAgentStr) {
493502
userAgent_ = userAgentStr;
503+
return *this;
494504
}
495505

496506
void NetworkClient::private_init_transfer() {
@@ -510,13 +520,14 @@ void NetworkClient::private_init_transfer() {
510520
curl_easy_setopt(curlHandle_, CURLOPT_HTTPHEADER, chunk_);
511521
}
512522

513-
NString NetworkClient::responseHeaderText() const {
523+
std::string NetworkClient::responseHeaderText() const {
514524
return headerBuffer_;
515525
}
516526

517-
void NetworkClient::setProgressCallback(curl_progress_callback func, void* data) {
527+
NetworkClient& NetworkClient::setProgressCallback(curl_progress_callback func, void* data) {
518528
progressCallback_ = func;
519529
progressData_ = data;
530+
return *this;
520531
}
521532

522533
void NetworkClient::private_parse_headers() {
@@ -536,22 +547,22 @@ void NetworkClient::private_parse_headers() {
536547
}
537548
}
538549

539-
NString NetworkClient::responseHeaderByName(const NString& name) const {
550+
std::string NetworkClient::responseHeaderByName(const std::string& name) const {
540551
std::string lowerName = NetworkClientInternal::StrToLower(name);
541552

542553
for (const auto& it: responseHeaders_) {
543554
if (NetworkClientInternal::StrToLower(it.name) == lowerName) {
544555
return it.value;
545556
}
546557
}
547-
return NString();
558+
return std::string();
548559
}
549560

550561
size_t NetworkClient::responseHeaderCount() const {
551562
return responseHeaders_.size();
552563
}
553564

554-
NString NetworkClient::responseHeaderByIndex(int index, NString& name) const {
565+
std::string NetworkClient::responseHeaderByIndex(int index, std::string& name) const {
555566
name = responseHeaders_[index].name;
556567
return responseHeaders_[index].value;
557568
}
@@ -577,6 +588,7 @@ void NetworkClient::private_cleanup_after() {
577588
outFileName_.clear();
578589
method_.clear();
579590
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));
580592

581593
uploadData_.clear();
582594
uploadingFile_ = nullptr;
@@ -602,7 +614,7 @@ size_t NetworkClient::private_read_callback(void* ptr, size_t size, size_t nmemb
602614
size_t wantsToRead = size * nmemb;
603615
if (uploadingFile_) {
604616
int64_t pos = NetworkClientInternal::Ftell64(uploadingFile_);
605-
if (pos >= chunkOffset_ + currentUploadDataSize_) {
617+
if (chunkOffset_ >= 0 && pos >= chunkOffset_ + currentUploadDataSize_) {
606618
return 0;
607619
}
608620
retcode = fread(ptr, size, nmemb, uploadingFile_);
@@ -618,7 +630,36 @@ size_t NetworkClient::private_read_callback(void* ptr, size_t size, size_t nmemb
618630
return retcode;
619631
}
620632

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) {
622663
if (!fileName.empty()) {
623664
uploadingFile_ = NetworkClientInternal::Fopen(fileName.c_str(), "rb");
624665
if (!uploadingFile_) {
@@ -654,15 +695,15 @@ bool NetworkClient::doUpload(const NString& fileName, const NString& data) {
654695
currentActionType_ = atPost;
655696
}
656697
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);
660698
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);
661703
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);
662706

663-
/*if (m_method != "PUT") {
664-
addQueryHeader("Content-Length", std::to_string(currentUploadDataSize_));
665-
}*/
666707
curl_easy_setopt(curlHandle_, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t>(currentUploadDataSize_));
667708

668709
curl_easy_setopt(curlHandle_, CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(currentUploadDataSize_));
@@ -692,8 +733,9 @@ bool NetworkClient::private_apply_method() {
692733
return true;
693734
}
694735

695-
void NetworkClient::setReferer(const NString& str) {
736+
NetworkClient& NetworkClient::setReferer(const std::string& str) {
696737
curl_easy_setopt(curlHandle_, CURLOPT_REFERER, str.c_str());
738+
return *this;
697739
}
698740

699741
int NetworkClient::getCurlResult() const {
@@ -704,30 +746,36 @@ CURL* NetworkClient::getCurlHandle() {
704746
return curlHandle_;
705747
}
706748

707-
void NetworkClient::setOutputFile(const NString& str) {
749+
NetworkClient& NetworkClient::setOutputFile(const std::string& str) {
708750
outFileName_ = str;
751+
return *this;
709752
}
710753

711-
void NetworkClient::setUploadBufferSize(int size) {
754+
NetworkClient& NetworkClient::setUploadBufferSize(int size) {
712755
uploadBufferSize_ = size;
756+
return *this;
713757
}
714758

715-
void NetworkClient::setChunkOffset(int64_t offset) {
759+
NetworkClient& NetworkClient::setChunkOffset(int64_t offset) {
716760
chunkOffset_ = offset;
761+
return *this;
717762
}
718763

719-
void NetworkClient::setChunkSize(int64_t size) {
764+
NetworkClient& NetworkClient::setChunkSize(int64_t size) {
720765
chunkSize_ = size;
766+
return *this;
721767
}
722768

723-
NString NetworkClient::getCurlResultString() const {
769+
std::string NetworkClient::getCurlResultString() const {
724770
return curl_easy_strerror(curlResult_);
725771
}
726772

727-
void NetworkClient::setCurlOption(int option, const NString& value) {
773+
NetworkClient& NetworkClient::setCurlOption(int option, const std::string& value) {
728774
curl_easy_setopt(curlHandle_, static_cast<CURLoption>(option), value.c_str());
775+
return *this;
729776
}
730777

731-
void NetworkClient::setCurlOptionInt(int option, long value) {
778+
NetworkClient& NetworkClient::setCurlOptionInt(int option, long value) {
732779
curl_easy_setopt(curlHandle_, static_cast<CURLoption>(option), value);
780+
return *this;
733781
}

0 commit comments

Comments
 (0)