/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* $Rev$ $Date$ */ /** * HTTP connect command line test tool. */ #include #include #include "stream.hpp" #include "string.hpp" #include "perf.hpp" #include "http.hpp" namespace tuscany { namespace http { const bool testConnect(const string& url, const string& ca = "", const string& cert = "", const string& key = "") { gc_scoped_pool p; CURLSession cs(ca, cert, key, "", 0); const failable crc = connect(url, cs); assert(hasContent(crc)); apr_pollset_t* pollset; 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(;;) { 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 src = http::send(data, rl, cs); assert(hasContent(src)); } } else { const failable 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; } } } int main(unused const int argc, const char** argv) { if (argc > 2) tuscany::http::testConnect(tuscany::string(argv[1]), tuscany::string(argv[2]), tuscany::string(argv[3]), tuscany::string(argv[4])); else tuscany::http::testConnect(tuscany::string(argv[1])); return 0; }