Skip to content

Commit

Permalink
Template for Wrapper classes
Browse files Browse the repository at this point in the history
  • Loading branch information
omoerbeek committed Feb 11, 2025
1 parent de0d138 commit 47c9cf6
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 38 deletions.
1 change: 0 additions & 1 deletion pdns/recursordist/rec_control.cc
Original file line number Diff line number Diff line change
Expand Up @@ -449,4 +449,3 @@ int main(int argc, char** argv)
}
}
#include "rec-web-stubs.hh"

28 changes: 12 additions & 16 deletions pdns/recursordist/settings/cxxsupport.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1459,34 +1459,30 @@ bool pdns::rust::settings::rec::isValidHostname(::rust::Str str)

namespace pdns::rust::web::rec
{
NetmaskGroup::NetmaskGroup(const ::NetmaskGroup& arg) :
d_ptr(std::make_unique<::NetmaskGroup>(arg))

template <typename M>
Wrapper<M>::Wrapper(const M& arg) :
d_ptr(std::make_unique<M>(arg))
{
}
NetmaskGroup::~NetmaskGroup() = default;

template <typename M>
Wrapper<M>::~Wrapper<M>() = default;

ComboAddress::ComboAddress(const ::ComboAddress& arg) :
d_ptr(std::make_unique<::ComboAddress>(arg))
template <typename M>
[[nodiscard]] const M& Wrapper<M>::get() const
{
return *d_ptr;
}
ComboAddress::~ComboAddress() = default;

template class Wrapper<::NetmaskGroup>;
template class Wrapper<::ComboAddress>;

std::unique_ptr<ComboAddress> comboaddress(::rust::Str str)
{
return std::make_unique<ComboAddress>(::ComboAddress(std::string(str)));
}

[[nodiscard]] const ::NetmaskGroup& NetmaskGroup::get() const
{
return *d_ptr;
}

[[nodiscard]] const ::ComboAddress& ComboAddress::get() const
{
return *d_ptr;
}

bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address)
{
return nmg->get().match(address->get());
Expand Down
35 changes: 19 additions & 16 deletions pdns/recursordist/settings/rust/src/bridge.hh
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,31 @@ union ComboAddress;
namespace pdns::rust::web::rec
{
using CredentialsHolder = ::CredentialsHolder;
//using NetmaskGroup = ::NetmaskGroup;
// using NetmaskGroup = ::NetmaskGroup;
struct KeyValue;
struct Request;
struct Response;
class NetmaskGroup
{
public:
NetmaskGroup(const ::NetmaskGroup& arg);
~NetmaskGroup();
[[nodiscard]] const ::NetmaskGroup& get() const;
private:
std::unique_ptr<::NetmaskGroup> d_ptr;
};
class ComboAddress

template <typename A>
class Wrapper
{
public:
ComboAddress(const ::ComboAddress& arg);
~ComboAddress();
[[nodiscard]] const ::ComboAddress& get() const;
Wrapper(const A& arg);
~Wrapper(); // out-of-line definition, to keep A opaque

Wrapper() = delete;
Wrapper(const Wrapper&) = delete;
Wrapper(Wrapper&&) = delete;
Wrapper& operator=(const Wrapper&) = delete;
Wrapper& operator=(Wrapper&&) = delete;

[[nodiscard]] const A& get() const;

private:
std::unique_ptr<::ComboAddress> d_ptr;
std::unique_ptr<A> d_ptr;
};
using NetmaskGroup = Wrapper<::NetmaskGroup>;
using ComboAddress = Wrapper<::ComboAddress>;

void apiServer(const Request& rustRequest, Response& rustResponse);
void apiDiscovery(const Request& rustRequest, Response& rustResponse);
Expand All @@ -81,6 +84,6 @@ void apiServerSearchData(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailGET(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailPUT(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailDELETE(const Request& rustRequest, Response& rustResponse);
std::unique_ptr<pdns::rust::web::rec::ComboAddress> comboaddress(::rust::Str str);
std::unique_ptr<ComboAddress> comboaddress(::rust::Str str);
bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address);
}
3 changes: 3 additions & 0 deletions pdns/recursordist/settings/rust/src/web.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ TODO
use shared libs (in theory, I did not try). Currently all CXX using Rust cargo's must be compiled
as one and refer to a single static Rust runtime
- Ripping out yahttp stuff, providing some basic classees only
- Some classes (NetmaskGroup, ComboAddress) need a uniqueptr Wrapper to keep them opaque (iputils
cannot be included without big headages in bridge.hh at the moment). We could seperate
NetmaskGroup, but I expect ComboAddress to not work as it is union.
*/

use std::net::SocketAddr;
Expand Down
12 changes: 7 additions & 5 deletions pdns/recursordist/ws-recursor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ static void apiServerConfigACLGET(const std::string& aclType, HttpRequest* /* re
auto lock1 = g_initialAllowFrom.lock();
auto lock2 = g_initialAllowNotifyFrom.lock();
if (*lock1 && aclType == "allow-from") {
entries = (*lock1)->toStringVector();
entries = (*lock1)->toStringVector();
}
else if (*lock2 && aclType == "allow-notify-from") {
entries = (*lock2)->toStringVector();
Expand Down Expand Up @@ -894,8 +894,10 @@ void AsyncWebServer::serveConnection(const std::shared_ptr<Socket>& socket) cons
yarl.initialize(&req);
socket->setNonBlocking();

const struct timeval timeout{
g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000};
const struct timeval timeout
{
g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000
};
std::shared_ptr<TLSCtx> tlsCtx{nullptr};
if (d_loglevel > WebServer::LogLevel::None) {
socket->getRemote(remote);
Expand Down Expand Up @@ -1036,10 +1038,10 @@ static void rustWrapper(const std::function<void(HttpRequest*, HttpResponse*)>&
response.body = e.response().body;
response.status = e.response().status;
}
catch (const ApiException & e) {
catch (const ApiException& e) {
response.setErrorResult(e.what(), 422);
}
catch (const JsonException & e) {
catch (const JsonException& e) {
response.setErrorResult(e.what(), 422);
}
fromCxxToRust(response, rustResponse);
Expand Down

0 comments on commit 47c9cf6

Please sign in to comment.