/*******************************************************************************
* Copyright 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
{
string paq = uri.PathAndQuery; // need to access PathAndQuery
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 = null;
///
/// 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;
// If default has been left at the system default return the SDK default.
if (ServicePointManager.DefaultConnectionLimit == _defaultDefaultConnectionLimit)
return AWSSDKUtils.DefaultConnectionLimit;
// The system default has been explicitly changed so we will honor that value.
return ServicePointManager.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;
// If default has been left at the system default return the SDK default.
if (ServicePointManager.MaxServicePointIdleTime == _defaultMaxIdleTime)
return AWSSDKUtils.DefaultMaxIdleTime;
// The system default has been explicitly changed so we will honor that value.
return ServicePointManager.MaxServicePointIdleTime;
}
public static void Sleep(int ms)
{
System.Threading.Thread.Sleep(ms);
}
}
}