forked from premiere/premiere-libtorrent
dropped dependency on lighttpd for the tests
This commit is contained in:
parent
c32b40c739
commit
cee7f2a809
|
@ -35,9 +35,11 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/session.hpp"
|
#include "libtorrent/session.hpp"
|
||||||
#include "libtorrent/hasher.hpp"
|
#include "libtorrent/hasher.hpp"
|
||||||
|
#include "libtorrent/http_parser.hpp"
|
||||||
|
|
||||||
#include "libtorrent/thread.hpp"
|
#include "libtorrent/thread.hpp"
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
#include "test.hpp"
|
#include "test.hpp"
|
||||||
#include "libtorrent/assert.hpp"
|
#include "libtorrent/assert.hpp"
|
||||||
|
@ -106,76 +108,6 @@ void test_sleep(int millisec)
|
||||||
libtorrent::sleep(millisec);
|
libtorrent::sleep(millisec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop_web_server(int port)
|
|
||||||
{
|
|
||||||
char buf[100];
|
|
||||||
snprintf(buf, sizeof(buf), "kill `cat ./lighty%d.pid` >/dev/null", port);
|
|
||||||
system(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void start_web_server(int port, bool ssl)
|
|
||||||
{
|
|
||||||
stop_web_server(port);
|
|
||||||
|
|
||||||
if (ssl)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "generating SSL key\n");
|
|
||||||
system("echo . > tmp");
|
|
||||||
system("echo test province >>tmp");
|
|
||||||
system("echo test city >> tmp");
|
|
||||||
system("echo test company >> tmp");
|
|
||||||
system("echo test department >> tmp");
|
|
||||||
system("echo tester >> tmp");
|
|
||||||
system("echo test@test.com >> tmp");
|
|
||||||
system("openssl req -new -x509 -keyout server.pem -out server.pem "
|
|
||||||
"-days 365 -nodes <tmp");
|
|
||||||
}
|
|
||||||
|
|
||||||
error_code ec;
|
|
||||||
file f("lighty_config", file::write_only, ec);
|
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error writing lighty config file: %s\n", ec.message().c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this requires lighttpd to be built with ssl support.
|
|
||||||
// The port distribution for mac is not built with ssl
|
|
||||||
// support by default.
|
|
||||||
char buf[1024];
|
|
||||||
int buf_size = snprintf(buf, sizeof(buf),
|
|
||||||
"server.modules = (\"mod_access\", \"mod_redirect\", \"mod_setenv\")\n"
|
|
||||||
"server.document-root = \"%s\"\n"
|
|
||||||
"server.range-requests = \"enable\"\n"
|
|
||||||
"server.port = %d\n"
|
|
||||||
"server.pid-file = \"./lighty%d.pid\"\n"
|
|
||||||
"url.redirect = ("
|
|
||||||
"\"^/redirect$\" => \"%s://127.0.0.1:%d/test_file\""
|
|
||||||
", \"^/infinite_redirect$\" => \"%s://127.0.0.1:%d/infinite_redirect\""
|
|
||||||
", \"^/relative/redirect$\" => \"../test_file\""
|
|
||||||
")\n"
|
|
||||||
"$HTTP[\"url\"] == \"/test_file.gz\" {\n"
|
|
||||||
" setenv.add-response-header = ( \"Content-Encoding\" => \"gzip\" )\n"
|
|
||||||
"}\n"
|
|
||||||
"ssl.engine = \"%s\"\n"
|
|
||||||
"ssl.pemfile = \"server.pem\"\n"
|
|
||||||
, current_working_directory().c_str(), port, port
|
|
||||||
, (ssl?"https":"http"), port, (ssl?"https":"http"), port
|
|
||||||
, (ssl?"enable":"disable"));
|
|
||||||
file::iovec_t b = { buf, buf_size };
|
|
||||||
f.writev(0, &b, 1, ec);
|
|
||||||
if (ec)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "error writing lighty config file: %s\n", ec.message().c_str());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
f.close();
|
|
||||||
|
|
||||||
fprintf(stderr, "starting lighty\n\n%s\n\n", buf);
|
|
||||||
system("lighttpd -f lighty_config 2> lighty.err >lighty.log &");
|
|
||||||
test_sleep(1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void stop_proxy(int port)
|
void stop_proxy(int port)
|
||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
|
@ -396,3 +328,188 @@ setup_transfer(session* ses1, session* ses2, session* ses3
|
||||||
return boost::make_tuple(tor1, tor2, tor3);
|
return boost::make_tuple(tor1, tor2, tor3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
socket_acceptor* web_socket = 0;
|
||||||
|
boost::shared_ptr<libtorrent::thread> web_server;
|
||||||
|
|
||||||
|
void stop_web_server(int port)
|
||||||
|
{
|
||||||
|
if (web_server && web_socket)
|
||||||
|
{
|
||||||
|
web_socket->close();
|
||||||
|
web_server->join();
|
||||||
|
web_server.reset();
|
||||||
|
web_socket = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void web_server_thread(int port, bool ssl);
|
||||||
|
|
||||||
|
void start_web_server(int port, bool ssl)
|
||||||
|
{
|
||||||
|
stop_web_server(port);
|
||||||
|
|
||||||
|
web_server.reset(new libtorrent::thread(boost::bind(&web_server_thread, port, ssl)));
|
||||||
|
|
||||||
|
// create this directory so that the path
|
||||||
|
// "relative/../test_file" can resolve
|
||||||
|
error_code ec;
|
||||||
|
create_directory("relative", ec);
|
||||||
|
test_sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_response(stream_socket& s, error_code& ec
|
||||||
|
, int code, char const* status_message, char const* extra_header
|
||||||
|
, int len)
|
||||||
|
{
|
||||||
|
char msg[400];
|
||||||
|
int pkt_len = snprintf(msg, sizeof(msg), "HTTP/1.0 %d %s\r\n"
|
||||||
|
"content-length: %d\r\n"
|
||||||
|
"connection: close\r\n"
|
||||||
|
"%s%s"
|
||||||
|
"\r\n"
|
||||||
|
, code, status_message, len
|
||||||
|
, extra_header ? extra_header : "", extra_header ? "\r\n" : "");
|
||||||
|
fprintf(stderr, ">> %s\n", msg);
|
||||||
|
write(s, boost::asio::buffer(msg, pkt_len), boost::asio::transfer_all(), ec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void web_server_thread(int port, bool ssl)
|
||||||
|
{
|
||||||
|
// TODO: support SSL
|
||||||
|
|
||||||
|
io_service ios;
|
||||||
|
socket_acceptor acceptor(ios);
|
||||||
|
web_socket = &acceptor;
|
||||||
|
error_code ec;
|
||||||
|
acceptor.open(tcp::v4(), ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error opening listen socket: %s\n", ec.message().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
acceptor.set_option(socket_acceptor::reuse_address(true), ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error setting listen socket to reuse addr: %s\n", ec.message().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
acceptor.bind(tcp::endpoint(address_v4::any(), port), ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error binding listen socket: %s\n", ec.message().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
acceptor.listen(10, ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error listening on socket: %s\n", ec.message().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[10000];
|
||||||
|
int len = 0;
|
||||||
|
stream_socket s(ios);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
s.close(ec);
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
acceptor.accept(s, ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "accept failed: %s\n", ec.message().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
http_parser p;
|
||||||
|
bool failed = false;
|
||||||
|
|
||||||
|
while (!p.finished())
|
||||||
|
{
|
||||||
|
size_t received = s.read_some(boost::asio::buffer(&buf[len], sizeof(buf) - len), ec);
|
||||||
|
if (ec || received <= 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "read failed: %s\n", ec.message().c_str());
|
||||||
|
failed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len += received;
|
||||||
|
|
||||||
|
bool error = false;
|
||||||
|
p.incoming(buffer::const_interval(buf, buf + len), error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failed) continue;
|
||||||
|
|
||||||
|
if (p.method() != "get" && p.method() != "post")
|
||||||
|
{
|
||||||
|
fprintf(stderr, "incorrect method: %s\n", p.method().c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string path = p.path();
|
||||||
|
|
||||||
|
if (path == "/redirect")
|
||||||
|
{
|
||||||
|
send_response(s, ec, 301, "Moved Permanently", "Location: /test_file", 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path == "/infinite_redirect")
|
||||||
|
{
|
||||||
|
send_response(s, ec, 301, "Moved Permanently", "Location: /infinite_redirect", 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path == "/relative/redirect")
|
||||||
|
{
|
||||||
|
send_response(s, ec, 301, "Moved Permanently", "Location: ../test_file", 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, ">> serving file %s\n", path.c_str());
|
||||||
|
std::vector<char> file_buf;
|
||||||
|
// remove the / from the path
|
||||||
|
path = path.substr(1);
|
||||||
|
int res = load_file(path, file_buf);
|
||||||
|
if (res == -1)
|
||||||
|
{
|
||||||
|
send_response(s, ec, 404, "Not Found", 0, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res != 0)
|
||||||
|
{
|
||||||
|
// this means the file was either too big or couldn't be read
|
||||||
|
send_response(s, ec, 503, "Internal Error", 0, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// serve file
|
||||||
|
|
||||||
|
char const* extra_header = 0;
|
||||||
|
|
||||||
|
if (extension(path) == ".gz")
|
||||||
|
{
|
||||||
|
extra_header = "Content-Encoding: gzip";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p.header("range").empty())
|
||||||
|
{
|
||||||
|
std::string range = p.header("range");
|
||||||
|
int start, end;
|
||||||
|
sscanf(range.c_str(), "bytes=%d-%d", &start, &end);
|
||||||
|
send_response(s, ec, 206, "Partial", extra_header, end - start + 1);
|
||||||
|
write(s, boost::asio::buffer(&file_buf[0] + start, end - start + 1), boost::asio::transfer_all(), ec);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
send_response(s, ec, 200, "OK", extra_header, file_buf.size());
|
||||||
|
write(s, boost::asio::buffer(&file_buf[0], file_buf.size()), boost::asio::transfer_all(), ec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue