Hi Ben,
The actual protocol framing on error is:
{partial result} \00 \01 {error message} \00
Both bytes are present: all results end with a single \00 byte, which indicates
that the process was successful. If an error occurs, an additional byte \01 is
sent, which is then followed by the error message string.
The worked example in the docs makes this concrete [1]: For the query 1, 2+'3',
the server sends the partial result "1" terminated with \00, then \01 followed
by the error text “Stopped at...”, and finally a closing \00 that terminates
the error string itself.
The success terminator \00 is always sent; \01 is an additional indicator after
it, followed by a \00-terminated error message.
What this means for your implementation:
• Read until \00: that's the (possibly partial) result.
• Don't treat \01 as the end marker; it appears after the \00.
• Peek the next byte. If it's \00, success. If it’s \01, read until the next
\00 to get the error message.
In your current code, treating “ends with \01” as the error signal will work
for detection only if you’re reading the whole stream as one blob, but you’ll
lose the error message itself and misframe the result boundary. The fix is to
consume the error string after the \01.
Cheers
Christian
[1] https://docs.basex.org/main/Server_Protocol#example
________________________________
Von: Ben Engbers via BaseX-Talk <[email protected]>
Gesendet: Mittwoch, April 29, 2026 12:45:42 AM
An: Basex Mail-lijst <[email protected]>
Betreff: [basex-talk] Error handling according to the server protocol
Hi,
I am currently busy writing C wrapper functions around the public
functions from my libBasexCpp library (see
https://github.com/BenEngbers/libBasexCpp). In doing so, I discovered an
imperfection in that library and an ambiguity in the server protocol.
The description of the command protocol states that in the event of an
error, the server response consists of {partial result} {error} \01.
However, at the bottom of the description of the Query protocol, it is
stated that the server response ends with a \01, followed by an error
string.
In the current implementation, I assumed that all successfully executed
requests end with a \00 and that a \01 at the end means an error has
occurred.
My question is whether this assumption is correct or whether I need to
adjust my implementation so that the \01 is followed by the error message?
Ben