using System; using System.Collections; using System.IO; using System.Net; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using MicrosoftZuneLibrary; namespace Microsoft.Zune.Service { public class HttpWebRequest { private class AsyncRequest { public unsafe IHttpWebRequest* m_pRequest; public bool m_cancelOnShutdown; public unsafe AsyncRequest(IHttpWebRequest* pRequest, [MarshalAs(UnmanagedType.U1)] bool cancelOnShutdown) { m_pRequest = pRequest; m_cancelOnShutdown = cancelOnShutdown; base._002Ector(); } } private Uri _uri; private string _method; private string _contentType; private string _acceptLanguage; private string _authorization; private string _browserCookieUrl; private bool _acceptGZipEncoding; private bool _keepAlive; private long _contentLength; private long _maxResponseLength; private HttpRequestCachePolicy _cachePolicy; private bool _cancelOnShutdown; private MemoryStream _requestStream; private static object _lock = new object(); private static ArrayList _asyncRequests; private unsafe static void* m_hRequestsCompleteEvent; private static bool _shutdown; public bool CancelOnShutdown { [return: MarshalAs(UnmanagedType.U1)] get { return _cancelOnShutdown; } [param: MarshalAs(UnmanagedType.U1)] set { _cancelOnShutdown = value; } } public bool KeepAlive { [return: MarshalAs(UnmanagedType.U1)] get { return _keepAlive; } [param: MarshalAs(UnmanagedType.U1)] set { _keepAlive = value; } } public string ContentType { get { return _contentType; } set { _contentType = value; } } public HttpRequestCachePolicy CachePolicy { get { return _cachePolicy; } set { _cachePolicy = value; } } public long MaxResponseLength { get { return _maxResponseLength; } set { _maxResponseLength = value; } } public string BrowserCookieUrl { get { return _browserCookieUrl; } set { _browserCookieUrl = value; } } public string Authorization { get { return _authorization; } set { _authorization = value; } } public bool AcceptGZipEncoding { [return: MarshalAs(UnmanagedType.U1)] get { return _acceptGZipEncoding; } [param: MarshalAs(UnmanagedType.U1)] set { _acceptGZipEncoding = value; } } public string AcceptLanguage { get { return _acceptLanguage; } set { _acceptLanguage = value; } } public long ContentLength { get { return _contentLength; } set { _contentLength = value; } } public Uri RequestUri => _uri; public string Method { get { return _method; } set { _method = value; } } public static HttpWebRequest Create(string uri) { return new HttpWebRequest(new Uri(uri)); } public static HttpWebRequest Create(Uri uri) { return new HttpWebRequest(uri); } public Stream GetRequestStream() { if (_requestStream == null) { _requestStream = new MemoryStream(new byte[(int)_contentLength]); } return _requestStream; } public unsafe HttpWebResponse GetResponse() { //Discarded unreachable code: IL_00c9 //IL_0016: Expected I, but got I8 //IL_0027: Expected I, but got I8 //IL_002a: Expected I, but got I8 //IL_0042: Expected I, but got I8 //IL_005b: Expected I, but got I8 //IL_0084: Expected I, but got I8 //IL_0095: Expected I, but got I8 //IL_00a8: Expected I, but got I8 int num = 0; num = (_shutdown ? (-2147418113) : num); IHttpWebRequest* ptr = null; if (num >= 0) { num = ConstructNativeRequest(&ptr); } IStream* ptr2 = null; IHttpWebResponse* ptr3 = null; if (num >= 0) { IHttpWebRequest* intPtr = ptr; num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)ptr + 160)))((nint)intPtr, &ptr2, &ptr3); } HttpStatusCode httpStatusCode = HttpStatusCode.OK; if (num >= 0) { IHttpWebResponse* intPtr2 = ptr3; httpStatusCode = (HttpStatusCode)((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr2 + 24)))((nint)intPtr2); } HttpWebResponse httpWebResponse = null; if (num >= 0) { httpWebResponse = new HttpWebResponse(_uri, httpStatusCode, ptr3, ptr2); } if (ptr != null) { IHttpWebRequest* intPtr3 = ptr; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr3 + 16)))((nint)intPtr3); } if (ptr3 != null) { IHttpWebResponse* intPtr4 = ptr3; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr4 + 16)))((nint)intPtr4); } if (ptr2 != null) { IStream* intPtr5 = ptr2; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr5 + 16)))((nint)intPtr5); } if (num >= 0 && httpStatusCode == HttpStatusCode.OK) { return httpWebResponse; } if (httpWebResponse != null) { throw new HttpWebException(httpWebResponse); } throw new HttpWebException(num); } public unsafe void GetResponseAsync(AsyncRequestComplete responseComplete, object stateInfo) { //Discarded unreachable code: IL_0113 //IL_0032: Expected I, but got I8 //IL_003f: Expected I, but got I8 //IL_0050: Expected I, but got I8 //IL_0082: Expected I, but got I8 //IL_00c6: Expected I, but got I8 //IL_00e1: Expected I, but got I8 //IL_00f2: Expected I, but got I8 //IL_0105: Expected I, but got I8 ManagedLock managedLock = null; ManagedLock managedLock2 = new ManagedLock(_lock); try { managedLock = managedLock2; if (!_shutdown) { goto IL_002e; } } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } ((IDisposable)managedLock).Dispose(); goto IL_0122; IL_0122: try { } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } return; IL_002e: try { IHttpWebRequest* ptr = null; int num = ConstructNativeRequest(&ptr); IStream* ptr2 = null; if (num >= 0) { num = Module.CreateStreamOnHGlobal(null, 1, &ptr2); if (num >= 0) { CWebRequestCallbackWrapper* ptr3 = (CWebRequestCallbackWrapper*)Module.@new(56uL); CWebRequestCallbackWrapper* ptr4; try { if (ptr3 != null) { Uri uri = _uri; ptr4 = Module.Microsoft_002EZune_002EService_002ECWebRequestCallbackWrapper_002E_007Bctor_007D(ptr3, uri, ptr, ptr2, responseComplete, stateInfo); } else { ptr4 = null; } } catch { //try-fault Module.delete(ptr3); throw; } int num2 = (((long)(nint)ptr4 != 0) ? num : (-2147024882)); num = num2; if (num2 >= 0) { bool cancelOnShutdown = _cancelOnShutdown; OnAsyncRequestStart(ptr, cancelOnShutdown); IHttpWebRequest* intPtr = ptr; IStream* intPtr2 = ptr2; num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)ptr + 168)))((nint)intPtr, intPtr2, (IHttpWebRequestCallback*)ptr4); if (num < 0) { OnAsyncRequestComplete(ptr); } } if (ptr4 != null) { CWebRequestCallbackWrapper* intPtr3 = ptr4; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr3 + 16)))((nint)intPtr3); } } } if (ptr != null) { IHttpWebRequest* intPtr4 = ptr; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr4 + 16)))((nint)intPtr4); } if (ptr2 != null) { IStream* intPtr5 = ptr2; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)intPtr5 + 16)))((nint)intPtr5); } if (num < 0) { throw new HttpWebException(num); } } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } ((IDisposable)managedLock).Dispose(); goto IL_0122; } public unsafe static void Shutdown() { //IL_0070: Expected I, but got I8 //IL_008d: Expected I, but got I8 //IL_008d: Expected I, but got I8 ManagedLock managedLock = null; ManagedLock managedLock2 = new ManagedLock(_lock); try { managedLock = managedLock2; _shutdown = true; if (_asyncRequests != null && _asyncRequests.Count > 0) { int num = 0; if (0 < _asyncRequests.Count) { do { AsyncRequest asyncRequest = (AsyncRequest)_asyncRequests[num]; if (asyncRequest.m_cancelOnShutdown) { IHttpWebRequest* pRequest = asyncRequest.m_pRequest; ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)pRequest + 176)))((nint)pRequest); } num++; } while (num < _asyncRequests.Count); } m_hRequestsCompleteEvent = Module.CreateEventW(null, 1, 0, null); managedLock.Unlock(); if (m_hRequestsCompleteEvent != null) { Module.WaitForSingleObject(m_hRequestsCompleteEvent, 120000u); Module.CloseHandle(m_hRequestsCompleteEvent); } } } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } ((IDisposable)managedLock).Dispose(); } internal unsafe static void OnAsyncRequestComplete(IHttpWebRequest* pRequest) { ManagedLock managedLock = null; ManagedLock managedLock2 = new ManagedLock(_lock); try { managedLock = managedLock2; int num = 0; if (0 < _asyncRequests.Count) { do { if (((AsyncRequest)_asyncRequests[num]).m_pRequest != pRequest) { num++; continue; } _asyncRequests.RemoveAt(num); break; } while (num < _asyncRequests.Count); } if (m_hRequestsCompleteEvent != null && _asyncRequests.Count == 0) { managedLock.Unlock(); Module.SetEvent(m_hRequestsCompleteEvent); } } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } ((IDisposable)managedLock).Dispose(); } private HttpWebRequest(Uri uri) { _uri = uri; _method = "GET"; _keepAlive = true; _cachePolicy = HttpRequestCachePolicy.Default; } private unsafe int ConstructNativeRequest(IHttpWebRequest** ppRequest) { //IL_0077: Expected I, but got I8 //IL_0077: Expected I, but got I8 //IL_00b3: Expected I, but got I8 //IL_00e7: Expected I, but got I8 //IL_00fc: Expected I, but got I8 //IL_011a: Expected I, but got I8 //IL_011a: Expected I, but got I8 //IL_014d: Expected I, but got I8 //IL_014d: Expected I, but got I8 //IL_0162: Expected I, but got I8 //IL_0162: Expected I, but got I8 //IL_0177: Expected I, but got I8 //IL_0177: Expected I, but got I8 //IL_01ae: Expected I, but got I8 //IL_01ae: Expected I, but got I8 //IL_021d: Expected I, but got I8 //IL_021d: Expected I, but got I8 //IL_024b: Expected I, but got I8 //IL_024b: Expected I, but got I8 //IL_0257: Expected I, but got I8 //IL_0260: Expected I8, but got I if (ppRequest == null) { Module._ZuneShipAssert(1001u, 774u); return -2147467261; } *(long*)ppRequest = 0L; fixed (char* _uri.AbsoluteUriPtr = _uri.AbsoluteUri.ToCharArray()) { ushort* ptr = (ushort*)_uri.AbsoluteUriPtr; fixed (char* _methodPtr = _method.ToCharArray()) { ushort* ptr2 = (ushort*)_methodPtr; CComPtrNtv_003CIService_003E cComPtrNtv_003CIService_003E; *(long*)(&cComPtrNtv_003CIService_003E) = 0L; int num; try { num = Module.GetSingleton((_GUID)Module._GUID_bb2d1edd_1bd5_4be1_8d38_36d4f0849911, (void**)(&cComPtrNtv_003CIService_003E)); CComPtrNtv_003CIHttpWebRequest_003E cComPtrNtv_003CIHttpWebRequest_003E; *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E) = 0L; try { if (num >= 0) { long num2 = *(long*)(*(ulong*)(&cComPtrNtv_003CIService_003E)) + 976; long num3 = *(long*)(&cComPtrNtv_003CIService_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)num2))((nint)num3, ptr, ptr2, (IHttpWebRequest**)(&cComPtrNtv_003CIHttpWebRequest_003E)); if (num >= 0) { if (_authorization != (string)null && _authorization.Length > 0) { Module.Microsoft_002EZune_002EService_002E_003FA0x12f4bdec_002ESetHeader((IHttpWebRequest*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)), "Authorization: " + _authorization); } if (_acceptLanguage != (string)null && _acceptLanguage.Length > 0) { Module.Microsoft_002EZune_002EService_002E_003FA0x12f4bdec_002ESetHeader((IHttpWebRequest*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)), "Accept-Language: " + _acceptLanguage); } if (_keepAlive) { Module.Microsoft_002EZune_002EService_002E_003FA0x12f4bdec_002ESetHeader((IHttpWebRequest*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)), "Proxy-Connection: Keep-Alive"); } if (_acceptGZipEncoding) { long num4 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 104)))((nint)num4, 1); } if (num >= 0) { switch (_cachePolicy) { case HttpRequestCachePolicy.Refresh: { long num7 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 24)))((nint)num7, (EHttpCacheLevel)2); break; } case HttpRequestCachePolicy.Default: { long num6 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 24)))((nint)num6, (EHttpCacheLevel)1); break; } case HttpRequestCachePolicy.BypassCache: { long num5 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 24)))((nint)num5, (EHttpCacheLevel)0); break; } } if (num >= 0 && !string.IsNullOrEmpty(_browserCookieUrl)) { fixed (char* _browserCookieUrlPtr = _browserCookieUrl.ToCharArray()) { ushort* ptr3 = (ushort*)_browserCookieUrlPtr; try { long num8 = *(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 144; long num9 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)num8))((nint)num9, ptr3); } catch { //try-fault ptr3 = null; throw; } } } } } } fixed (char* _contentTypePtr = _contentType.ToCharArray()) { ushort* ptr4 = (ushort*)_contentTypePtr; if (num >= 0) { MemoryStream requestStream = _requestStream; if (requestStream != null && requestStream.Length > 0) { byte[] array = _requestStream.ToArray(); uint num10 = (uint)array.Length; fixed (byte* ptr5 = &array[0]) { try { long num11 = *(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 136; long num12 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)num11))((nint)num12, ptr4, (int)num10, ptr5); } catch { //try-fault ptr5 = null; throw; } } } if (num >= 0) { long maxResponseLength = _maxResponseLength; if (maxResponseLength > 0) { long num13 = *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E); num = ((delegate* unmanaged[Cdecl, Cdecl])(*(ulong*)(*(long*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)) + 88)))((nint)num13, (ulong)maxResponseLength); } if (num >= 0) { IHttpWebRequest* ptr6 = (IHttpWebRequest*)(*(ulong*)(&cComPtrNtv_003CIHttpWebRequest_003E)); *(long*)(&cComPtrNtv_003CIHttpWebRequest_003E) = 0L; *(long*)ppRequest = (nint)ptr6; } } } } } catch { //try-fault Module.___CxxCallUnwindDtor((delegate*)(delegate*)(&Module.CComPtrNtv_003CIHttpWebRequest_003E_002E_007Bdtor_007D), &cComPtrNtv_003CIHttpWebRequest_003E); throw; } Module.CComPtrNtv_003CIHttpWebRequest_003E_002ERelease(&cComPtrNtv_003CIHttpWebRequest_003E); } catch { //try-fault Module.___CxxCallUnwindDtor((delegate*)(delegate*)(&Module.CComPtrNtv_003CIService_003E_002E_007Bdtor_007D), &cComPtrNtv_003CIService_003E); throw; } Module.CComPtrNtv_003CIService_003E_002ERelease(&cComPtrNtv_003CIService_003E); return num; } } } private unsafe static void OnAsyncRequestStart(IHttpWebRequest* pRequest, [MarshalAs(UnmanagedType.U1)] bool cancelOnShutdown) { ManagedLock managedLock = null; ManagedLock managedLock2 = new ManagedLock(_lock); try { managedLock = managedLock2; AsyncRequest value = new AsyncRequest(pRequest, cancelOnShutdown); if (_asyncRequests == null) { _asyncRequests = new ArrayList(); } _asyncRequests.Add(value); } catch { //try-fault ((IDisposable)managedLock).Dispose(); throw; } ((IDisposable)managedLock).Dispose(); } } }