/* * Copyright 2019 ScyllaDB */ /* * This file is part of Scylla. * * Scylla is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Scylla is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Scylla. If not, see . */ #pragma once #include "alternator/executor.hh" #include #include #include #include #include "alternator/auth.hh" #include "utils/small_vector.hh" #include namespace alternator { class server { static constexpr size_t content_length_limit = 16*MB; using alternator_callback = std::function(executor&, executor::client_state&, tracing::trace_state_ptr, service_permit, rjson::value, std::unique_ptr)>; using alternator_callbacks_map = std::unordered_map; http_server _http_server; http_server _https_server; executor& _executor; key_cache _key_cache; bool _enforce_authorization; utils::small_vector, 2> _enabled_servers; gate _pending_requests; alternator_callbacks_map _callbacks; semaphore* _memory_limiter; class json_parser { static constexpr size_t yieldable_parsing_threshold = 16*KB; std::string_view _raw_document; rjson::value _parsed_document; std::exception_ptr _current_exception; semaphore _parsing_sem{1}; condition_variable _document_waiting; condition_variable _document_parsed; abort_source _as; future<> _run_parse_json_thread; public: json_parser(); future parse(std::string_view content); future<> stop(); }; json_parser _json_parser; public: server(executor& executor); future<> init(net::inet_address addr, std::optional port, std::optional https_port, std::optional creds, bool enforce_authorization, semaphore* memory_limiter); future<> stop(); private: void set_routes(seastar::httpd::routes& r); future<> verify_signature(const seastar::httpd::request& r); future handle_api_request(std::unique_ptr&& req); }; }