1 //
2 // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 #pragma once
8 
9 #include "td/actor/actor.h"
10 
11 #include "td/utils/BufferedFd.h"
12 #include "td/utils/common.h"
13 #include "td/utils/logging.h"
14 #include "td/utils/port/IPAddress.h"
15 #include "td/utils/port/SocketFd.h"
16 #include "td/utils/Status.h"
17 
18 namespace td {
19 
20 extern int VERBOSITY_NAME(proxy);
21 
22 class TransparentProxy : public Actor {
23  public:
24   class Callback {
25    public:
26     Callback() = default;
27     Callback(const Callback &) = delete;
28     Callback &operator=(const Callback &) = delete;
29     virtual ~Callback() = default;
30 
31     virtual void set_result(Result<BufferedFd<SocketFd>> r_buffered_socket_fd) = 0;
32     virtual void on_connected() = 0;
33   };
34 
35   TransparentProxy(SocketFd socket_fd, IPAddress ip_address, string username, string password,
36                    unique_ptr<Callback> callback, ActorShared<> parent);
37 
38  protected:
39   BufferedFd<SocketFd> fd_;
40   IPAddress ip_address_;
41   string username_;
42   string password_;
43   unique_ptr<Callback> callback_;
44   ActorShared<> parent_;
45 
46   void on_error(Status status);
47   void tear_down() override;
48   void start_up() override;
49   void hangup() override;
50 
51   void loop() override;
52   void timeout_expired() override;
53 
54   virtual Status loop_impl() = 0;
55 };
56 
57 }  // namespace td
58