[Pdns-users] [EXT] Re: remote backend
Brian Candler
b.candler at pobox.com
Thu Nov 30 10:00:03 UTC 2023
That code is incomplete and not runnable. What is "[0:netip]" for
example? More importantly, what is "c" when you do c.Write(data) ?
However, there is also an unstated question here, which is "how are the
requests and responses delimited when PowerDNS using the unixsock remote
backend?" You're just assuming that a Read() and a Write() are
sufficient to delimit messages, and that seems pretty unlikely to me.
Now, looking in the Ruby code in modules/remotebackend/unittest_pipe.rb,
it appears that the format is newline-delimited, i.e. this is JSON-Lines
<https://jsonlines.org/>.
This appears to be confirmed in modules/remotebackend/pipeconnector.cc
int PipeConnector::send_message(const Json& input)
{
auto line = input.dump();
launch();
* line.append(1, '\n');*
...
if (!stringfgets(d_fp.get(), receive)) {
throw PDNSException("Child closed pipe");
}
// stringfgets is in pdns/misc.cc, and it reads up to a newline:
do {
if(!fgets(buffer, sizeof(buffer), fp))
return !line.empty();
line.append(buffer);
* } while(!strchr(buffer, '\n'));*
return true;
So the main issue seems to be: you need to write a newline after your
JSON response. (And make sure your response *isn't* pretty-printed, and
any embedded newlines in strings are represented by "\n", so that each
JSON object is exactly one line)
Then instead of Read(1024), you need to either read up to a newline
(e.g. using bufio.Scanner or bufio.Reader) - or you need to use a
streaming JSON decoder which will use the end of each JSON object as the
delimiter, and ignores the newlines in between them. (Go's
encoding/json can quite happily do that)
HTH,
Brian.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.powerdns.com/pipermail/pdns-users/attachments/20231130/3dfbaaf3/attachment.htm>
More information about the Pdns-users
mailing list