class LuaFFIResponseAction: public DNSResponseAction
{
public:
- typedef std::function<int(dnsdist_ffi_dnsquestion_t* dq)> func_t;
+ typedef std::function<int(dnsdist_ffi_dnsresponse_t* dq)> func_t;
LuaFFIResponseAction(const LuaFFIResponseAction::func_t& func): d_func(func)
{
DNSResponseAction::Action operator()(DNSResponse* dr, std::string* ruleresult) const override
{
- DNSQuestion* dq = dynamic_cast<DNSQuestion*>(dr);
- if (dq == nullptr) {
- return DNSResponseAction::Action::ServFail;
- }
-
- dnsdist_ffi_dnsquestion_t dqffi(dq);
+ dnsdist_ffi_dnsresponse_t drffi(dr);
try {
auto lock = g_lua.lock();
- auto ret = d_func(&dqffi);
+ auto ret = d_func(&drffi);
if (ruleresult) {
- if (dqffi.result) {
- *ruleresult = *dqffi.result;
+ if (drffi.result) {
+ *ruleresult = *drffi.result;
}
else {
// default to empty string
class LuaFFIPerThreadResponseAction: public DNSResponseAction
{
public:
- typedef std::function<int(dnsdist_ffi_dnsquestion_t* dq)> func_t;
+ typedef std::function<int(dnsdist_ffi_dnsresponse_t* dr)> func_t;
LuaFFIPerThreadResponseAction(const std::string& code): d_functionCode(code), d_functionID(s_functionsCounter++)
{
DNSResponseAction::Action operator()(DNSResponse* dr, std::string* ruleresult) const override
{
- DNSQuestion* dq = dynamic_cast<DNSQuestion*>(dr);
- if (dq == nullptr) {
- return DNSResponseAction::Action::ServFail;
- }
-
try {
auto& state = t_perThreadStates[d_functionID];
if (!state.d_initialized) {
return DNSResponseAction::Action::None;
}
- dnsdist_ffi_dnsquestion_t dqffi(dq);
- auto ret = state.d_func(&dqffi);
+ dnsdist_ffi_dnsresponse_t drffi(dr);
+ auto ret = state.d_func(&drffi);
if (ruleresult) {
- if (dqffi.result) {
- *ruleresult = *dqffi.result;
+ if (drffi.result) {
+ *ruleresult = *drffi.result;
}
else {
// default to empty string
boost::optional<std::string> httpScheme{boost::none};
};
+// dnsdist_ffi_dnsresponse_t is a lightuserdata
+template<>
+struct LuaContext::Pusher<dnsdist_ffi_dnsresponse_t*> {
+ static const int minSize = 1;
+ static const int maxSize = 1;
+
+ static PushedObject push(lua_State* state, dnsdist_ffi_dnsresponse_t* ptr) noexcept {
+ lua_pushlightuserdata(state, ptr);
+ return PushedObject{state, 1};
+ }
+};
+
struct dnsdist_ffi_dnsresponse_t
{
dnsdist_ffi_dnsresponse_t(DNSResponse* dr_): dr(dr_)
}
DNSResponse* dr{nullptr};
+ boost::optional<std::string> result{boost::none};
};
// dnsdist_ffi_server_t is a lightuserdata