I use the following versions of the libraries: libpion-dev 5.0.6 libboost-all-dev 1.58.0 In the Internet found a simple example of an asynchronous HTTP-server, but it falls in the processing of requests for which the handler is described. In addition, for non-existent resources correctly returns 404 response.
Server code:I use the following versions of the libraries: libpion-dev 5.0.6 libboost-all-dev 1.58.0 In the Internet found a simple example of an asynchronous HTTP-server, but it falls in the processing of requests for which the handler is described. In addition, for non-existent resources correctly returns 404 response.
Server code:
#include <boost/bind/arg.hpp>
#include <boost/bind/bind.hpp>
#include <boost/bind/placeholders.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <pion/http/parser.hpp>
#include <pion/http/request.hpp>
#include <pion/http/response_writer.hpp>
#include <pion/http/server.hpp>
#include <pion/tcp/connection.hpp>
#include <unistd.h>
struct fake_server {
void start() {
m_server = pion::http::server_ptr(new pion::http::server(8080));
m_server->add_resource("/test", boost::bind(&fake_server::handle_request, this, _1, _2));
m_server->start();
}
void handle_request(pion::http::request_ptr& _httpRequest, pion::tcp::connection_ptr& _tcpConn) {
pion::http::response_writer_ptr writer(
pion::http::response_writer::create(
_tcpConn,
*_httpRequest,
boost::bind(&pion::tcp::connection::finish, _tcpConn)));
pion::http::response& r = writer->get_response();
writer->write("hello world");
writer->send();
}
pion::http::server_ptr m_server;
};
int main() {
fake_server svr;
svr.start();
for(;;) sleep(86400);
}
Stack of threas, which was crashed:
Thread #9 [TEST_pion] 16903 [core: 0] (Suspended : Signal : SIGSEGV:Segmentation fault)
boost::asio::detail::reactive_socket_service_base::start_op() at reactive_socket_service_base.ipp:219 0x412918
boost::asio::detail::reactive_socket_service_base::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at reactive_socket_service_base.hpp:216 0x41a79e
boost::asio::stream_socket_service<boost::asio::ip::tcp>::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at stream_socket_service.hpp:330 0x41a79e
boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::async_write_some<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at basic_stream_socket.hpp:732 0x41a79e
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> >::operator() at write.hpp:181 0x41a79e
boost::asio::async_write<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long>&>() at write.hpp:621 0x41acc6
pion::tcp::connection::async_write<std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long> >() at connection.hpp:567 0x41ca4c
pion::http::writer::send_more_data<boost::function2<void, boost::system::error_code const&, unsigned long> >() at writer.hpp:277 0x41ca4c
pion::http::writer::send() at writer.hpp:167 0x41cf8f
fake_server::handle_request() at TEST_pion.cpp:28 0x41cf8f
boost::function2<void, boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&>::operator()(boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&) const at 0x7ffff6e8a5c9
pion::http::server::handle_request() at 0x7ffff6e8516b
boost::function3<void, boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&>::operator()(boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&) const at 0x7ffff6e8a25c
pion::http::request_reader::finished_reading() at 0x7ffff6e8a3bb
pion::http::reader::consume_bytes() at 0x7ffff6e830ec
pion::http::reader::consume_bytes() at 0x7ffff6e8374d
boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::_bi::bind_t<void, boost::_mfi::mf2<void, pion::http::reader, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<boost::shared_ptr<pion::http::request_reader> >, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete at 0x7ffff6e8810b
boost::asio::detail::epoll_reactor::descriptor_state::do_complete() at 0x7ffff6e55a84
pion::scheduler::process_service_work() at 0x7ffff6e41de1
0x7ffff7bc3bc5
start_thread() at pthread_create.c:333 0x7ffff5d446aa
clone() at clone.S:109 0x7ffff6269e9d
In this example, the request http://127.0.0.1:8080/none returns 404 without crash, and http://127.0.0.1:8080/test make crash. I can not understand, what is the reason and how to do it right. Library haven't documentation, maybe something not taken into account. Please help.
I'm not an expert in the pion library. However, the reason why the request to /none
returns 404 without crashing is because it's being handled by the pion
library NOT by the handle_request
function.
There is an example of using the pion library here. It may help you discover what's going wrong in the handle_request
function.