Code Monkey home page Code Monkey logo

micro's Introduction

micro

micro is a network-programming framework written with modern C++17. The application is made out of the following components:

  • microloop, which is the low-level component creating the event-loop and a basic implementation of a TCP server,
  • microhttp, which allows users to easily create an HTTP server, and
  • utils, which is a utility library with various components.

The project uses Google's Abseil for some of its utility components, and Bazel as build system. Google Test comes in play when writing unit tests.

The framework can (currently) only be compiled on Linux.

micro's People

Contributors

alexgrusu avatar barbu110 avatar slak44 avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

Forkers

alexgrusu

micro's Issues

Fix buffer copy constructor memory issues

At commit 481ddde, the RequestParser test file creates some memory issues:

{
std::vector<microloop::Buffer> chunks = {
"POST /foo HTTP/1.1\r\n",
"Content-Length: 7\r\n\r\n",
"example",
};
HttpRequest expected_request{"post", "/foo"};
expected_request.set_header("Content-Length", "7");
expected_request.get_body() = microloop::Buffer{"example"}
RequestTestProvider test{"chunked POST request, with body", chunks, true, expected_request};
tests.push_back(test);
}

The Valgrind output for test execution is:

➜  micro git:(master) ✗ valgrind --leak-check=full bazel-bin/lib/microhttp/tests/request_parser
==79827== Memcheck, a memory error detector
==79827== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==79827== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==79827== Command: bazel-bin/lib/microhttp/tests/request_parser
==79827==
Running main() from gmock_main.cc
==79827== Invalid read of size 2
==79827==    at 0x483F9D8: memmove (vg_replace_strmem.c:1270)
==79827==    by 0x119D10: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:66)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x122D55: void std::_Construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (stl_construct.h:75)
==79827==    by 0x1227E5: microhttp::http::RequestTestProvider* std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:83)
==79827==    by 0x1221DD: microhttp::http::RequestTestProvider* std::uninitialized_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:134)
==79827==    by 0x121AC3: microhttp::http::RequestTestProvider* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:289)
==79827==    by 0x120D5D: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_range_initialize<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::forward_iterator_tag) (stl_vector.h:1582)
==79827==    by 0x11FD3C: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::vector<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, void>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::allocator<microhttp::http::RequestTestProvider> const&) (stl_vector.h:654)
==79827==    by 0x11E661: testing::internal::ValuesInIteratorRangeGenerator<microhttp::http::RequestTestProvider>::ValuesInIteratorRangeGenerator<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-util.h:293)
==79827==    by 0x11CD10: testing::internal::ParamGenerator<testing::internal::IteratorTraits<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >::value_type> testing::ValuesIn<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-test.h:308)
==79827==  Address 0x4fba430 is 0 bytes inside a block of size 7 free'd
==79827==    at 0x48399AB: free (vg_replace_malloc.c:530)
==79827==    by 0x119D3D: microloop::Buffer::~Buffer() (buffer.h:81)
==79827==    by 0x11A0CB: microhttp::http::HttpRequest::~HttpRequest() (http_request.h:20)
==79827==    by 0x11A29D: microhttp::http::RequestTestProvider::~RequestTestProvider() (request_parser_test.cpp:20)
==79827==    by 0x11F4A5: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::destroy<microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*) (new_allocator.h:153)
==79827==    by 0x11DD5C: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::destroy<microhttp::http::RequestTestProvider>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*) (alloc_traits.h:497)
==79827==    by 0x121D0B: void std::__relocate_object_a<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:895)
==79827==    by 0x121392: microhttp::http::RequestTestProvider* std::__relocate_a_1<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:932)
==79827==    by 0x1204CD: microhttp::http::RequestTestProvider* std::__relocate_a<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:946)
==79827==    by 0x11F487: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_do_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&, std::integral_constant<bool, true>) (stl_vector.h:453)
==79827==    by 0x11DD28: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_vector.h:466)
==79827==    by 0x11C4D7: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_realloc_insert<microhttp::http::RequestTestProvider const&>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider const&) (vector.tcc:461)
==79827==  Block was alloc'd at
==79827==    at 0x483AB65: calloc (vg_replace_malloc.c:752)
==79827==    by 0x119CE3: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:65)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x11DB40: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (new_allocator.h:147)
==79827==    by 0x11C399: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (alloc_traits.h:484)
==79827==    by 0x11B12B: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::push_back(microhttp::http::RequestTestProvider const&) (stl_vector.h:1189)
==79827==    by 0x11816D: microhttp::http::request_parser_provider() (request_parser_test.cpp:86)
==79827==    by 0x11939E: microhttp::http::gtest_HttpRequestParserTest_EvalGenerator_() (request_parser_test.cpp:134)
==79827==    by 0x123A7E: testing::internal::ParameterizedTestCaseInfo<microhttp::http::RequestParserTest>::RegisterTests() (gtest-param-util.h:548)
==79827==    by 0x4C6823E: testing::internal::ParameterizedTestCaseRegistry::RegisterTests() (gtest-param-util.h:705)
==79827==    by 0x4C5994B: testing::internal::UnitTestImpl::RegisterParameterizedTests() (gtest.cc:2667)
==79827==
==79827== Invalid read of size 2
==79827==    at 0x483F9E7: memmove (vg_replace_strmem.c:1270)
==79827==    by 0x119D10: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:66)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x122D55: void std::_Construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (stl_construct.h:75)
==79827==    by 0x1227E5: microhttp::http::RequestTestProvider* std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:83)
==79827==    by 0x1221DD: microhttp::http::RequestTestProvider* std::uninitialized_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:134)
==79827==    by 0x121AC3: microhttp::http::RequestTestProvider* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:289)
==79827==    by 0x120D5D: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_range_initialize<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::forward_iterator_tag) (stl_vector.h:1582)
==79827==    by 0x11FD3C: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::vector<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, void>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::allocator<microhttp::http::RequestTestProvider> const&) (stl_vector.h:654)
==79827==    by 0x11E661: testing::internal::ValuesInIteratorRangeGenerator<microhttp::http::RequestTestProvider>::ValuesInIteratorRangeGenerator<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-util.h:293)
==79827==    by 0x11CD10: testing::internal::ParamGenerator<testing::internal::IteratorTraits<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >::value_type> testing::ValuesIn<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-test.h:308)
==79827==  Address 0x4fba434 is 4 bytes inside a block of size 7 free'd
==79827==    at 0x48399AB: free (vg_replace_malloc.c:530)
==79827==    by 0x119D3D: microloop::Buffer::~Buffer() (buffer.h:81)
==79827==    by 0x11A0CB: microhttp::http::HttpRequest::~HttpRequest() (http_request.h:20)
==79827==    by 0x11A29D: microhttp::http::RequestTestProvider::~RequestTestProvider() (request_parser_test.cpp:20)
==79827==    by 0x11F4A5: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::destroy<microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*) (new_allocator.h:153)
==79827==    by 0x11DD5C: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::destroy<microhttp::http::RequestTestProvider>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*) (alloc_traits.h:497)
==79827==    by 0x121D0B: void std::__relocate_object_a<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:895)
==79827==    by 0x121392: microhttp::http::RequestTestProvider* std::__relocate_a_1<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:932)
==79827==    by 0x1204CD: microhttp::http::RequestTestProvider* std::__relocate_a<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:946)
==79827==    by 0x11F487: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_do_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&, std::integral_constant<bool, true>) (stl_vector.h:453)
==79827==    by 0x11DD28: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_vector.h:466)
==79827==    by 0x11C4D7: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_realloc_insert<microhttp::http::RequestTestProvider const&>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider const&) (vector.tcc:461)
==79827==  Block was alloc'd at
==79827==    at 0x483AB65: calloc (vg_replace_malloc.c:752)
==79827==    by 0x119CE3: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:65)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x11DB40: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (new_allocator.h:147)
==79827==    by 0x11C399: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (alloc_traits.h:484)
==79827==    by 0x11B12B: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::push_back(microhttp::http::RequestTestProvider const&) (stl_vector.h:1189)
==79827==    by 0x11816D: microhttp::http::request_parser_provider() (request_parser_test.cpp:86)
==79827==    by 0x11939E: microhttp::http::gtest_HttpRequestParserTest_EvalGenerator_() (request_parser_test.cpp:134)
==79827==    by 0x123A7E: testing::internal::ParameterizedTestCaseInfo<microhttp::http::RequestParserTest>::RegisterTests() (gtest-param-util.h:548)
==79827==    by 0x4C6823E: testing::internal::ParameterizedTestCaseRegistry::RegisterTests() (gtest-param-util.h:705)
==79827==    by 0x4C5994B: testing::internal::UnitTestImpl::RegisterParameterizedTests() (gtest.cc:2667)
==79827==
==79827== Invalid read of size 1
==79827==    at 0x483FA10: memmove (vg_replace_strmem.c:1270)
==79827==    by 0x119D10: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:66)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x122D55: void std::_Construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (stl_construct.h:75)
==79827==    by 0x1227E5: microhttp::http::RequestTestProvider* std::__uninitialized_copy<false>::__uninit_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:83)
==79827==    by 0x1221DD: microhttp::http::RequestTestProvider* std::uninitialized_copy<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*) (stl_uninitialized.h:134)
==79827==    by 0x121AC3: microhttp::http::RequestTestProvider* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:289)
==79827==    by 0x120D5D: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_range_initialize<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::forward_iterator_tag) (stl_vector.h:1582)
==79827==    by 0x11FD3C: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::vector<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, void>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, std::allocator<microhttp::http::RequestTestProvider> const&) (stl_vector.h:654)
==79827==    by 0x11E661: testing::internal::ValuesInIteratorRangeGenerator<microhttp::http::RequestTestProvider>::ValuesInIteratorRangeGenerator<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-util.h:293)
==79827==    by 0x11CD10: testing::internal::ParamGenerator<testing::internal::IteratorTraits<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >::value_type> testing::ValuesIn<__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > > >(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, __gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider const*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >) (gtest-param-test.h:308)
==79827==  Address 0x4fba436 is 6 bytes inside a block of size 7 free'd
==79827==    at 0x48399AB: free (vg_replace_malloc.c:530)
==79827==    by 0x119D3D: microloop::Buffer::~Buffer() (buffer.h:81)
==79827==    by 0x11A0CB: microhttp::http::HttpRequest::~HttpRequest() (http_request.h:20)
==79827==    by 0x11A29D: microhttp::http::RequestTestProvider::~RequestTestProvider() (request_parser_test.cpp:20)
==79827==    by 0x11F4A5: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::destroy<microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*) (new_allocator.h:153)
==79827==    by 0x11DD5C: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::destroy<microhttp::http::RequestTestProvider>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*) (alloc_traits.h:497)
==79827==    by 0x121D0B: void std::__relocate_object_a<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:895)
==79827==    by 0x121392: microhttp::http::RequestTestProvider* std::__relocate_a_1<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:932)
==79827==    by 0x1204CD: microhttp::http::RequestTestProvider* std::__relocate_a<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:946)
==79827==    by 0x11F487: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_do_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&, std::integral_constant<bool, true>) (stl_vector.h:453)
==79827==    by 0x11DD28: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_vector.h:466)
==79827==    by 0x11C4D7: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_realloc_insert<microhttp::http::RequestTestProvider const&>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider const&) (vector.tcc:461)
==79827==  Block was alloc'd at
==79827==    at 0x483AB65: calloc (vg_replace_malloc.c:752)
==79827==    by 0x119CE3: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:65)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x11DB40: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (new_allocator.h:147)
==79827==    by 0x11C399: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (alloc_traits.h:484)
==79827==    by 0x11B12B: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::push_back(microhttp::http::RequestTestProvider const&) (stl_vector.h:1189)
==79827==    by 0x11816D: microhttp::http::request_parser_provider() (request_parser_test.cpp:86)
==79827==    by 0x11939E: microhttp::http::gtest_HttpRequestParserTest_EvalGenerator_() (request_parser_test.cpp:134)
==79827==    by 0x123A7E: testing::internal::ParameterizedTestCaseInfo<microhttp::http::RequestParserTest>::RegisterTests() (gtest-param-util.h:548)
==79827==    by 0x4C6823E: testing::internal::ParameterizedTestCaseRegistry::RegisterTests() (gtest-param-util.h:705)
==79827==    by 0x4C5994B: testing::internal::UnitTestImpl::RegisterParameterizedTests() (gtest.cc:2667)
==79827==
==79827== Invalid free() / delete / delete[] / realloc()
==79827==    at 0x48399AB: free (vg_replace_malloc.c:530)
==79827==    by 0x119D3D: microloop::Buffer::~Buffer() (buffer.h:81)
==79827==    by 0x11A0CB: microhttp::http::HttpRequest::~HttpRequest() (http_request.h:20)
==79827==    by 0x11A29D: microhttp::http::RequestTestProvider::~RequestTestProvider() (request_parser_test.cpp:20)
==79827==    by 0x120215: void std::_Destroy<microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*) (stl_construct.h:98)
==79827==    by 0x11F029: void std::_Destroy_aux<false>::__destroy<microhttp::http::RequestTestProvider*>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*) (stl_construct.h:108)
==79827==    by 0x11D6F1: void std::_Destroy<microhttp::http::RequestTestProvider*>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*) (stl_construct.h:137)
==79827==    by 0x11BFC2: void std::_Destroy<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_construct.h:206)
==79827==    by 0x11AE64: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::~vector() (stl_vector.h:677)
==79827==    by 0x1193BE: microhttp::http::gtest_HttpRequestParserTest_EvalGenerator_() (request_parser_test.cpp:134)
==79827==    by 0x123A7E: testing::internal::ParameterizedTestCaseInfo<microhttp::http::RequestParserTest>::RegisterTests() (gtest-param-util.h:548)
==79827==    by 0x4C6823E: testing::internal::ParameterizedTestCaseRegistry::RegisterTests() (gtest-param-util.h:705)
==79827==  Address 0x4fba430 is 0 bytes inside a block of size 7 free'd
==79827==    at 0x48399AB: free (vg_replace_malloc.c:530)
==79827==    by 0x119D3D: microloop::Buffer::~Buffer() (buffer.h:81)
==79827==    by 0x11A0CB: microhttp::http::HttpRequest::~HttpRequest() (http_request.h:20)
==79827==    by 0x11A29D: microhttp::http::RequestTestProvider::~RequestTestProvider() (request_parser_test.cpp:20)
==79827==    by 0x11F4A5: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::destroy<microhttp::http::RequestTestProvider>(microhttp::http::RequestTestProvider*) (new_allocator.h:153)
==79827==    by 0x11DD5C: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::destroy<microhttp::http::RequestTestProvider>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*) (alloc_traits.h:497)
==79827==    by 0x121D0B: void std::__relocate_object_a<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:895)
==79827==    by 0x121392: microhttp::http::RequestTestProvider* std::__relocate_a_1<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:932)
==79827==    by 0x1204CD: microhttp::http::RequestTestProvider* std::__relocate_a<microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider> >(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_uninitialized.h:946)
==79827==    by 0x11F487: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_do_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&, std::integral_constant<bool, true>) (stl_vector.h:453)
==79827==    by 0x11DD28: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_S_relocate(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider*, std::allocator<microhttp::http::RequestTestProvider>&) (stl_vector.h:466)
==79827==    by 0x11C4D7: void std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::_M_realloc_insert<microhttp::http::RequestTestProvider const&>(__gnu_cxx::__normal_iterator<microhttp::http::RequestTestProvider*, std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> > >, microhttp::http::RequestTestProvider const&) (vector.tcc:461)
==79827==  Block was alloc'd at
==79827==    at 0x483AB65: calloc (vg_replace_malloc.c:752)
==79827==    by 0x119CE3: microloop::Buffer::Buffer(microloop::Buffer const&) (buffer.h:65)
==79827==    by 0x11A244: microhttp::http::HttpRequest::HttpRequest(microhttp::http::HttpRequest const&) (http_request.h:20)
==79827==    by 0x11DAC0: microhttp::http::RequestTestProvider::RequestTestProvider(microhttp::http::RequestTestProvider const&) (request_parser_test.cpp:20)
==79827==    by 0x11DB40: void __gnu_cxx::new_allocator<microhttp::http::RequestTestProvider>::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (new_allocator.h:147)
==79827==    by 0x11C399: void std::allocator_traits<std::allocator<microhttp::http::RequestTestProvider> >::construct<microhttp::http::RequestTestProvider, microhttp::http::RequestTestProvider const&>(std::allocator<microhttp::http::RequestTestProvider>&, microhttp::http::RequestTestProvider*, microhttp::http::RequestTestProvider const&) (alloc_traits.h:484)
==79827==    by 0x11B12B: std::vector<microhttp::http::RequestTestProvider, std::allocator<microhttp::http::RequestTestProvider> >::push_back(microhttp::http::RequestTestProvider const&) (stl_vector.h:1189)
==79827==    by 0x11816D: microhttp::http::request_parser_provider() (request_parser_test.cpp:86)
==79827==    by 0x11939E: microhttp::http::gtest_HttpRequestParserTest_EvalGenerator_() (request_parser_test.cpp:134)
==79827==    by 0x123A7E: testing::internal::ParameterizedTestCaseInfo<microhttp::http::RequestParserTest>::RegisterTests() (gtest-param-util.h:548)
==79827==    by 0x4C6823E: testing::internal::ParameterizedTestCaseRegistry::RegisterTests() (gtest-param-util.h:705)
==79827==    by 0x4C5994B: testing::internal::UnitTestImpl::RegisterParameterizedTests() (gtest.cc:2667)
==79827==
[==========] Running 5 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 5 tests from Http/RequestParserTest
[ RUN      ] Http/RequestParserTest.ParseRequest/0
[       OK ] Http/RequestParserTest.ParseRequest/0 (41 ms)
[ RUN      ] Http/RequestParserTest.ParseRequest/1
[       OK ] Http/RequestParserTest.ParseRequest/1 (1 ms)
[ RUN      ] Http/RequestParserTest.ParseRequest/2
[       OK ] Http/RequestParserTest.ParseRequest/2 (8 ms)
[ RUN      ] Http/RequestParserTest.ParseRequest/3
[       OK ] Http/RequestParserTest.ParseRequest/3 (9 ms)
[ RUN      ] Http/RequestParserTest.ParseRequest/4
[       OK ] Http/RequestParserTest.ParseRequest/4 (1 ms)
[----------] 5 tests from Http/RequestParserTest (67 ms total)

