in modules/http/curl-connect.cpp [36:86]
const bool testConnect(const string& url, const string& ca = "", const string& cert = "", const string& key = "") {
const gc_scoped_pool p;
const CURLSession cs(ca, cert, key, "", 0);
const failable<bool> crc = connect(url, cs);
assert(hasContent(crc));
apr_pollset_t* pollset;
const apr_status_t cprc = apr_pollset_create(&pollset, 2, pool(p), 0);
assert(cprc == APR_SUCCESS);
apr_socket_t* csock = sock(0, p);
const apr_pollfd_t* cpollfd = pollfd(csock, APR_POLLIN | APR_POLLERR | APR_POLLNVAL | APR_POLLHUP, p);
apr_pollset_add(pollset, cpollfd);
apr_socket_t* tsock = sock(cs);
const apr_pollfd_t* tpollfd = pollfd(tsock, APR_POLLIN | APR_POLLERR | APR_POLLNVAL | APR_POLLHUP, p);
apr_pollset_add(pollset, tpollfd);
const apr_pollfd_t* pollfds;
apr_int32_t pollcount;
for(;;) {
const apr_status_t pollrc = apr_pollset_poll(pollset, -1, &pollcount, &pollfds);
assert(pollrc == APR_SUCCESS);
for (; pollcount > 0; pollcount--, pollfds++) {
if (pollfds->rtnevents & APR_POLLIN) {
char data[8192];
if (pollfds->desc.s == csock) {
const size_t rl = ::read(0, data, sizeof(data));
if (rl == (size_t)-1)
return false;
if (rl > 0) {
const failable<bool> src = http::send(data, rl, cs);
assert(hasContent(src));
}
}
else {
const failable<size_t> frl = http::recv(data, sizeof(data), cs);
assert(hasContent(frl));
const size_t rl = content(frl);
if (rl == 0)
return true;
const size_t wl = ::write(0, data, rl);
assert(wl == rl);
}
continue;
}
assert(!(pollfds->rtnevents & (APR_POLLERR | APR_POLLHUP | APR_POLLNVAL)));
}
}
return true;
}