I wasn't going insane, but I did have a copy pasta problem..
I grabbed a reply string from a C example, including \n, I switched to sLineBreak and with WriteAnsiString() the browser now shows data with no error.
So I'm guessing that with Write() I have to add the first byte manually, it "disappeared" because it was treated as a size marker.
WriteAnsiString() worked fine, so I should have just used linebreaks properly, and the "extra" character is the size marker but it shows up as an ascii character with the CURL output.
On to the next challenge!
Thanks guys