| 3649 | |
| 3650 | template <typename T> |
| 3651 | bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, |
| 3652 | Progress progress, ContentReceiverWithProgress receiver, |
| 3653 | bool decompress) { |
| 3654 | return prepare_content_receiver( |
| 3655 | x, status, std::move(receiver), decompress, |
| 3656 | [&](const ContentReceiverWithProgress &out) { |
| 3657 | auto ret = true; |
| 3658 | auto exceed_payload_max_length = false; |
| 3659 | |
| 3660 | if (is_chunked_transfer_encoding(x.headers)) { |
| 3661 | ret = read_content_chunked(strm, x, out); |
| 3662 | } else if (!has_header(x.headers, "Content-Length")) { |
| 3663 | ret = read_content_without_length(strm, out); |
| 3664 | } else { |
| 3665 | auto len = get_header_value<uint64_t>(x.headers, "Content-Length"); |
| 3666 | if (len > payload_max_length) { |
| 3667 | exceed_payload_max_length = true; |
| 3668 | skip_content_with_length(strm, len); |
| 3669 | ret = false; |
| 3670 | } else if (len > 0) { |
| 3671 | ret = read_content_with_length(strm, len, std::move(progress), out); |
| 3672 | } |
| 3673 | } |
| 3674 | |
| 3675 | if (!ret) { status = exceed_payload_max_length ? 413 : 400; } |
| 3676 | return ret; |
| 3677 | }); |
| 3678 | } // namespace detail |
| 3679 | |
| 3680 | inline ssize_t write_headers(Stream &strm, const Headers &headers) { |
| 3681 | ssize_t write_len = 0; |
no test coverage detected