123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #ifndef RTC_BASE_SOCKET_ADAPTERS_H_
- #define RTC_BASE_SOCKET_ADAPTERS_H_
- #include <string>
- #include "api/array_view.h"
- #include "rtc_base/async_socket.h"
- #include "rtc_base/constructor_magic.h"
- #include "rtc_base/crypt_string.h"
- namespace rtc {
- struct HttpAuthContext;
- class ByteBufferReader;
- class ByteBufferWriter;
- class BufferedReadAdapter : public AsyncSocketAdapter {
- public:
- BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
- ~BufferedReadAdapter() override;
- int Send(const void* pv, size_t cb) override;
- int Recv(void* pv, size_t cb, int64_t* timestamp) override;
- protected:
- int DirectSend(const void* pv, size_t cb) {
- return AsyncSocketAdapter::Send(pv, cb);
- }
- void BufferInput(bool on = true);
- virtual void ProcessInput(char* data, size_t* len) = 0;
- void OnReadEvent(AsyncSocket* socket) override;
- private:
- char* buffer_;
- size_t buffer_size_, data_len_;
- bool buffering_;
- RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter);
- };
- class AsyncSSLSocket : public BufferedReadAdapter {
- public:
- static ArrayView<const uint8_t> SslClientHello();
- static ArrayView<const uint8_t> SslServerHello();
- explicit AsyncSSLSocket(AsyncSocket* socket);
- int Connect(const SocketAddress& addr) override;
- protected:
- void OnConnectEvent(AsyncSocket* socket) override;
- void ProcessInput(char* data, size_t* len) override;
- RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket);
- };
- class AsyncHttpsProxySocket : public BufferedReadAdapter {
- public:
- AsyncHttpsProxySocket(AsyncSocket* socket,
- const std::string& user_agent,
- const SocketAddress& proxy,
- const std::string& username,
- const CryptString& password);
- ~AsyncHttpsProxySocket() override;
-
-
-
- void SetForceConnect(bool force) { force_connect_ = force; }
- int Connect(const SocketAddress& addr) override;
- SocketAddress GetRemoteAddress() const override;
- int Close() override;
- ConnState GetState() const override;
- protected:
- void OnConnectEvent(AsyncSocket* socket) override;
- void OnCloseEvent(AsyncSocket* socket, int err) override;
- void ProcessInput(char* data, size_t* len) override;
- bool ShouldIssueConnect() const;
- void SendRequest();
- void ProcessLine(char* data, size_t len);
- void EndResponse();
- void Error(int error);
- private:
- SocketAddress proxy_, dest_;
- std::string agent_, user_, headers_;
- CryptString pass_;
- bool force_connect_;
- size_t content_length_;
- int defer_error_;
- bool expect_close_;
- enum ProxyState {
- PS_INIT,
- PS_LEADER,
- PS_AUTHENTICATE,
- PS_SKIP_HEADERS,
- PS_ERROR_HEADERS,
- PS_TUNNEL_HEADERS,
- PS_SKIP_BODY,
- PS_TUNNEL,
- PS_WAIT_CLOSE,
- PS_ERROR
- } state_;
- HttpAuthContext* context_;
- std::string unknown_mechanisms_;
- RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxySocket);
- };
- class AsyncSocksProxySocket : public BufferedReadAdapter {
- public:
- AsyncSocksProxySocket(AsyncSocket* socket,
- const SocketAddress& proxy,
- const std::string& username,
- const CryptString& password);
- ~AsyncSocksProxySocket() override;
- int Connect(const SocketAddress& addr) override;
- SocketAddress GetRemoteAddress() const override;
- int Close() override;
- ConnState GetState() const override;
- protected:
- void OnConnectEvent(AsyncSocket* socket) override;
- void ProcessInput(char* data, size_t* len) override;
- void SendHello();
- void SendConnect();
- void SendAuth();
- void Error(int error);
- private:
- enum State { SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR };
- State state_;
- SocketAddress proxy_, dest_;
- std::string user_;
- CryptString pass_;
- RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxySocket);
- };
- }
- #endif
|