From 1ad06afe9f952642a26f4d28239cf05eb3283eb7 Mon Sep 17 00:00:00 2001 From: Mauro Sardara Date: Tue, 19 Mar 2019 14:26:52 +0100 Subject: [HICN-6] ATS Working, little refactoring of apps Change-Id: I174815b70bf3a9fbe99ffab7dd2914be04d364b9 Signed-off-by: Mauro Sardara --- apps/http-proxy/src/ATSConnector.h | 99 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/http-proxy/src/ATSConnector.h (limited to 'apps/http-proxy/src/ATSConnector.h') diff --git a/apps/http-proxy/src/ATSConnector.h b/apps/http-proxy/src/ATSConnector.h new file mode 100644 index 000000000..be5c2c8d5 --- /dev/null +++ b/apps/http-proxy/src/ATSConnector.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 Cisco and/or its affiliates. + * Licensed 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. + */ + +#pragma once + +#include + +#define ASIO_STANDALONE +#include +#include +#include + +namespace transport { + +using asio::ip::tcp; + +typedef std::function + ContentReceivedCallback; +typedef std::function OnReconnect; +typedef std::function ContentSentCallback; +typedef std::deque< + std::pair, ContentSentCallback>> + BufferQueue; + +class ATSConnector { + static constexpr uint32_t buffer_size = 1024 * 64; + + enum class ConnectorState { + CLOSED, + CONNECTING, + CONNECTED, + }; + + public: + ATSConnector(asio::io_service &io_service, std::string &ip_address, + std::string &port, ContentReceivedCallback receive_callback, + OnReconnect on_reconnect_callback); + + ~ATSConnector(); + + void send(const uint8_t *buffer, std::size_t len, + ContentSentCallback &&content_sent = 0); + + void send(utils::MemBuf *buffer, ContentSentCallback &&content_sent); + + void close(); + + private: + void doConnect(); + + void doReadHeader(); + + void doReadBody(std::size_t size); + + void doWrite(); + + bool checkConnected(); + + private: + void handleRead(std::error_code ec, std::size_t length, std::size_t bytes); + void tryReconnection(); + void startConnectionTimer(); + void handleDeadline(const std::error_code &ec); + + asio::io_service &io_service_; + asio::ip::tcp::socket socket_; + asio::ip::tcp::resolver resolver_; + asio::ip::tcp::resolver::iterator endpoint_iterator_; + asio::steady_timer timer_; + + BufferQueue write_msgs_; + + asio::streambuf header_input_buffer_; + uint8_t input_buffer_[buffer_size]; + + bool is_reconnection_; + bool data_available_; + + ContentReceivedCallback receive_callback_; + OnReconnect on_reconnect_callback_; + + // Connector state + ConnectorState state_; +}; + +} // namespace transport -- cgit 1.2.3-korg