Backed out 2 changesets (bug 1816628) for causing OS X mochitests-plain failures...
[gecko.git] / netwerk / base / ProxyAutoConfig.h
blobe01450eadda9abed0c796089c8ac55c4235b3b4c
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
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
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef ProxyAutoConfig_h__
8 #define ProxyAutoConfig_h__
10 #include <functional>
11 #include "nsString.h"
12 #include "nsCOMPtr.h"
13 #include "nsTArray.h"
15 class nsIEventTarget;
16 class nsITimer;
17 class nsIThread;
18 namespace JS {
19 class CallArgs;
20 } // namespace JS
22 namespace mozilla {
23 namespace net {
25 class JSContextWrapper;
26 class ProxyAutoConfigParent;
27 union NetAddr;
29 class ProxyAutoConfigBase {
30 public:
31 virtual ~ProxyAutoConfigBase() = default;
32 virtual nsresult Init(nsIThread* aPACThread) { return NS_OK; }
33 virtual nsresult ConfigurePAC(const nsACString& aPACURI,
34 const nsACString& aPACScriptData,
35 bool aIncludePath, uint32_t aExtraHeapSize,
36 nsISerialEventTarget* aEventTarget) = 0;
37 virtual void SetThreadLocalIndex(uint32_t index) {}
38 virtual void Shutdown() = 0;
39 virtual void GC() = 0;
40 virtual void GetProxyForURIWithCallback(
41 const nsACString& aTestURI, const nsACString& aTestHost,
42 std::function<void(nsresult aStatus, const nsACString& aResult)>&&
43 aCallback) = 0;
46 // The ProxyAutoConfig class is meant to be created and run on a
47 // non main thread. It synchronously resolves PAC files by blocking that
48 // thread and running nested event loops. GetProxyForURI is not re-entrant.
50 class ProxyAutoConfig : public ProxyAutoConfigBase {
51 public:
52 ProxyAutoConfig();
53 virtual ~ProxyAutoConfig();
55 nsresult ConfigurePAC(const nsACString& aPACURI,
56 const nsACString& aPACScriptData, bool aIncludePath,
57 uint32_t aExtraHeapSize,
58 nsISerialEventTarget* aEventTarget) override;
59 void SetThreadLocalIndex(uint32_t index) override;
60 void Shutdown() override;
61 void GC() override;
62 bool MyIPAddress(const JS::CallArgs& aArgs);
63 bool ResolveAddress(const nsACString& aHostName, NetAddr* aNetAddr,
64 unsigned int aTimeout);
66 /**
67 * Get the proxy string for the specified URI. The proxy string is
68 * given by the following:
70 * result = proxy-spec *( proxy-sep proxy-spec )
71 * proxy-spec = direct-type | proxy-type LWS proxy-host [":" proxy-port]
72 * direct-type = "DIRECT"
73 * proxy-type = "PROXY" | "HTTP" | "HTTPS" | "SOCKS" | "SOCKS4" | "SOCKS5"
74 * proxy-sep = ";" LWS
75 * proxy-host = hostname | ipv4-address-literal
76 * proxy-port = <any 16-bit unsigned integer>
77 * LWS = *( SP | HT )
78 * SP = <US-ASCII SP, space (32)>
79 * HT = <US-ASCII HT, horizontal-tab (9)>
81 * NOTE: direct-type and proxy-type are case insensitive
82 * NOTE: SOCKS implies SOCKS4
84 * Examples:
85 * "PROXY proxy1.foo.com:8080; PROXY proxy2.foo.com:8080; DIRECT"
86 * "SOCKS socksproxy"
87 * "DIRECT"
89 * XXX add support for IPv6 address literals.
90 * XXX quote whatever the official standard is for PAC.
92 * @param aTestURI
93 * The URI as an ASCII string to test.
94 * @param aTestHost
95 * The ASCII hostname to test.
97 * @param result
98 * result string as defined above.
100 nsresult GetProxyForURI(const nsACString& aTestURI,
101 const nsACString& aTestHost, nsACString& result);
103 void GetProxyForURIWithCallback(
104 const nsACString& aTestURI, const nsACString& aTestHost,
105 std::function<void(nsresult aStatus, const nsACString& aResult)>&&
106 aCallback) override;
108 private:
109 // allow 665ms for myipaddress dns queries. That's 95th percentile.
110 const static unsigned int kTimeout = 665;
112 // used to compile the PAC file and setup the execution context
113 nsresult SetupJS();
115 bool SrcAddress(const NetAddr* remoteAddress, nsCString& localAddress);
116 bool MyIPAddressTryHost(const nsACString& hostName, unsigned int timeout,
117 const JS::CallArgs& aArgs, bool* aResult);
119 JSContextWrapper* mJSContext{nullptr};
120 bool mJSNeedsSetup{false};
121 bool mShutdown{true};
122 nsCString mConcatenatedPACData;
123 nsCString mPACURI;
124 bool mIncludePath{false};
125 uint32_t mExtraHeapSize{0};
126 nsCString mRunningHost;
127 nsCOMPtr<nsITimer> mTimer;
128 nsCOMPtr<nsISerialEventTarget> mMainThreadEventTarget;
131 class RemoteProxyAutoConfig : public ProxyAutoConfigBase {
132 public:
133 RemoteProxyAutoConfig();
134 virtual ~RemoteProxyAutoConfig();
136 nsresult Init(nsIThread* aPACThread) override;
137 nsresult ConfigurePAC(const nsACString& aPACURI,
138 const nsACString& aPACScriptData, bool aIncludePath,
139 uint32_t aExtraHeapSize,
140 nsISerialEventTarget* aEventTarget) override;
141 void Shutdown() override;
142 void GC() override;
143 void GetProxyForURIWithCallback(
144 const nsACString& aTestURI, const nsACString& aTestHost,
145 std::function<void(nsresult aStatus, const nsACString& aResult)>&&
146 aCallback) override;
148 private:
149 RefPtr<ProxyAutoConfigParent> mProxyAutoConfigParent;
152 } // namespace net
153 } // namespace mozilla
155 #endif // ProxyAutoConfig_h__