| 6450 | } |
| 6451 | |
| 6452 | inline bool |
| 6453 | Server::process_request(Stream &strm, bool close_connection, |
| 6454 | bool &connection_closed, |
| 6455 | const std::function<void(Request &)> &setup_request) { |
| 6456 | std::array<char, 2048> buf{}; |
| 6457 | |
| 6458 | detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); |
| 6459 | |
| 6460 | // Connection has been closed on client |
| 6461 | if (!line_reader.getline()) { return false; } |
| 6462 | |
| 6463 | Request req; |
| 6464 | |
| 6465 | Response res; |
| 6466 | res.version = "HTTP/1.1"; |
| 6467 | res.headers = default_headers_; |
| 6468 | |
| 6469 | #ifdef _WIN32 |
| 6470 | // TODO: Increase FD_SETSIZE statically (libzmq), dynamically (MySQL). |
| 6471 | #else |
| 6472 | #ifndef CPPHTTPLIB_USE_POLL |
| 6473 | // Socket file descriptor exceeded FD_SETSIZE... |
| 6474 | if (strm.socket() >= FD_SETSIZE) { |
| 6475 | Headers dummy; |
| 6476 | detail::read_headers(strm, dummy); |
| 6477 | res.status = 500; |
| 6478 | return write_response(strm, close_connection, req, res); |
| 6479 | } |
| 6480 | #endif |
| 6481 | #endif |
| 6482 | |
| 6483 | // Check if the request URI doesn't exceed the limit |
| 6484 | if (line_reader.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { |
| 6485 | Headers dummy; |
| 6486 | detail::read_headers(strm, dummy); |
| 6487 | res.status = 414; |
| 6488 | return write_response(strm, close_connection, req, res); |
| 6489 | } |
| 6490 | |
| 6491 | // Request line and headers |
| 6492 | if (!parse_request_line(line_reader.ptr(), req) || |
| 6493 | !detail::read_headers(strm, req.headers)) { |
| 6494 | res.status = 400; |
| 6495 | return write_response(strm, close_connection, req, res); |
| 6496 | } |
| 6497 | |
| 6498 | if (req.get_header_value("Connection") == "close") { |
| 6499 | connection_closed = true; |
| 6500 | } |
| 6501 | |
| 6502 | if (req.version == "HTTP/1.0" && |
| 6503 | req.get_header_value("Connection") != "Keep-Alive") { |
| 6504 | connection_closed = true; |
| 6505 | } |
| 6506 | |
| 6507 | strm.get_remote_ip_and_port(req.remote_addr, req.remote_port); |
| 6508 | req.set_header("REMOTE_ADDR", req.remote_addr); |
| 6509 | req.set_header("REMOTE_PORT", std::to_string(req.remote_port)); |
nothing calls this directly
no test coverage detected