|
|
|
|
@ -149,6 +149,11 @@ public:
|
|
|
|
|
curlArgs[argPtr++] = const_cast <char *>(_url.c_str()); |
|
|
|
|
curlArgs[argPtr] = (char *)0; |
|
|
|
|
|
|
|
|
|
if (_cancelled) { |
|
|
|
|
delete this; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int curlStdout[2]; |
|
|
|
|
int curlStderr[2]; |
|
|
|
|
::pipe(curlStdout); |
|
|
|
|
@ -175,7 +180,8 @@ public:
|
|
|
|
|
unsigned long long timesOutAt = Utils::now() + ((unsigned long long)_timeout * 1000ULL); |
|
|
|
|
bool timedOut = false; |
|
|
|
|
bool tooLong = false; |
|
|
|
|
for(;;) { |
|
|
|
|
|
|
|
|
|
while (!_cancelled) { |
|
|
|
|
FD_ZERO(&readfds); |
|
|
|
|
FD_ZERO(&writefds); |
|
|
|
|
FD_ZERO(&errfds); |
|
|
|
|
@ -196,18 +202,18 @@ public:
|
|
|
|
|
} else if (n < 0) |
|
|
|
|
break; |
|
|
|
|
if (_body.length() > CURL_MAX_MESSAGE_LENGTH) { |
|
|
|
|
::kill(_pid,SIGKILL); |
|
|
|
|
tooLong = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (FD_ISSET(curlStderr[0],&readfds)) |
|
|
|
|
::read(curlStderr[0],buf,sizeof(buf)); |
|
|
|
|
|
|
|
|
|
if (FD_ISSET(curlStdout[0],&errfds)||FD_ISSET(curlStderr[0],&errfds)) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
if (Utils::now() >= timesOutAt) { |
|
|
|
|
::kill(_pid,SIGKILL); |
|
|
|
|
timedOut = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
@ -231,8 +237,10 @@ public:
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (_pid > 0) |
|
|
|
|
if (_pid > 0) { |
|
|
|
|
::kill(_pid,SIGKILL); |
|
|
|
|
waitpid(_pid,&exitCode,0); |
|
|
|
|
} |
|
|
|
|
_pid = 0; |
|
|
|
|
|
|
|
|
|
::close(curlStdout[0]); |
|
|
|
|
@ -491,17 +499,27 @@ HttpClient::~HttpClient()
|
|
|
|
|
Mutex::Lock _l(_requests_m); |
|
|
|
|
reqs = _requests; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(std::set<Request>::iterator r(reqs.begin());r!=reqs.end();++r) |
|
|
|
|
this->cancel(*r); |
|
|
|
|
|
|
|
|
|
for(;;) { |
|
|
|
|
_requests_m.lock(); |
|
|
|
|
if (_requests.empty()) { |
|
|
|
|
_requests_m.unlock(); |
|
|
|
|
break; |
|
|
|
|
} else { |
|
|
|
|
_requests_m.unlock(); |
|
|
|
|
Thread::sleep(250); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HttpClient::cancel(HttpClient::Request req) |
|
|
|
|
{ |
|
|
|
|
{ |
|
|
|
|
Mutex::Lock _l(_requests_m); |
|
|
|
|
if (_requests.count(req) == 0) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
Mutex::Lock _l(_requests_m); |
|
|
|
|
if (_requests.count(req) == 0) |
|
|
|
|
return; |
|
|
|
|
((HttpClient_Private_Request *)req)->cancel(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|