| 34 | namespace cocoon { |
| 35 | |
| 36 | void TcpConnection::start_up() { |
| 37 | self_ = actor_id(this); |
| 38 | update_timer(); |
| 39 | |
| 40 | if (!type_) { |
| 41 | CHECK(socket_pipe_); |
| 42 | start(); |
| 43 | return; |
| 44 | } |
| 45 | |
| 46 | type_->type.visit(td::overloaded( |
| 47 | [&](const TcpConnectionSimple &t) { |
| 48 | auto R = td::SocketFd::open(connect_to_); |
| 49 | if (R.is_error()) { |
| 50 | fail(R.move_as_error_prefix(PSTRING() << "tcp: failed to connect to " << connect_to_ << ": ")); |
| 51 | return; |
| 52 | } |
| 53 | socket_pipe_ = td::make_socket_pipe(R.move_as_ok()); |
| 54 | start(); |
| 55 | }, |
| 56 | [&](const TcpConnectionSocks5 &t) { |
| 57 | auto R = td::SocketFd::open(t.connect_via); |
| 58 | if (R.is_error()) { |
| 59 | fail(R.move_as_error_prefix(PSTRING() << "tcp: failed to connect to " << t.connect_via << ": ")); |
| 60 | return; |
| 61 | } |
| 62 | td::connect( |
| 63 | [self = actor_id(this), connect_to = connect_to_](td::Result<td::BufferedFd<td::SocketFd>> R) { |
| 64 | if (R.is_ok()) { |
| 65 | td::actor::send_closure(self, &TcpConnection::socks5_connected, R.move_as_ok()); |
| 66 | } else { |
| 67 | td::actor::send_closure( |
| 68 | self, &TcpConnection::fail, |
| 69 | R.move_as_error_prefix(PSTRING() << "tcp: failed to connect to " << connect_to << " via socks5: ")); |
| 70 | } |
| 71 | }, |
| 72 | socks5(R.move_as_ok(), connect_to_, "", "")); |
| 73 | }, |
| 74 | [&](const TcpConnectionTls &t) { |
| 75 | auto R = td::SocketFd::open(connect_to_); |
| 76 | if (R.is_error()) { |
| 77 | fail(R.move_as_error_prefix(PSTRING() << "tcp: failed to connect to " << connect_to_ << ": ")); |
| 78 | return; |
| 79 | } |
| 80 | auto pipe = td::make_socket_pipe(R.move_as_ok()); |
| 81 | td::connect( |
| 82 | [self = actor_id(this)](td::Result<td::SocketPipe> R) { |
| 83 | if (R.is_ok()) { |
| 84 | td::actor::send_closure(self, &TcpConnection::tls_solved_pow, R.move_as_ok()); |
| 85 | } else { |
| 86 | td::actor::send_closure(self, &TcpConnection::fail, |
| 87 | R.move_as_error_prefix("tcp: failed to solve pow: ")); |
| 88 | } |
| 89 | }, |
| 90 | pow::solve_pow_client(std::move(pipe), 28)); |
| 91 | })); |
| 92 | } |
| 93 |
nothing calls this directly
no test coverage detected