aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee/demo/demo_http_server
diff options
context:
space:
mode:
authorAntonio Juarez <antonio.maria.juarez@live.com>2014-03-03 22:07:58 +0000
committerAntonio Juarez <antonio.maria.juarez@live.com>2014-03-03 22:07:58 +0000
commit296ae46ed8f8f6e5f986f978febad302e3df231a (patch)
tree1629164454a239308f33c9e12afb22e7f3cd8eeb /contrib/epee/demo/demo_http_server
parentchanged name (diff)
downloadmonero-296ae46ed8f8f6e5f986f978febad302e3df231a.tar.xz
moved all stuff to github
Diffstat (limited to 'contrib/epee/demo/demo_http_server')
-rw-r--r--contrib/epee/demo/demo_http_server/demo_http_server.cpp217
-rw-r--r--contrib/epee/demo/demo_http_server/demo_http_server.h101
-rw-r--r--contrib/epee/demo/demo_http_server/stdafx.cpp8
-rw-r--r--contrib/epee/demo/demo_http_server/stdafx.h40
-rw-r--r--contrib/epee/demo/demo_http_server/targetver.h13
5 files changed, 379 insertions, 0 deletions
diff --git a/contrib/epee/demo/demo_http_server/demo_http_server.cpp b/contrib/epee/demo/demo_http_server/demo_http_server.cpp
new file mode 100644
index 000000000..f614da6c5
--- /dev/null
+++ b/contrib/epee/demo/demo_http_server/demo_http_server.cpp
@@ -0,0 +1,217 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "stdafx.h"
+#include "console_handler.h"
+#include "demo_http_server.h"
+#include "net/http_client.h"
+#include "storages/http_abstract_invoke.h"
+
+
+template<class t_request, class t_response>
+bool communicate(const std::string url, t_request& req, t_response& rsp, const std::string& ip, const std::string& port, bool use_json, bool use_jrpc = false)
+{
+ epee::net_utils::http::http_simple_client http_client;
+ bool r = http_client.connect(ip, port, 1000);
+ CHECK_AND_ASSERT_MES(r, false, "failed to connect");
+ if(use_json)
+ {
+ if(use_jrpc)
+ {
+ epee::json_rpc::request<t_request> req_t = AUTO_VAL_INIT(req_t);
+ req_t.params = req;
+ req_t.id = "10";
+ req_t.method = "command_example_1";
+ req_t.version = "1.1";
+ epee::json_rpc::response<t_response, std::string> resp_t = AUTO_VAL_INIT(resp_t);
+ if(!epee::net_utils::invoke_http_json_remote_command2("/request_json_rpc", req_t, resp_t, http_client))
+ {
+ return false;
+ }
+ rsp = resp_t.result;
+ return true;
+ }else
+ return epee::net_utils::invoke_http_json_remote_command2(url, req, rsp, http_client);
+ }
+ else
+ return epee::net_utils::invoke_http_bin_remote_command2(url, req, rsp, http_client);
+}
+
+
+int main(int argc, char* argv[])
+{
+ TRY_ENTRY();
+ string_tools::set_module_name_and_folder(argv[0]);
+
+ //set up logging options
+ log_space::get_set_log_detalisation_level(true, LOG_LEVEL_2);
+ log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL);
+ log_space::log_singletone::add_logger(LOGGER_FILE,
+ log_space::log_singletone::get_default_log_file().c_str(),
+ log_space::log_singletone::get_default_log_folder().c_str());
+
+
+
+ LOG_PRINT("Demo server starting ...", LOG_LEVEL_0);
+
+
+ demo::demo_http_server srv;
+
+ start_default_console(&srv);
+
+ std::string bind_param = "0.0.0.0";
+ std::string port = "83";
+
+ if(!srv.init(port, bind_param))
+ {
+ LOG_ERROR("Failed to initialize srv!");
+ return 1;
+ }
+
+ //log loop
+ srv.run();
+ size_t count = 0;
+ while (!srv.is_stop())
+ {
+
+ demo::COMMAND_EXAMPLE_1::request req;
+ req.sub = demo::get_test_data();
+ demo::COMMAND_EXAMPLE_1::response rsp;
+ bool r = false;
+ if(count%2)
+ {//invoke json
+ r = communicate("/request_api_json_1", req, rsp, "127.0.0.1", port, true, true);
+ }else{
+ r = communicate("/request_api_bin_1", req, rsp, "127.0.0.1", port, false);
+ }
+ CHECK_AND_ASSERT_MES(r, false, "failed to invoke http request");
+ CHECK_AND_ASSERT_MES(rsp.m_success, false, "wrong response");
+ CHECK_AND_ASSERT_MES(rsp.subs.size()==1, false, "wrong response");
+ CHECK_AND_ASSERT_MES(rsp.subs.front() == demo::get_test_data(), false, "wrong response");
+ //misc_utils::sleep_no_w(1000);
+ ++count;
+ }
+ bool r = srv.wait_stop();
+ CHECK_AND_ASSERT_MES(r, 1, "failed to wait server stop");
+ srv.deinit();
+
+ LOG_PRINT("Demo server stoped.", LOG_LEVEL_0);
+ return 1;
+
+ CATCH_ENTRY_L0("main", 1);
+}
+
+/************************************************************************/
+/* */
+/************************************************************************/
+namespace demo
+{
+ bool demo_http_server::init(const std::string& bind_port, const std::string& bind_ip)
+ {
+
+
+ //set self as callback handler
+ m_net_server.get_config_object().m_phandler = this;
+
+ //here set folder for hosting reqests
+ m_net_server.get_config_object().m_folder = "";
+
+ LOG_PRINT_L0("Binding on " << bind_ip << ":" << bind_port);
+ return m_net_server.init_server(bind_port, bind_ip);
+ }
+
+ bool demo_http_server::run()
+ {
+ m_stop = false;
+ //here you can set worker threads count
+ int thrds_count = 4;
+
+ //go to loop
+ LOG_PRINT("Run net_service loop( " << thrds_count << " threads)...", LOG_LEVEL_0);
+ if(!m_net_server.run_server(thrds_count, false))
+ {
+ LOG_ERROR("Failed to run net tcp server!");
+ }
+
+ return true;
+ }
+
+ bool demo_http_server::deinit()
+ {
+ return m_net_server.deinit_server();
+ }
+
+ bool demo_http_server::send_stop_signal()
+ {
+ m_stop = true;
+ m_net_server.send_stop_signal();
+ return true;
+ }
+
+ bool demo_http_server::on_requestr_uri_1(const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context)
+ {
+ return true;
+ }
+
+
+ bool demo_http_server::on_requestr_uri_2(const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context)
+ {
+ return true;
+ }
+
+
+ bool demo_http_server::on_hosting_request( const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context)
+ {
+ //read file from filesystem here
+ return true;
+ }
+
+ bool demo_http_server::on_request_api_1(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res)
+ {
+ CHECK_AND_ASSERT_MES(req.sub == demo::get_test_data(), false, "wrong request");
+ res.m_success = true;
+ res.subs.push_back(req.sub);
+ return true;
+ }
+
+ bool demo_http_server::on_request_api_1_with_error(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, epee::json_rpc::error& error_resp)
+ {
+ error_resp.code = 232432;
+ error_resp.message = "bla bla bla";
+ return false;
+ }
+
+ bool demo_http_server::on_request_api_2(const COMMAND_EXAMPLE_2::request& req, COMMAND_EXAMPLE_2::response& res)
+ {
+ return true;
+ }
+}
diff --git a/contrib/epee/demo/demo_http_server/demo_http_server.h b/contrib/epee/demo/demo_http_server/demo_http_server.h
new file mode 100644
index 000000000..bb8f9bffa
--- /dev/null
+++ b/contrib/epee/demo/demo_http_server/demo_http_server.h
@@ -0,0 +1,101 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+
+#pragma once
+#include <boost/thread.hpp>
+#include <boost/bind.hpp>
+
+#include "net/http_server_cp2.h"
+#include "transport_defs.h"
+#include "net/http_server_handlers_map2.h"
+
+using namespace epee;
+
+namespace demo
+{
+
+ class demo_http_server: public net_utils::http::i_http_server_handler
+ {
+ public:
+ demo_http_server():m_stop(false){}
+ bool run();
+ bool init(const std::string& bind_port = "11112", const std::string& bind_ip = "0.0.0.0");
+ bool deinit();
+ bool send_stop_signal();
+ bool is_stop(){return m_stop;}
+ bool wait_stop(){return m_net_server.timed_wait_server_stop(100000);}
+ private:
+
+
+ CHAIN_HTTP_TO_MAP2(); //forward http requests to uri map
+
+ BEGIN_URI_MAP2()
+ MAP_URI2("/requestr_uri_1", on_requestr_uri_1)
+ MAP_URI2("/requestr_uri_2", on_requestr_uri_1)
+ //MAP_URI_AUTO_XML2("/request_api_xml_1", on_request_api_1, COMMAND_EXAMPLE_1)
+ //MAP_URI_AUTO_XML2("/request_api_xml_2", on_request_api_2, COMMAND_EXAMPLE_2)
+ MAP_URI_AUTO_JON2("/request_api_json_1", on_request_api_1, COMMAND_EXAMPLE_1)
+ MAP_URI_AUTO_JON2("/request_api_json_2", on_request_api_2, COMMAND_EXAMPLE_2)
+ MAP_URI_AUTO_BIN2("/request_api_bin_1", on_request_api_1, COMMAND_EXAMPLE_1)
+ MAP_URI_AUTO_BIN2("/request_api_bin_2", on_request_api_2, COMMAND_EXAMPLE_2)
+ BEGIN_JSON_RPC_MAP("/request_json_rpc")
+ MAP_JON_RPC("command_example_1", on_request_api_1, COMMAND_EXAMPLE_1)
+ MAP_JON_RPC("command_example_2", on_request_api_2, COMMAND_EXAMPLE_2)
+ MAP_JON_RPC_WE("command_example_1_we", on_request_api_1_with_error, COMMAND_EXAMPLE_1)
+ END_JSON_RPC_MAP()
+ CHAIN_URI_MAP2(on_hosting_request)
+ END_URI_MAP2()
+
+
+
+ bool on_requestr_uri_1(const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context);
+
+
+ bool on_requestr_uri_2(const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context);
+
+
+
+
+ bool on_hosting_request( const net_utils::http::http_request_info& query_info,
+ net_utils::http::http_response_info& response,
+ const net_utils::connection_context_base& m_conn_context);
+
+ bool on_request_api_1(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res);
+ bool on_request_api_2(const COMMAND_EXAMPLE_2::request& req, COMMAND_EXAMPLE_2::response& res);
+
+ bool on_request_api_1_with_error(const COMMAND_EXAMPLE_1::request& req, COMMAND_EXAMPLE_1::response& res, epee::json_rpc::error& error_resp);
+
+ net_utils::boosted_http_server_custum_handling m_net_server;
+ std::atomic<bool> m_stop;
+ };
+}
+
diff --git a/contrib/epee/demo/demo_http_server/stdafx.cpp b/contrib/epee/demo/demo_http_server/stdafx.cpp
new file mode 100644
index 000000000..ecec24657
--- /dev/null
+++ b/contrib/epee/demo/demo_http_server/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// demo_http_server.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/contrib/epee/demo/demo_http_server/stdafx.h b/contrib/epee/demo/demo_http_server/stdafx.h
new file mode 100644
index 000000000..e28883202
--- /dev/null
+++ b/contrib/epee/demo/demo_http_server/stdafx.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+#pragma once
+
+#include "targetver.h"
+
+
+#include <stdio.h>
+
+
+#define BOOST_FILESYSTEM_VERSION 3
+#define ENABLE_RELEASE_LOGGING
+#include "misc_log_ex.h"
+
+
diff --git a/contrib/epee/demo/demo_http_server/targetver.h b/contrib/epee/demo/demo_http_server/targetver.h
new file mode 100644
index 000000000..6fe8eb79e
--- /dev/null
+++ b/contrib/epee/demo/demo_http_server/targetver.h
@@ -0,0 +1,13 @@
+#pragma once
+
+// The following macros define the minimum required platform. The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
+// your application. The macros work by enabling all features available on platform versions up to and
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
+#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
+#endif
+