|
|
|
|
@ -1,88 +1,59 @@
|
|
|
|
|
#include <server_http.hpp> |
|
|
|
|
#include <boost/filesystem.hpp> |
|
|
|
|
#include <http.hpp> |
|
|
|
|
#include <session.hpp> |
|
|
|
|
#include <libtorrent/session.hpp> |
|
|
|
|
#include <libtorrent/session_stats.hpp> |
|
|
|
|
#include <libtorrent/session_status.hpp> |
|
|
|
|
#include <boost/filesystem.hpp> |
|
|
|
|
#include <server_http.hpp> |
|
|
|
|
#include <session.hpp> |
|
|
|
|
#include <torrents.hpp> |
|
|
|
|
|
|
|
|
|
typedef SimpleWeb::Server<SimpleWeb::HTTP> HttpServer; |
|
|
|
|
|
|
|
|
|
using namespace std; |
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) { |
|
|
|
|
int http_port=8080, http_threads=4; |
|
|
|
|
const boost::filesystem::path root_dir="/home/zalox/downloads"; |
|
|
|
|
const boost::filesystem::path default_download_dir=root_dir/"toREST"; |
|
|
|
|
if(!boost::filesystem::exists(default_download_dir)){ |
|
|
|
|
int http_port = 8080, http_threads = 4; |
|
|
|
|
const boost::filesystem::path root_dir = "/home/zalox/downloads"; |
|
|
|
|
const boost::filesystem::path default_download_dir = root_dir / "toREST"; |
|
|
|
|
if (!boost::filesystem::exists(default_download_dir)) { |
|
|
|
|
boost::system::error_code ec; |
|
|
|
|
boost::filesystem::create_directories(default_download_dir,ec); |
|
|
|
|
if(ec){ |
|
|
|
|
boost::filesystem::create_directories(default_download_dir, ec); |
|
|
|
|
if (ec) { |
|
|
|
|
std::cout << ec.message() << "\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
HttpServer http_server(http_port,http_threads); |
|
|
|
|
HttpServer http_server(http_port, http_threads); |
|
|
|
|
libtorrent::session session; |
|
|
|
|
const auto stats_metrics = libtorrent::session_stats_metrics(); |
|
|
|
|
http_server.default_resource["GET"]=[](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
http_server.default_resource["GET"] = [](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
auto response = http::response(); |
|
|
|
|
response.set_status(http::not_found); |
|
|
|
|
*resp << response; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session(\\?.*)?\\/?$"]["GET"]=[&](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
tr::session::get(session,resp,req); |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session(\\?.*)?\\/?$"]["GET"] = [&](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
tr::session::get(session, resp, req); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session(\\?.*)?\\/?$"]["PATCH"]=[&](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
tr::session::patch(session,resp,req); |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session(\\?.*)?\\/?$"]["PATCH"] = [&](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
tr::session::patch(session, resp, req); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session/torrents(\\?.*)?\\/?$"]["GET"]=[&session](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
auto response = http::response(); |
|
|
|
|
if(session.is_valid()) { |
|
|
|
|
auto torrents = session.get_torrents(); |
|
|
|
|
auto response_object = nlohmann::json::object(); |
|
|
|
|
auto torrents_json = nlohmann::json::array(); |
|
|
|
|
for(auto &torrent:torrents){ |
|
|
|
|
if(torrent.is_valid()){ |
|
|
|
|
const auto hash=torrent.info_hash().to_string(); |
|
|
|
|
const auto status=torrent.status( |
|
|
|
|
libtorrent::torrent_handle::query_name | |
|
|
|
|
libtorrent::torrent_handle::query_save_path |
|
|
|
|
); |
|
|
|
|
torrents_json.push_back({ |
|
|
|
|
{ "hash", hash }, |
|
|
|
|
{ "paused", status.paused }, |
|
|
|
|
{ "seeding", status.is_seeding }, |
|
|
|
|
{ "state", status.state }, |
|
|
|
|
{ "priority", status.priority }, |
|
|
|
|
{ "name",status.name } |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
response_object["torrents"] = torrents_json; |
|
|
|
|
response.set_status(http::ok); |
|
|
|
|
response.set_body(response_object); |
|
|
|
|
} else { |
|
|
|
|
auto response_code = http::code(http::service_unavailable); |
|
|
|
|
response.set_body({{response_code.first, response_code.second}}); |
|
|
|
|
response.set_status(response_code.first); |
|
|
|
|
} |
|
|
|
|
*resp << response; |
|
|
|
|
|
|
|
|
|
http_server.resource["^/session/torrents(\\?.*)?\\/?$"]["GET"] = [&session](std::shared_ptr<HttpServer::Response> resp, std::shared_ptr<HttpServer::Request> req) { |
|
|
|
|
tr::session::torrents::get(session, resp, req); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
std::thread server_thread([&http_server](){ |
|
|
|
|
|
|
|
|
|
std::thread server_thread([&http_server]() { |
|
|
|
|
http_server.start(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << "HttpServer listening on port " << 8080 << std::endl; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::string input; |
|
|
|
|
while(input != "q") { |
|
|
|
|
while (input != "q") { |
|
|
|
|
std::getline(std::cin, input); |
|
|
|
|
if(input == "q") { |
|
|
|
|
if (input == "q") { |
|
|
|
|
std::cout << "Stopping server..." << std::endl; |
|
|
|
|
http_server.stop(); // TODO check if throws
|
|
|
|
|
std::cout << "Server stopped" << std::endl; |
|
|
|
|
|