blob: 9245f5e176efccd7c3706d61e95b12e0497efe51 (
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
81
82
83
84
85
86
87
88
89
90
91
|
#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\r\nHost: keldu.de\r\nConnection: close\r\n\r\n"};
auto write_res = tls_io->write(&get_req[0], get_req.size());
std::cout<<"Sending\n";
std::cout<<"=======\n";
std::cout<<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<err::invalid_state>("Never managed to connect");
}
bool running = true;
tls_io->on_read_disconnected().then([&running](){
running = false;
}).detach();
std::cout<<"Received\n";
std::cout<<"========\n";
while(running){
auto eo_read_res = tls_io->read(&buff.write(), buff.write_segment_length());
if(eo_read_res.is_error()){
auto& err = eo_read_res.get_error();
if(err.is_critical()){
std::cerr<<":("<<std::endl;
return std::move(err);
}
continue;
}
auto& read_res_val = eo_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);
}
wait.wait();
}
std::cout<<std::endl;
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;
}
|