#pragma once #if !defined(MIJIN_NET_HTTP_HPP_INCLUDED) #define MIJIN_NET_HTTP_HPP_INCLUDED 1 #include #include #include #include "./socket.hpp" #include "./url.hpp" #include "../container/boxed_object.hpp" #include "../container/typeless_buffer.hpp" #include "../internal/common.hpp" #include "../io/stream.hpp" namespace mijin { namespace http_method { inline const std::string GET = "GET"; inline const std::string POST = "POST"; inline const std::string HEAD = "HEAD"; inline const std::string PUT = "PUT"; inline const std::string DELETE = "DELETE"; } struct HTTPVersion { unsigned major; unsigned minor; }; struct HTTPRequest { HTTPVersion version = {1, 1}; std::string address; std::string method = "GET"; std::multimap headers; std::string body; }; struct HTTPRequestOptions { std::string method = "GET"; std::multimap headers; BaseTypelessBuffer body; }; struct HTTPResponse { HTTPVersion version; unsigned status; std::string statusMessage; std::multimap headers; BaseTypelessBuffer body; }; class HTTPStream { private: Stream* base_; public: HTTPStream(Stream& base) MIJIN_NOEXCEPT : base_(&base) { MIJIN_ASSERT(base_ != nullptr, "Invalid parameter for base."); } Task> c_request(HTTPRequest request) MIJIN_NOEXCEPT; private: Task c_writeRequest(const HTTPRequest& request) MIJIN_NOEXCEPT; Task> c_readResponse() MIJIN_NOEXCEPT; }; class HTTPClient { private: std::unique_ptr socket_; std::unique_ptr sslStream_; mijin::BoxedObject stream_; ip_address_t lastIP_; std::uint16_t lastPort_ = 0; bool lastWasHttps_ = false; public: ~HTTPClient() MIJIN_NOEXCEPT { disconnect(); } Task> c_request(ip_address_t address, std::uint16_t port, bool https, HTTPRequest request) MIJIN_NOEXCEPT; Task> c_request(const URL& url, HTTPRequest request = {}) MIJIN_NOEXCEPT; void disconnect() MIJIN_NOEXCEPT; private: StreamError createSocket(ip_address_t address, const std::string& hostname, std::uint16_t port, bool https) MIJIN_NOEXCEPT; }; } #endif // !defined(MIJIN_NET_HTTP_HPP_INCLUDED)