Consider this script:
#!/bin/bash
test() {
    local x='a';
    echo 'b' | {
        read x;
        echo "x (should be 'b'): ${x}"
    }
    echo "x (should be 'b'): ${x}";
}
test
As you can see, x is initialized to 'a' and then within the block it's set to 'b' as that is what's piped to the block. After the block, the value of x is still 'a' rather than the expected 'b'. What's missing here?
Note: this is a simple reproduction, in reality this is used to gather the response and status code from a curl command, e.g.:
curl --write-out '\n%{http_code}' ... | {
    read responseBody;
    read responseCode;
}
# use ${responseBody} and ${responseCode} here...
(It's intended for use in testing where the response body is either empty or a single line.)
