tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

WebrtcTCPSocket.h (3206B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set sw=2 ts=8 et tw=80 ft=cpp : */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef webrtc_tcp_socket_h__
      8 #define webrtc_tcp_socket_h__
      9 
     10 #include <list>
     11 
     12 #include "mozilla/net/WebrtcProxyConfig.h"
     13 #include "nsCOMPtr.h"
     14 #include "nsIAsyncInputStream.h"
     15 #include "nsIAsyncOutputStream.h"
     16 #include "nsIAuthPromptProvider.h"
     17 #include "nsIHttpChannelInternal.h"
     18 #include "nsIInterfaceRequestor.h"
     19 #include "nsIProtocolProxyCallback.h"
     20 #include "nsIStreamListener.h"
     21 #include "nsStringFwd.h"
     22 #include "nsTArray.h"
     23 
     24 class nsISocketTransport;
     25 
     26 namespace mozilla::net {
     27 
     28 class WebrtcTCPSocketCallback;
     29 class WebrtcTCPData;
     30 
     31 class WebrtcTCPSocket : public nsIHttpUpgradeListener,
     32                        public nsIStreamListener,
     33                        public nsIInputStreamCallback,
     34                        public nsIOutputStreamCallback,
     35                        public nsIInterfaceRequestor,
     36                        public nsIAuthPromptProvider,
     37                        public nsIProtocolProxyCallback {
     38 public:
     39  NS_DECL_NSIHTTPUPGRADELISTENER
     40  NS_DECL_NSIINPUTSTREAMCALLBACK
     41  NS_DECL_NSIINTERFACEREQUESTOR
     42  NS_DECL_NSIOUTPUTSTREAMCALLBACK
     43  NS_DECL_NSIREQUESTOBSERVER
     44  NS_DECL_NSISTREAMLISTENER
     45  NS_DECL_THREADSAFE_ISUPPORTS
     46  NS_FORWARD_SAFE_NSIAUTHPROMPTPROVIDER(mAuthProvider)
     47  NS_DECL_NSIPROTOCOLPROXYCALLBACK
     48 
     49  explicit WebrtcTCPSocket(WebrtcTCPSocketCallback* aCallbacks);
     50 
     51  void SetTabId(dom::TabId aTabId);
     52  nsresult Open(const nsACString& aHost, const int& aPort,
     53                const nsACString& aLocalAddress, const int& aLocalPort,
     54                bool aUseTls,
     55                const Maybe<net::WebrtcProxyConfig>& aProxyConfig);
     56  nsresult Write(nsTArray<uint8_t>&& aBytes);
     57  nsresult Close();
     58 
     59  size_t CountUnwrittenBytes() const;
     60 
     61 protected:
     62  virtual ~WebrtcTCPSocket();
     63 
     64  // protected for gtests
     65  virtual void InvokeOnClose(nsresult aReason);
     66  virtual void InvokeOnConnected();
     67  virtual void InvokeOnRead(nsTArray<uint8_t>&& aReadData);
     68 
     69  RefPtr<WebrtcTCPSocketCallback> mProxyCallbacks;
     70 
     71 private:
     72  bool mClosed;
     73  bool mOpened;
     74  nsCOMPtr<nsIURI> mURI;
     75  bool mTls = false;
     76  Maybe<WebrtcProxyConfig> mProxyConfig;
     77  nsCString mLocalAddress;
     78  uint16_t mLocalPort = 0;
     79  nsCString mProxyType;
     80 
     81  nsresult DoProxyConfigLookup();
     82  nsresult OpenWithHttpProxy();
     83  void OpenWithoutHttpProxy(nsIProxyInfo* aSocksProxyInfo);
     84  void FinishOpen();
     85  void EnqueueWrite_s(nsTArray<uint8_t>&& aWriteData);
     86 
     87  void CloseWithReason(nsresult aReason);
     88 
     89  size_t mWriteOffset;
     90  std::list<WebrtcTCPData> mWriteQueue;
     91  nsCOMPtr<nsIAuthPromptProvider> mAuthProvider;
     92 
     93  // Indicates that the channel is CONNECTed
     94  nsCOMPtr<nsISocketTransport> mTransport;
     95  nsCOMPtr<nsIAsyncInputStream> mSocketIn;
     96  nsCOMPtr<nsIAsyncOutputStream> mSocketOut;
     97  nsCOMPtr<nsIEventTarget> mMainThread;
     98  nsCOMPtr<nsIEventTarget> mSocketThread;
     99  nsCOMPtr<nsICancelable> mProxyRequest;
    100 };
    101 
    102 }  // namespace mozilla::net
    103 
    104 #endif  // webrtc_tcp_socket_h__