fix in message handler

* return error message if request decode fails
* simplify streaming-loop
* fix bugs in read_callback
- it must read the requested size of data
- it must not update `bytes_left`