WIP interface design

fb-http
Claudius Holeksa 2022-04-26 11:35:31 +02:00
parent ecb3045562
commit 416deb89a7
2 changed files with 47 additions and 17 deletions

View File

@ -2,16 +2,47 @@
#include <string_view>
namespace saw {
HttpNetwork::HttpNetwork(Network& internal_):
internal{&internal_}{}
#include <cassert>
Own<HttpNetworkAddress> HttpNetwork::parseAddress(const std::string& addr){
namespace saw {
HttpNetwork::HttpNetwork(Network& network):
internal{&network}{}
Own<HttpServer> HttpNetwork::listen(NetworkAddress& address){
assert(internal);
auto eov = internal->listen(address);
/// @todo unimplemented
return nullptr;
}
Conveyor<Own<HttpNetworkAddress>> HttpNetwork::resolveAddress(const std::string& addr){
std::string_view view{addr};
namespace {
struct HttpClientStreamHelper {
Own<ConveyorFeeder<Own<HttpStream>>
Own<IoStream> stream = nullptr;
};
}
Conveyor<Own<HttpStream>> HttpNetwork::connect(NetworkAddress& address){
assert(internal);
Own<HttpClientStreamHelper> helper = heap<HttpClientStreamHelper>();
// Create a type of break point
helper->sink = internal->connect(address).then([help_ptr = helper.get()](Own<IoStream> stream) -> ErrorOr<void> {
assert(stream);
help_ptr->stream = std::move(stream);
return;
}).sink();
auto caf = newConveyorAndFeeder<Own<HttpStream>>();
helper->feeder = std::move(caf.feeder);
return caf.conveyor.attach(std::move(helper));
}
}

View File

@ -49,20 +49,12 @@ public:
Conveyor<Own<HttpStream>> accept();
};
class HttpNetworkAddress {
private:
Own<NetworkAddress> network_address;
public:
Own<HttpServer> listen();
Conveyor<Own<HttpStream>> connect();
};
class HttpNetwork {
public:
HttpNetwork(Network& network);
Own<HttpNetworkAddress> parseAddress(const std::string& addr);
Conveyor<Own<HttpNetworkAddress>> resolveAddress(const std::string& addr);
Own<HttpServer> listen(NetworkAddress& address);
Conveyor<Own<HttpStream>> connect(NetworkAddress& address);
private:
Network* internal;
};
@ -80,11 +72,18 @@ class HttpResponse {
*/
class HttpRequest {
public:
HttpRequest(Own<ConveyorFeeder>
Conveyor<HttpResponse> response();
private:
Own<ConveyorFeeder<HttpResponse>> feeder;
};
class HttpClient {
Own<HttpRequest> request(Http::Method::Variant method, const std::string& url);
public:
Own<HttpRequest> request(Http::Method::Variant method, const HttpNetworkAddress& address);
};
}