
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1052740 13f79535-47bb-0310-9956-ffa450edef68
98 lines
3.3 KiB
C++
98 lines
3.3 KiB
C++
/*
|
|
* 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 <assert.h>
|
|
#include <stdio.h>
|
|
#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);
|
|
const failable<bool> 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<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;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|