[----------] Global test environment tear-down
[==========] 5 tests from 1 test case ran. (94 ms total)
[  PASSED  ] 5 tests.
==79827==
==79827== HEAP SUMMARY:
==79827==     in use at exit: 0 bytes in 0 blocks
==79827==   total heap usage: 586 allocs, 587 frees, 137,981 bytes allocated
==79827==
==79827== All heap blocks were freed -- no leaks are possible
==79827==
==79827== For counts of detected and suppressed errors, rerun with: -v
==79827== ERROR SUMMARY: 5 errors from 4 contexts (suppressed: 0 from 0)

Extend the support for TimerController

TimerController should come with more utilities for controlling a timer or retrieving information about it.

The following functions should be included in its definition:

/* change the value of the timer for its next expiration */
void set_value(std::chrono::nanoseconds);

/* get the elapsed time since the timer has been created */
std::chrono::nanoseconds get_elapsed_time() const noexcept;

Depends on #16, #19.

Implement a mechanism to allow the process to exit when signal is caught

Currently, callbacks registered through EventLoop::register_signal_handler can successfully handle a caught signal, but none of them can decide when the process can exit.

The signature for the SignalsMonitor::SignalHandler should be changed from void(std::uint32_t) to bool(std::uint32_t).

The handler should return true when the process is considered ready to finish from the perspective of that module, and false otherwise.

