<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">Yes, i wrote it fast in the playground as an example, didn't verified if it was completely ok (sorry about that), it was only to graph the idea.<div><br></div><div>I’ll try what you suggested right now. Thanks!</div><div><br></div><div> <br id="lineBreakAtBeginningOfMessage"><div><br><blockquote type="cite"><div>On 30 Nov 2023, at 07:00, Brian Candler <b.candler@pobox.com> wrote:</div><br class="Apple-interchange-newline"><div>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div>
<div class="moz-cite-prefix">That code is incomplete and not
runnable. What is "[0:netip]" for example? More importantly, what
is "c" when you do c.Write(data) ?<br>
</div><p>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.<br>
</p><p>Now, looking in the Ruby code in
modules/remotebackend/unittest_pipe.rb, it appears that the format
is newline-delimited, i.e. this is <a href="https://jsonlines.org/">JSON-Lines</a>.</p><p>This appears to be confirmed in
modules/remotebackend/pipeconnector.cc<font face="monospace"><br>
</font></p><p><font face="monospace">int PipeConnector::send_message(const
Json& input)<br>
{<br>
auto line = input.dump();<br>
launch();<br>
<br>
<b> line.append(1, '\n');</b></font></p><p><font face="monospace">...<br>
</font></p><p><font face="monospace"> if (!stringfgets(d_fp.get(), receive))
{<br>
throw PDNSException("Child closed pipe");<br>
}</font></p><p><font face="monospace">// stringfgets is in pdns/misc.cc, and it
reads up to a newline:</font></p><p><font face="monospace"> do {<br>
if(!fgets(buffer, sizeof(buffer), fp))<br>
return !line.empty();<br>
<br>
line.append(buffer);<br>
<b> } while(!strchr(buffer, '\n'));</b><br>
return true;</font></p><p>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)</p><p>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)<br>
</p><p>HTH,</p><p>Brian.<br>
</p>
</div>
</div></blockquote></div><br></div></body></html>