int handle_connection()

in net/http/server.cpp [108:159]


    int handle_connection(net::ISocketStream* sock) override {
        m_workers++;
        DEFER(m_workers--);
        SockItem sock_item(sock);
        {
            SCOPED_LOCK(m_connection_list_lock);
            m_connection_list.push_back(&sock_item);
        }
        DEFER({
            SCOPED_LOCK(m_connection_list_lock);
            m_connection_list.erase(&sock_item);
        });

        char req_buf[64*1024];
        char resp_buf[64*1024];
        Request req(req_buf, 64*1024-1);
        Response resp(resp_buf, 64*1024-1);

        while (status == Status::running) {
            req.reset(sock, false);

            auto rec_ret = req.receive_header();
            if (rec_ret < 0) {
                LOG_ERROR_RETURN(0, -1, "read request header failed");
            }
            if (rec_ret == 1) {
                LOG_DEBUG("exit");
                return -1;
            }

            LOG_DEBUG("Request Accepted", VALUE(req.verb()), VALUE(req.target()), VALUE(req.headers["Authorization"]));

            resp.reset(sock, false);
            resp.keep_alive(req.keep_alive());

            auto ret = mux_handler(req, resp);
            if (ret < 0) {
                LOG_ERROR_RETURN(0, -1, "handler error ",  VALUE(req.verb()), VALUE(req.target()));
            }

            if (resp.send() < 0) {
                LOG_ERROR_RETURN(0, -1, "failed to send");
            }

            if (!resp.keep_alive())
                break;

            if (req.skip_remain() < 0)
                break;
        }
        return 0;
    }