summaryrefslogtreecommitdiff
path: root/modules/io-tls/examples/tls_client.cpp
blob: d01e2bf10fb48cdf3c7796d285c57d5e68a21344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "../c++/tls.hpp"

#include <iostream>

#include <forstio/buffer.hpp>

saw::error_or<void> real_main(){
	using namespace saw;
	auto eo_aio = setup_async_io();
	if(eo_aio.is_error()){
		return std::move(eo_aio.get_error());
	}
	auto& aio = eo_aio.get_value();
	wait_scope wait{aio.event_loop};

	auto eo_tls_net = setup_tls_network(aio.io->get_network());
	if(eo_tls_net.is_error()){
		return std::move(eo_tls_net.get_error());
	}
	auto& tls_net = eo_tls_net.get_value();

	auto eo_tls_addr = tls_net->resolve_address("keldu.de", 443).take();
	if(eo_tls_addr.is_error()){
		return std::move(eo_tls_addr.get_error());
	}
	auto& tls_addr = eo_tls_addr.get_value();

	ring_buffer buff{4096u * 4096u};

	own<io_stream<net::Tls<net::Os>>> tls_io = nullptr;
	
	std::cout<<"Preparing to connect"<<std::endl;
	tls_net->connect(*tls_addr).then([&](auto tls_io_str){
		tls_io = std::move(tls_io_str);
		std::cout<<"Connected"<<std::endl;
		std::string_view get_req{"GET / HTTP/1.1"};
		auto write_res = tls_io->write(&get_req[0], get_req.size());
		
		std::cout<<"Sending: "<<get_req<<std::endl;

	}).detach();

	wait.wait_for(1000u*1000u);
	wait.wait_for(1000u*1000u);
	wait.wait_for(1000u*1000u);
	if(!tls_io){
		return make_error<invalid_state>("Never managed to connect");
	}
	{
		auto read_res = tls_io->read(&buff.write(), buff.write_segment_length());
		if(read_res.is_error()){
			std::cerr<<":("<<std::endl;
			return;
		}
		auto& read_res_val = read_res.get_value();
		buff.write_advance(read_res_val);

		for(uint64_t i = 0u; i < buff.read_segment_length(); ++i){
			std::cout<<buff.read(i);
		}
		std::cout<<std::endl;

	}
	wait.wait_for(1000u*1000u);
	wait.wait_for(1000u*1000u);
	wait.wait_for(1000u*1000u);

	return make_void();
}

int main(){
	auto eov = real_main();
	if(eov.is_error()){
		auto& err = eov.get_error();
		std::cerr<<"[Error]: "<<err.get_category()<<" - "<<err.get_message()<<std::endl;
		return err.get_id();
	}

	return 0;
}