const bool testConnect()

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;
}