jduo commented on code in PR #34817: URL: https://github.com/apache/arrow/pull/34817#discussion_r1370889136
########## cpp/src/arrow/flight/sql/server_session_middleware.h: ########## @@ -0,0 +1,90 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Middleware for handling Flight SQL Sessions including session cookie handling. +// Currently experimental. + +#pragma once + +#include <string_view> + +#include "arrow/flight/server_middleware.h" +#include "arrow/flight/sql/types.h" + +namespace arrow { +namespace flight { +namespace sql { + +class ServerSessionMiddlewareFactory; + +static constexpr char const kSessionCookieName[] = + "flight_sql_session_id"; + +class FlightSqlSession { + protected: + std::map<std::string, SessionOptionValue> map_; + std::shared_mutex map_lock_; + public: + /// \brief Get session option by key + SessionOptionValue GetSessionOption(const std::string_view); + /// \brief Set session option by key to given value + void SetSessionOption(const std::string_view, const SessionOptionValue&); + /// \brief Idempotently remove key from this call's Session, if Session & key exist + void EraseSessionOption(const std::string_view); +}; + +/// \brief A middleware to handle Session option persistence and related *Cookie headers. +class ARROW_FLIGHT_SQL_EXPORT ServerSessionMiddleware + : public ServerMiddleware { + public: + static constexpr char const kMiddlewareName[] = + "arrow::flight::sql::ServerSessionMiddleware"; + + std::string name() const override { return kMiddlewareName; } + void SendingHeaders(AddCallHeaders*) override; + void CallCompleted(const Status&) override; + + /// \brief Is there an existing session (either existing or new) + bool HasSession() const; + /// \brief Get existing or new call-associated session + std::shared_ptr<FlightSqlSession> GetSession(); + /// \brief Get request headers, in lieu of a provided or created session. + const CallHeaders& GetCallHeaders() const; + + protected: + friend class ServerSessionMiddlewareFactory; + ServerSessionMiddlewareFactory* factory_; + const CallHeaders& headers_; + std::shared_ptr<FlightSqlSession> session_; + std::string session_id_; + const bool existing_session; + + ServerSessionMiddleware(ServerSessionMiddlewareFactory*, + const CallHeaders&); + ServerSessionMiddleware(ServerSessionMiddlewareFactory*, + const CallHeaders&, + std::shared_ptr<FlightSqlSession>, + std::string session_id); +}; + +/// \brief Returns a ServerMiddlewareFactory that handles Session option storage. +ARROW_FLIGHT_SQL_EXPORT std::shared_ptr<ServerMiddlewareFactory> +MakeServerSessionMiddlewareFactory(); + +} // namespace sql +} // namespace flight +} // namespace arrow Review Comment: Nit: please add a newline to the end of file -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
