| 5618 | } |
| 5619 | |
| 5620 | inline bool Server::read_content_core(Stream &strm, Request &req, Response &res, |
| 5621 | ContentReceiver receiver, |
| 5622 | MultipartContentHeader multipart_header, |
| 5623 | ContentReceiver multipart_receiver) { |
| 5624 | detail::MultipartFormDataParser multipart_form_data_parser; |
| 5625 | ContentReceiverWithProgress out; |
| 5626 | |
| 5627 | if (req.is_multipart_form_data()) { |
| 5628 | const auto &content_type = req.get_header_value("Content-Type"); |
| 5629 | std::string boundary; |
| 5630 | if (!detail::parse_multipart_boundary(content_type, boundary)) { |
| 5631 | res.status = 400; |
| 5632 | return false; |
| 5633 | } |
| 5634 | |
| 5635 | multipart_form_data_parser.set_boundary(std::move(boundary)); |
| 5636 | out = [&](const char *buf, size_t n, uint64_t /*off*/, uint64_t /*len*/) { |
| 5637 | /* For debug |
| 5638 | size_t pos = 0; |
| 5639 | while (pos < n) { |
| 5640 | auto read_size = (std::min)<size_t>(1, n - pos); |
| 5641 | auto ret = multipart_form_data_parser.parse( |
| 5642 | buf + pos, read_size, multipart_receiver, multipart_header); |
| 5643 | if (!ret) { return false; } |
| 5644 | pos += read_size; |
| 5645 | } |
| 5646 | return true; |
| 5647 | */ |
| 5648 | return multipart_form_data_parser.parse(buf, n, multipart_receiver, |
| 5649 | multipart_header); |
| 5650 | }; |
| 5651 | } else { |
| 5652 | out = [receiver](const char *buf, size_t n, uint64_t /*off*/, |
| 5653 | uint64_t /*len*/) { return receiver(buf, n); }; |
| 5654 | } |
| 5655 | |
| 5656 | if (req.method == "DELETE" && !req.has_header("Content-Length")) { |
| 5657 | return true; |
| 5658 | } |
| 5659 | |
| 5660 | if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, |
| 5661 | out, true)) { |
| 5662 | return false; |
| 5663 | } |
| 5664 | |
| 5665 | if (req.is_multipart_form_data()) { |
| 5666 | if (!multipart_form_data_parser.is_valid()) { |
| 5667 | res.status = 400; |
| 5668 | return false; |
| 5669 | } |
| 5670 | } |
| 5671 | |
| 5672 | return true; |
| 5673 | } |
| 5674 | |
| 5675 | inline bool Server::handle_file_request(const Request &req, Response &res, |
| 5676 | bool head) { |
nothing calls this directly
no test coverage detected