Github user achristianson commented on a diff in the pull request: https://github.com/apache/nifi-minifi-cpp/pull/158#discussion_r147858619 --- Diff: extensions/http-curl/sitetosite/HTTPProtocol.h --- @@ -0,0 +1,197 @@ +/** + * + * 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. + */ +#ifndef __SITE2SITE_CLIENT_PROTOCOL_H__ +#define __SITE2SITE_CLIENT_PROTOCOL_H__ + +#include <stdio.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <fcntl.h> +#include <netdb.h> +#include <string> +#include <errno.h> +#include <chrono> +#include <set> +#include <thread> +#include <algorithm> +#include <uuid/uuid.h> +#include "HTTPTransaction.h" +#include "sitetosite/SiteToSite.h" +#include "sitetosite/SiteToSiteClient.h" +#include "core/Property.h" +#include "properties/Configure.h" +#include "FlowFileRecord.h" +#include "core/logging/LoggerConfiguration.h" +#include "core/ProcessContext.h" +#include "core/ProcessSession.h" +#include "io/CRCStream.h" +#include "sitetosite/Peer.h" +#include "utils/Id.h" +#include "../client/HTTPClient.h" + + +namespace org { +namespace apache { +namespace nifi { +namespace minifi { +namespace sitetosite { + +/** + * Site2Site Peer + */ +typedef struct Site2SitePeerStatus { + std::string host_; + int port_;bool isSecure_; +} Site2SitePeerStatus; + +// HttpSiteToSiteClient Class +class HttpSiteToSiteClient : public sitetosite::SiteToSiteClient { + + static constexpr char const* PROTOCOL_VERSION_HEADER = "x-nifi-site-to-site-protocol-version"; + public: + + /*! + * Create a new http protocol + */ + HttpSiteToSiteClient(std::string name, uuid_t uuid = 0) + : SiteToSiteClient(), + current_code(UNRECOGNIZED_RESPONSE_CODE), + logger_(logging::LoggerFactory<HttpSiteToSiteClient>::getLogger()) { + peer_state_ = READY; + } + + /*! + * Create a new http protocol + */ + HttpSiteToSiteClient(std::unique_ptr<SiteToSitePeer> peer) + : SiteToSiteClient(), + current_code(UNRECOGNIZED_RESPONSE_CODE), + logger_(logging::LoggerFactory<HttpSiteToSiteClient>::getLogger()) { + peer_ = std::move(peer); + peer_state_ = READY; + } + // Destructor + virtual ~HttpSiteToSiteClient() { + + } + + void setPeer(std::unique_ptr<SiteToSitePeer> peer) { + peer_ = std::move(peer); + } + + virtual bool getPeerList(std::vector<PeerStatus> &peers); + + /** + * Establish the protocol connection. Not needed for the HTTP connection, so we simply + * return true. + */ + virtual bool establish() { + return true; + } + + virtual std::shared_ptr<Transaction> createTransaction(std::string &transactionID, TransferDirection direction); + + // Transfer flow files for the process session + //virtual bool transferFlowFiles(const std::shared_ptr<core::ProcessContext> &context, const std::shared_ptr<core::ProcessSession> &session); + //! Transfer string for the process session + virtual bool transmitPayload(const std::shared_ptr<core::ProcessContext> &context, const std::shared_ptr<core::ProcessSession> &session, const std::string &payload, + std::map<std::string, std::string> attributes); + // deleteTransaction + void deleteTransaction(std::string transactionID); + + protected: + + /** + * Closes the transaction + * @param transactionID transaction id reference. + */ + void closeTransaction(const std::string &transactionID); + + virtual int readRespond(const std::shared_ptr<Transaction> &transaction, RespondCode &code, std::string &message); + // write respond + virtual int writeRespond(const std::shared_ptr<Transaction> &transaction, RespondCode code, std::string message); + + /** + * Bootstrapping is not really required for the HTTP Site To Site so we will set the peer state and return true. + */ + virtual bool bootstrap() { + peer_state_ = READY; + return true; + } + + /** + * Creates a connection for sending, returning an HTTP client that is structured and configured + * to receive flow files. + * @param transaction transaction against which we are performing our sends + * @return HTTP Client shared pointer. + */ + std::shared_ptr<minifi::utils::HTTPClient> openConnectionForSending(const std::shared_ptr<HttpTransaction> &transaction); + + /** + * Creates a connection for receiving, returning an HTTP client that is structured and configured + * to receive flow files. + * @param transaction transaction against which we are performing our reads + * @return HTTP Client shared pointer. + */ + std::shared_ptr<minifi::utils::HTTPClient> openConnectionForReceive(const std::shared_ptr<HttpTransaction> &transaction); + + const std::string getBaseURI() { + std::string uri = "http://"; + uri.append(peer_->getHostName()); + uri.append(":"); + uri.append(std::to_string(peer_->getPort())); + uri.append("/nifi-api/"); + return uri; + } + + virtual void tearDown(); + + const std::string parseTransactionId(const std::string &uri); + + std::unique_ptr<utils::HTTPClient> create_http_client(const std::string &uri, const std::string method = "POST", bool setPropertyHeaders = false) { --- End diff -- Make method a reference?
---