/*******************************************************************************
* Copyright 2008-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use
* this file except in compliance with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file.
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
* *****************************************************************************
* __ _ _ ___
* ( )( \/\/ )/ __)
* /__\ \ / \__ \
* (_)(_) \/\/ (___/
*
* AWS SDK for .NET
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using Microsoft.Win32;
using System.Globalization;
namespace Amazon.Util
{
public static partial class AWSSDKUtils
{
public static void ForceCanonicalPathAndQuery(Uri uri)
{
try
{
FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
ulong flags = (ulong)flagsFieldInfo.GetValue(uri);
flags &= ~((ulong)0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical
flagsFieldInfo.SetValue(uri, flags);
}
catch { }
}
static readonly object _preserveStackTraceLookupLock = new object();
static bool _preserveStackTraceLookup = false;
static MethodInfo _preserveStackTrace;
///
/// This method is used preserve the stacktrace used from clients that support async calls. This
/// make sure that exceptions thrown during EndXXX methods has the orignal stacktrace that happen
/// in the background thread.
///
///
public static void PreserveStackTrace(Exception exception)
{
if (!_preserveStackTraceLookup)
{
lock (_preserveStackTraceLookupLock)
{
_preserveStackTraceLookup = true;
try
{
_preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace",
BindingFlags.Instance | BindingFlags.NonPublic);
}
catch { }
}
}
if (_preserveStackTrace != null)
{
_preserveStackTrace.Invoke(exception, null);
}
}
private const int _defaultDefaultConnectionLimit = 2;
internal static int GetConnectionLimit(int? clientConfigValue)
{
// Connection limit has been explicitly set on the client.
if (clientConfigValue.HasValue)
return clientConfigValue.Value;
return AWSSDKUtils.DefaultConnectionLimit;
}
private const int _defaultMaxIdleTime = 100 * 1000;
internal static int GetMaxIdleTime(int? clientConfigValue)
{
// MaxIdleTime has been explicitly set on the client.
if (clientConfigValue.HasValue)
return clientConfigValue.Value;
return AWSSDKUtils.DefaultMaxIdleTime;
}
public static void Sleep(int ms)
{
System.Threading.Thread.Sleep(ms);
}
///
/// Determines if Unity scripting backend is IL2CPP.
///
/// trueIf scripting backend is IL2CPP; otherwise, false.
internal static bool IsIL2CPP
{
get{
Type type = Type.GetType("Mono.Runtime");
if (type != null)
{
MethodInfo displayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
if (displayName != null)
{
string name = null;
try
{
name = displayName.Invoke(null, null).ToString();
}
catch(Exception)
{
return false;
}
if(name != null && name.ToUpper().Contains("IL2CPP"))
{
return true;
}
}
}
return false;
}
}
}
}