I was having some very weird errors when I was testing out TT-RSS API. One of the methods just would not work and server reported HTTP/500 error. I figured out that the error is only there, if I use non-ASCII characters in my POST data.
My curl one-line to call the API was something like:
curl -H "Content-Type: application/json; charset=utf-8" -d '{"op":"shareToPublished","title":"ččč","url":"https://aaa.cz","content":"aaa","sid":"XXX"}' 'https://TT_RSS_SERVER/api/'
I was thinking that, OK, I have charset=utf-8 in my Content-Type and that’s it, curl should encode input data correctly, right? At least, that was what some clever people suggested on StackOverflow.
Well, then I decided to see what is actually sent with --trace option and that clearly showed, that č characters are encoded as e8 (HEX) which is not what I would expect.
I subsequently checked my command line “encoding” with locale command and that was OK, I had cs_CZ.UTF-8 there. It seems, that for some reason, curl was encoding my data as windows-1250, not UTF-8.
Therefore I tried to do the encoding stuff by myself with great iconv tool, resulting in this:
curl -H "Content-Type: application/json; charset=utf-8" --data "$(echo -n '{"op":"shareToPublished","title":"ččč","url":"https://aaa.cz","content":"aaa","sid":"XXX"}' | iconv -f windows-1250 -t utf-8)" 'https://TT_RSS_SERVER/api/'
And, this worked! So, at least I finally learned how to actually send real UTF-8 POST requests.