When all the handlers return true, the process can be shut down.

Add a "str()" method to Buffer

Buffer should be convertible to an std::string:

  • if the buffer is empty(), then an empty string should be returned
  • otherwise, a string with the data should be returned

[microloop] Duplicate resource cleanup in EventLoop

Steps to reproduce:

  1. Create a TcpServer instance
  2. On connection, this TCP server instance should add the client to a set of known peer connections.
  3. The on_data handler should call conn.close() on the peer connection when the peer-socket-closed scenario happens
  4. Connect a client
  5. Exit the client
  6. Exit the server via SIGINT.

The message:

[... event_loop.h:83] Cannot close FD 6: Bad file descriptor

shold appear.

Ambiguous assignment operator for microloop::Buffer operands

Compilation results in:


/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/tuple:434:17: error: use of overloaded operator '=' is ambiguous (with operand
      types 'microloop::Buffer' and 'microloop::Buffer')
        _M_head(*this) = std::forward<_Head>(_M_head(__in));
        ~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/tuple:845:34: note: in instantiation of member function
      'std::_Tuple_impl<0, microloop::Buffer>::operator=' requested here
        static_cast<_Inherited&>(*this) = std::move(__in);
                                        ^
/home/victor/dev/microloop/include/event_source.h:29:19: note: in instantiation of member function 'std::tuple<microloop::Buffer>::operator=' requested here
    return_object = std::move(obj);
                  ^
