You've already forked linux-packaging-mono
Imported Upstream version 3.12.0
Former-commit-id: cf92446697332992ec36726e78eb8703e1f259d7
This commit is contained in:
@@ -225,6 +225,14 @@ namespace System.Net
|
||||
}
|
||||
}
|
||||
|
||||
internal struct CFStreamClientContext {
|
||||
public IntPtr Version;
|
||||
public IntPtr Info;
|
||||
public IntPtr Retain;
|
||||
public IntPtr Release;
|
||||
public IntPtr CopyDescription;
|
||||
}
|
||||
|
||||
internal class CFString : CFObject
|
||||
{
|
||||
string str;
|
||||
@@ -361,6 +369,52 @@ namespace System.Net
|
||||
}
|
||||
}
|
||||
|
||||
internal class CFRunLoop : CFObject
|
||||
{
|
||||
[DllImport (CFObject.CoreFoundationLibrary)]
|
||||
static extern void CFRunLoopAddSource (IntPtr rl, IntPtr source, IntPtr mode);
|
||||
|
||||
[DllImport (CFObject.CoreFoundationLibrary)]
|
||||
static extern void CFRunLoopRemoveSource (IntPtr rl, IntPtr source, IntPtr mode);
|
||||
|
||||
[DllImport (CFObject.CoreFoundationLibrary)]
|
||||
static extern int CFRunLoopRunInMode (IntPtr mode, double seconds, bool returnAfterSourceHandled);
|
||||
|
||||
[DllImport (CFObject.CoreFoundationLibrary)]
|
||||
static extern IntPtr CFRunLoopGetCurrent ();
|
||||
|
||||
[DllImport (CFObject.CoreFoundationLibrary)]
|
||||
static extern void CFRunLoopStop (IntPtr rl);
|
||||
|
||||
public CFRunLoop (IntPtr handle, bool own): base (handle, own)
|
||||
{
|
||||
}
|
||||
|
||||
public static CFRunLoop CurrentRunLoop {
|
||||
get { return new CFRunLoop (CFRunLoopGetCurrent (), false); }
|
||||
}
|
||||
|
||||
public void AddSource (IntPtr source, CFString mode)
|
||||
{
|
||||
CFRunLoopAddSource (Handle, source, mode.Handle);
|
||||
}
|
||||
|
||||
public void RemoveSource (IntPtr source, CFString mode)
|
||||
{
|
||||
CFRunLoopRemoveSource (Handle, source, mode.Handle);
|
||||
}
|
||||
|
||||
public int RunInMode (CFString mode, double seconds, bool returnAfterSourceHandled)
|
||||
{
|
||||
return CFRunLoopRunInMode (mode.Handle, seconds, returnAfterSourceHandled);
|
||||
}
|
||||
|
||||
public void Stop ()
|
||||
{
|
||||
CFRunLoopStop (Handle);
|
||||
}
|
||||
}
|
||||
|
||||
internal enum CFProxyType {
|
||||
None,
|
||||
AutoConfigurationUrl,
|
||||
@@ -615,6 +669,10 @@ namespace System.Net
|
||||
// CFArrayRef CFNetworkCopyProxiesForAutoConfigurationScript (CFStringRef proxyAutoConfigurationScript, CFURLRef targetURL, CFErrorRef* error);
|
||||
extern static IntPtr CFNetworkCopyProxiesForAutoConfigurationScriptSequential (IntPtr proxyAutoConfigurationScript, IntPtr targetURL, out IntPtr error);
|
||||
|
||||
[DllImport (CFNetworkLibrary)]
|
||||
extern static IntPtr CFNetworkExecuteProxyAutoConfigurationURL (IntPtr proxyAutoConfigURL, IntPtr targetURL, CFProxyAutoConfigurationResultCallback cb, ref CFStreamClientContext clientContext);
|
||||
|
||||
|
||||
class GetProxyData : IDisposable {
|
||||
public IntPtr script;
|
||||
public IntPtr targetUri;
|
||||
@@ -737,6 +795,45 @@ namespace System.Net
|
||||
|
||||
return proxies;
|
||||
}
|
||||
|
||||
delegate void CFProxyAutoConfigurationResultCallback (IntPtr client, IntPtr proxyList, IntPtr error);
|
||||
|
||||
public static CFProxy[] ExecuteProxyAutoConfigurationURL (IntPtr proxyAutoConfigURL, Uri targetURL)
|
||||
{
|
||||
CFUrl url = CFUrl.Create (targetURL.AbsoluteUri);
|
||||
if (url == null)
|
||||
return null;
|
||||
|
||||
CFProxy[] proxies = null;
|
||||
|
||||
var runLoop = CFRunLoop.CurrentRunLoop;
|
||||
|
||||
// Callback that will be called after executing the configuration script
|
||||
CFProxyAutoConfigurationResultCallback cb = delegate (IntPtr client, IntPtr proxyList, IntPtr error) {
|
||||
if (proxyList != IntPtr.Zero) {
|
||||
var array = new CFArray (proxyList, false);
|
||||
proxies = new CFProxy [array.Count];
|
||||
for (int i = 0; i < proxies.Length; i++) {
|
||||
CFDictionary dict = new CFDictionary (array[i], false);
|
||||
proxies[i] = new CFProxy (dict);
|
||||
}
|
||||
array.Dispose ();
|
||||
}
|
||||
runLoop.Stop ();
|
||||
};
|
||||
|
||||
var clientContext = new CFStreamClientContext ();
|
||||
var loopSource = CFNetworkExecuteProxyAutoConfigurationURL (proxyAutoConfigURL, url.Handle, cb, ref clientContext);
|
||||
|
||||
// Create a private mode
|
||||
var mode = CFString.Create ("Mono.MacProxy");
|
||||
|
||||
runLoop.AddSource (loopSource, mode);
|
||||
runLoop.RunInMode (mode, double.MaxValue, false);
|
||||
runLoop.RemoveSource (loopSource, mode);
|
||||
|
||||
return proxies;
|
||||
}
|
||||
|
||||
[DllImport (CFNetworkLibrary)]
|
||||
// CFArrayRef CFNetworkCopyProxiesForURL (CFURLRef url, CFDictionaryRef proxySettings);
|
||||
@@ -859,7 +956,18 @@ namespace System.Net
|
||||
static Uri GetProxyUriFromScript (IntPtr script, Uri targetUri, out NetworkCredential credentials)
|
||||
{
|
||||
CFProxy[] proxies = CFNetwork.GetProxiesForAutoConfigurationScript (script, targetUri);
|
||||
|
||||
return SelectProxy (proxies, targetUri, out credentials);
|
||||
}
|
||||
|
||||
static Uri ExecuteProxyAutoConfigurationURL (IntPtr proxyAutoConfigURL, Uri targetUri, out NetworkCredential credentials)
|
||||
{
|
||||
CFProxy[] proxies = CFNetwork.ExecuteProxyAutoConfigurationURL (proxyAutoConfigURL, targetUri);
|
||||
return SelectProxy (proxies, targetUri, out credentials);
|
||||
}
|
||||
|
||||
|
||||
static Uri SelectProxy (CFProxy[] proxies, Uri targetUri, out NetworkCredential credentials)
|
||||
{
|
||||
if (proxies == null) {
|
||||
credentials = null;
|
||||
return targetUri;
|
||||
@@ -907,7 +1015,7 @@ namespace System.Net
|
||||
proxy = GetProxyUriFromScript (proxies[i].AutoConfigurationJavaScript, targetUri, out credentials);
|
||||
break;
|
||||
case CFProxyType.AutoConfigurationUrl:
|
||||
// unsupported proxy type (requires fetching script from remote url)
|
||||
proxy = ExecuteProxyAutoConfigurationURL (proxies[i].AutoConfigurationUrl, targetUri, out credentials);
|
||||
break;
|
||||
case CFProxyType.HTTPS:
|
||||
case CFProxyType.HTTP:
|
||||
|
@@ -369,6 +369,15 @@ namespace System.Net
|
||||
|
||||
return sp;
|
||||
}
|
||||
|
||||
internal static void CloseConnectionGroup (string connectionGroupName)
|
||||
{
|
||||
lock (servicePoints) {
|
||||
foreach (ServicePoint sp in servicePoints.Values) {
|
||||
sp.CloseConnectionGroup (connectionGroupName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if SECURITY_DEP
|
||||
internal class ChainValidationHelper {
|
||||
|
@@ -1972,20 +1972,17 @@ namespace System.Net
|
||||
if (fileName == null)
|
||||
throw new ArgumentNullException ("fileName");
|
||||
|
||||
WebRequest request = null;
|
||||
try {
|
||||
SetBusy ();
|
||||
cts = new CancellationTokenSource ();
|
||||
request = await SetupRequestAsync (address, method, true).ConfigureAwait (false);
|
||||
var result = await UploadFileTaskAsyncCore (request, method, fileName, cts.Token).ConfigureAwait (false);
|
||||
|
||||
var result = await UploadFileTaskAsyncCore (address, method, fileName, cts.Token).ConfigureAwait (false);
|
||||
OnUploadFileCompleted (new UploadFileCompletedEventArgs (result, null, false, null));
|
||||
return result;
|
||||
} catch (WebException ex) {
|
||||
OnUploadFileCompleted (new UploadFileCompletedEventArgs (null, ex, false, null));
|
||||
throw;
|
||||
} catch (OperationCanceledException) {
|
||||
if (request != null)
|
||||
request.Abort ();
|
||||
OnUploadFileCompleted (new UploadFileCompletedEventArgs (null, null, true, null));
|
||||
throw;
|
||||
} catch (Exception ex) {
|
||||
@@ -1994,8 +1991,7 @@ namespace System.Net
|
||||
}
|
||||
}
|
||||
|
||||
async Task<byte[]> UploadFileTaskAsyncCore (WebRequest request, string method,
|
||||
string fileName, CancellationToken token)
|
||||
async Task<byte[]> UploadFileTaskAsyncCore (Uri address, string method, string fileName, CancellationToken token)
|
||||
{
|
||||
token.ThrowIfCancellationRequested ();
|
||||
|
||||
@@ -2018,9 +2014,15 @@ namespace System.Net
|
||||
Stream reqStream = null;
|
||||
Stream fStream = null;
|
||||
WebResponse response = null;
|
||||
WebRequest request = null;
|
||||
|
||||
fileName = Path.GetFullPath (fileName);
|
||||
|
||||
try {
|
||||
request = await SetupRequestAsync (address, method, true).ConfigureAwait (false);
|
||||
} catch (OperationCanceledException) {
|
||||
}
|
||||
|
||||
try {
|
||||
fStream = File.OpenRead (fileName);
|
||||
token.ThrowIfCancellationRequested ();
|
||||
@@ -2042,7 +2044,9 @@ namespace System.Net
|
||||
Path.GetFileName (fileName), fileCType);
|
||||
byte [] partHeadersBytes = Encoding.UTF8.GetBytes (partHeaders);
|
||||
ms.Write (partHeadersBytes, 0, partHeadersBytes.Length);
|
||||
await ms.CopyToAsync (reqStream, (int)ms.Position, token).ConfigureAwait (false);
|
||||
var msLength = (int)ms.Position;
|
||||
ms.Seek (0, SeekOrigin.Begin);
|
||||
await ms.CopyToAsync (reqStream, msLength, token).ConfigureAwait (false);
|
||||
}
|
||||
}
|
||||
int nread;
|
||||
@@ -2084,7 +2088,9 @@ namespace System.Net
|
||||
ms.WriteByte ((byte) '-');
|
||||
ms.WriteByte ((byte) '\r');
|
||||
ms.WriteByte ((byte) '\n');
|
||||
await ms.CopyToAsync (reqStream, (int)ms.Position, token).ConfigureAwait (false);
|
||||
var msLength = (int)ms.Position;
|
||||
ms.Seek (0, SeekOrigin.Begin);
|
||||
await ms.CopyToAsync (reqStream, msLength, token).ConfigureAwait (false);
|
||||
}
|
||||
}
|
||||
reqStream.Close ();
|
||||
|
Reference in New Issue
Block a user