There's one newline between each header, but two newlines after the last one, so you can read until you find a double-newline. (Note that newlines here are actually two characters: an \r followed by an \n.)
This would work for your particular example, but there are various ways this is insufficient in general:
The server might respond with a compressed response, in which case you would need to decompress it. The headers tell you whether the response is compressed.
The server might respond using a chuncked encoding if it doesn't know the Content-Length up front. In this case, getting the raw contents is quite difficult.
Handling all of these details is why we have 3rd party libs for this
You need to read those headers, line by line, to figure out what the response is, it could be an error, and how big the payload actually is. Then read those payload bytes.
All in all it would be much easier to use a crate that already does all that for you. For example reqwest - Rust. Unless you really want to get into all the details of HTTP for educational reasons. Do you?