/home/victor/dev/microloop/include/event_sources/net/receive.h:74:5: note: in instantiation of member function
      'microloop::TypeHelper<microloop::Buffer>::set_return_object' requested here
    set_return_object(buf);
    ^
/home/victor/dev/microloop/include/event_sources/net/receive.h:43:7: note: in instantiation of member function
      'microloop::event_sources::net::Receive<false>::run_recv' requested here
      run_recv();
      ^
/home/victor/dev/microloop/include/event_sources/net/receive.h:23:3: note: in instantiation of member function
      'microloop::event_sources::net::Receive<false>::start' requested here
  Receive(std::uint32_t sock, Callback &&on_recv,
  ^
/home/victor/dev/microloop/include/net/tcp_server.h:153:60: note: in instantiation of member function 'microloop::event_sources::net::Receive<false>::Receive'
      requested here
    microloop::EventLoop::get_main()->add_event_source(new Receive<false>(fd, bound_on_data));
                                                           ^
/home/victor/dev/microloop/include/buffer.h:47:11: note: candidate function
  Buffer &operator=(Buffer other) noexcept
          ^
/home/victor/dev/microloop/include/buffer.h:54:11: note: candidate function
  Buffer &operator=(Buffer &&) noexcept = default;
          ^
1 error generated.

Invalid reads in EventLoop

Valgrind reports invalid read of size 4 for get_fd():

event_source->run_callback();
if (event_source->get_fd() == signals_monitor_fd_)
{
if (signals_monitor().can_exit())
{
return false;
}
}

This happens because the callbacks executed for some event source may lead to their removal from the event loop, in which case, the memory is deallocated, so invalid for reading.

A temporary fix would be to make sure the event source is still there after having run the callback, but a design change is needed for a long-term solution.

Add support for IP formatting from net::TcpServer::PeerConnection

Currently, net::TcpServer::PeerConnection stores information about the remote connection in the addr member, but offers no convenient C++ way of retrieving the IP and port of the remote socket.

The IP:Port combination should be available via a member function.

Move headers to a "microloop" subdirectory

By moving all the exposed headers to a microloop subdirectory, projects using microloop will be ablle to include the headers with the microloop prefix, for example

#include "microloop/buffer.h"

Make HTTP method case-sensitive

RFC 2616 describes the HTTP method as being case-sensitive in Section 5.1.

Currently, the code treats them as case-insensitive, since they are all stored in lowercase in HttpRequest.

Make the workers count configurable in ThreadPool

Currently, the ThreadPool is spawned with at most 4 threads as can be seen here

EventLoop::EventLoop() : thread_pool{4}

Due to the nature of EventLoop, configuration of this value can only be made at compile-time, or via an environment variable.

Implement either an environment variable, or a compile-time define, or both to allow customization of the workers count.

Implement Filesystem operations

The following filesystem operations must be supported:

[x] write + write on file descriptors
[x] read + read on file descriptors
[ ] stat
[ ] inotify interface

Advance HTTP request parser to DONE state when there is no expected body

When the HTTP request parser reads a CRLF token after parsing headers, it goes into WAITING_BODY state. Body is expected only if (1) a Content-Length header was sent, or (2) a Transfer-Encoding header has been sent.

If none of the conditions 1 and 2 is met, the parser should advance to the DONE state.

Migrate all docblock comments to backslash syntax

Currently, docblock comments throughout the project use the @ notation, for example:

/**
 * Send a buffer to the peer socket of this connection.
 * @param  buf The buffer to be sent to the peer socket.
 * @return Whether the operation succeeded or not. If only a fractino of the entire buffer is
 * sent, then the functino will report it as a failure.
 */
bool send(const microloop::Buffer &);

but a more useable syntax for C++ documentation is the backslash notation. This should be used instead.

Add a mechanism to allow interval timer cancellation

Interval timers could be used for creating a retry mechanism. As an example, see the following scenario:

  • our callback function does some operation that might fail
  • we start an interval timer with microloop::timers::set_interval with callback callback to repeat the operation every X seconds until it succeeds.

Currently the until it succeeds part cannot be satisfied by the current API because the callback has no way of stopping the timer.

Changes in the API:

  • A TimerController class should be implemented with a cancel method.
  • The Timer callback should be called with this sole argument, an instance of TimerController constructed when the Timer is constructed.

Implement HttpResponse

The HttpResponse class must be Sendable to an HttpServer client.

Various subclasses should be present, such as ones for JSON formatted responses.

Implement "add_signal_handler" method on EventLoop

The method should have the following signature:

using SignalHandler = std::function<void(std::uint32_t)>;
void EventLoop::add_signal_handler(std::uint32_t sig, SignalHandler &&handler);

And push the handler on top of a handlers stack. When a signal is received, the handlers should be executed in natural stack popping order.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.