read() should return number of bytes actually read,

You can call conn.leastSize() to get the length and then conn.read(ubyte[]) to receive the data.

then say readBuffer() should block until buffer is filled, possibly taking timeout argument.

I would use conn.readTimeout(Duration) here to stop waiting after a certain timeout. You can have very small timeouts in the std.datetime.Duration type

3) This is high level logic already, I just want to read the data as client wrote it. And it will not work if client sends less than 150 bytes.

That's one way to do it, but if you look carefully at the libraries based on TCP/IP you'll see they all attempt to offer other, more creative ways to read/write data.

Why is this so difficult? IMHO readAll() is broken. Why would one ever possibly want a connection to close to signalize eof? It is super easy to send conn InputStream back, why is buffering this data so difficult?

I agree that readAll() doesn't do what it says. I think it was mostly meant to get the data remaining in the buffers when a connection is closed.

It seems like you're looking to make a REST service. You should take a look at the examples available in the examples directory.

Good luck finding what you need :)