public static CFHTTPAuthentication CreateFromResponse (CFHTTPMessage response) { if (response == null) throw new ArgumentNullException ("response"); if (response.IsRequest) throw new InvalidOperationException (); var handle = CFHTTPAuthenticationCreateFromResponse (IntPtr.Zero, response.Handle); if (handle == IntPtr.Zero) return null; return new CFHTTPAuthentication (handle); }
public static CFHTTPStream CreateForStreamedHTTPRequest(CFHTTPMessage request, CFReadStream body) { if (request == null) { throw new ArgumentNullException("request"); } if (body == null) { throw new ArgumentNullException("body"); } var handle = CFReadStreamCreateForStreamedHTTPRequest(IntPtr.Zero, request.Handle, body.Handle); return(new CFHTTPStream(handle)); }
public CFHTTPMessage GetResponseHeader() { var handle = GetProperty(_ResponseHeader); if (handle == IntPtr.Zero) { return(null); } if (CFType.GetTypeID(handle) != CFHTTPMessage.GetTypeID()) { CFObject.CFRelease(handle); throw new InvalidCastException(); } return(new CFHTTPMessage(handle)); }
public bool AddAuthentication(CFHTTPMessage failureResponse, NSString username, NSString password, AuthenticationScheme scheme, bool forProxy) { if (username == null) { throw new ArgumentNullException("username"); } if (password == null) { throw new ArgumentNullException("password"); } return(CFHTTPMessageAddAuthentication( Handle, failureResponse.GetHandle(), username.Handle, password.Handle, GetAuthScheme(scheme), forProxy)); }
public CFHTTPMessage?GetFinalRequest() { var handle = GetProperty(_FinalRequest); if (handle == IntPtr.Zero) { return(null); } if (CFType.GetTypeID(handle) != CFHTTPMessage.GetTypeID()) { CFObject.CFRelease(handle); throw new InvalidCastException(); } return(new CFHTTPMessage(handle, true)); }
void SetupRequest(HttpRequestMessage request, CFHTTPMessage message) { string accept_encoding = null; if ((AutomaticDecompression & DecompressionMethods.GZip) != 0) { accept_encoding = "gzip"; } if ((AutomaticDecompression & DecompressionMethods.Deflate) != 0) { accept_encoding = accept_encoding != null ? "gzip, deflate" : "deflate"; } if (accept_encoding != null) { message.SetHeaderFieldValue("Accept-Encoding", accept_encoding); } if (request.Content != null) { foreach (var header in request.Content.Headers) { var value = string.Join(",", header.Value); message.SetHeaderFieldValue(header.Key, value); } } foreach (var header in request.Headers) { if ((accept_encoding != null) && header.Key.Equals("Accept-Encoding")) { continue; } var value = string.Join(",", header.Value); message.SetHeaderFieldValue(header.Key, value); } if (UseCookies && (CookieContainer != null)) { string cookieHeader = CookieContainer.GetCookieHeader(request.RequestUri); if (cookieHeader != "") { message.SetHeaderFieldValue("Cookie", cookieHeader); } } }
public static CFHTTPAuthentication CreateFromResponse(CFHTTPMessage response) { if (response == null) { throw new ArgumentNullException("response"); } if (response.IsRequest) { throw new InvalidOperationException(); } var handle = CFHTTPAuthenticationCreateFromResponse(IntPtr.Zero, response.Handle); if (handle == IntPtr.Zero) { return(null); } return(new CFHTTPAuthentication(handle, true)); }
async Task <WebRequestStream> CreateBody(HttpRequestMessage request, CFHTTPMessage message, CancellationToken cancellationToken) { if (request.Content == null) { return(null); } /* * There are two ways of sending the body: * * - CFHTTPMessageSetBody() sets the full body contents * We use this by default. * * - CFReadStreamCreateForStreamedHTTPRequest() should be used * if the body is too large to fit in memory. It also uses * chunked transfer encoding. * * We use this if the user either gave us a StreamContent, or we * don't have any Content-Length, so we'll have to use chunked * transfer anyways. * */ var length = request.Content.Headers.ContentLength; if ((request.Content is StreamContent) || (length == null)) { var stream = await request.Content.ReadAsStreamAsync().ConfigureAwait(false); return(new WebRequestStream(stream, cancellationToken)); } var text = await request.Content.ReadAsByteArrayAsync().ConfigureAwait(false); message.SetBody(text); return(null); }
public void CreateResponseAuth() { CFHTTPMessage response = null; var done = false; var taskCompletionSource = new TaskCompletionSource <CFHTTPMessage> (); // the following code has to be in a diff thread, else, we are blocking the current loop, not cool // perform a request so that we fail in the auth, then create the auth object and check the count TestRuntime.RunAsync(DateTime.Now.AddSeconds(30), async() => { using (var request = CFHTTPMessage.CreateRequest( new Uri(NetworkResources.Httpbin.GetStatusCodeUrl(HttpStatusCode.Unauthorized)), "GET", null)) { request.SetBody(Array.Empty <byte> ()); // empty body, we are not interested using (var stream = CFStream.CreateForHTTPRequest(request)) { Assert.IsNotNull(stream, "Null stream"); // we are only interested in the completed event stream.ClosedEvent += (sender, e) => { taskCompletionSource.SetResult(stream.GetResponseHeader()); done = true; }; // enable events and run in the current loop stream.EnableEvents(CFRunLoop.Main, CFRunLoop.ModeDefault); stream.Open(); response = await taskCompletionSource.Task; } } }, () => done); if (!done) { TestRuntime.IgnoreInCI("Transient network failure - ignore in CI"); } Assert.IsTrue(done, "Network request completed"); using (var auth = CFHTTPAuthentication.CreateFromResponse(response)) { Assert.NotNull(auth, "Null Auth"); Assert.IsTrue(auth.IsValid, "Auth is valid"); Assert.That(TestRuntime.CFGetRetainCount(auth.Handle), Is.EqualTo((nint)1), "RetainCount"); } }
bool HandleAuthentication(Uri uri, CFHTTPMessage request, CFHTTPMessage response) { if (Credentials == null) { return(false); } if (PreAuthenticate) { FindAuthenticationObject(response); return(HandlePreAuthentication(uri, request)); } var basic = Credentials.GetCredential(uri, "Basic"); var digest = Credentials.GetCredential(uri, "Digest"); bool ok = false; if ((basic != null) && (digest == null)) { ok = HandleAuthentication( request, response, CFHTTPMessage.AuthenticationScheme.Basic, basic); } if ((digest != null) && (basic == null)) { ok = HandleAuthentication( request, response, CFHTTPMessage.AuthenticationScheme.Digest, digest); } if (ok) { return(true); } FindAuthenticationObject(response); return(HandlePreAuthentication(uri, request)); }
public static WebResponseStream Create(Uri uri, HttpMethod method, Version version) { using (var req = CFHTTPMessage.CreateRequest(uri, method.Method, version)) return(Create(req)); }
protected INativeObject GetINativeInstance(Type t) { var ctor = t.GetConstructor(Type.EmptyTypes); if ((ctor != null) && !ctor.IsAbstract) { return(ctor.Invoke(null) as INativeObject); } if (!NativeObjectInterfaceType.IsAssignableFrom(t)) { throw new ArgumentException("t"); } switch (t.Name) { case "CFAllocator": return(CFAllocator.SystemDefault); case "CFBundle": var bundles = CFBundle.GetAll(); if (bundles.Length > 0) { return(bundles [0]); } else { throw new InvalidOperationException(string.Format("Could not create the new instance for type {0}.", t.Name)); } case "CFNotificationCenter": return(CFNotificationCenter.Darwin); case "CFReadStream": case "CFStream": CFReadStream readStream; CFWriteStream writeStream; CFStream.CreatePairWithSocketToHost("www.google.com", 80, out readStream, out writeStream); return(readStream); case "CFWriteStream": CFStream.CreatePairWithSocketToHost("www.google.com", 80, out readStream, out writeStream); return(writeStream); case "CFUrl": return(CFUrl.FromFile("/etc")); case "CFPropertyList": return(CFPropertyList.FromData(NSData.FromString("<string>data</string>")).PropertyList); case "DispatchData": return(DispatchData.FromByteBuffer(new byte [] { 1, 2, 3, 4 })); case "AudioFile": var path = Path.GetFullPath("1.caf"); var af = AudioFile.Open(CFUrl.FromFile(path), AudioFilePermission.Read, AudioFileType.CAF); return(af); case "CFHTTPMessage": return(CFHTTPMessage.CreateEmpty(false)); case "CFMutableString": return(new CFMutableString("xamarin")); case "CGBitmapContext": byte[] data = new byte [400]; using (CGColorSpace space = CGColorSpace.CreateDeviceRGB()) { return(new CGBitmapContext(data, 10, 10, 8, 40, space, CGBitmapFlags.PremultipliedLast)); } case "CGContextPDF": var filename = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) + "/t.pdf"; using (var url = new NSUrl(filename)) return(new CGContextPDF(url)); case "CGColorConversionInfo": var cci = new GColorConversionInfoTriple() { Space = CGColorSpace.CreateGenericRgb(), Intent = CGColorRenderingIntent.Default, Transform = CGColorConversionInfoTransformType.ApplySpace }; return(new CGColorConversionInfo((NSDictionary)null, cci, cci, cci)); case "CGDataConsumer": using (NSMutableData destData = new NSMutableData()) { return(new CGDataConsumer(destData)); } case "CGDataProvider": filename = "xamarin1.png"; return(new CGDataProvider(filename)); case "CGFont": return(CGFont.CreateWithFontName("Courier New")); case "CGPattern": return(new CGPattern( new RectangleF(0, 0, 16, 16), CGAffineTransform.MakeIdentity(), 16, 16, CGPatternTiling.NoDistortion, true, (cgc) => {})); case "CMBufferQueue": return(CMBufferQueue.CreateUnsorted(2)); case "CTFont": CTFontDescriptorAttributes fda = new CTFontDescriptorAttributes() { FamilyName = "Courier", StyleName = "Bold", Size = 16.0f }; using (var fd = new CTFontDescriptor(fda)) return(new CTFont(fd, 10)); case "CTFontCollection": return(new CTFontCollection(new CTFontCollectionOptions())); case "CTFontDescriptor": fda = new CTFontDescriptorAttributes(); return(new CTFontDescriptor(fda)); case "CTTextTab": return(new CTTextTab(CTTextAlignment.Left, 2)); case "CTTypesetter": return(new CTTypesetter(new NSAttributedString("Hello, world", new CTStringAttributes() { ForegroundColorFromContext = true, Font = new CTFont("ArialMT", 24) }))); case "CTFrame": var framesetter = new CTFramesetter(new NSAttributedString("Hello, world", new CTStringAttributes() { ForegroundColorFromContext = true, Font = new CTFont("ArialMT", 24) })); var bPath = UIBezierPath.FromRect(new RectangleF(0, 0, 3, 3)); return(framesetter.GetFrame(new NSRange(0, 0), bPath.CGPath, null)); case "CTFramesetter": return(new CTFramesetter(new NSAttributedString("Hello, world", new CTStringAttributes() { ForegroundColorFromContext = true, Font = new CTFont("ArialMT", 24) }))); case "CTGlyphInfo": return(new CTGlyphInfo("copyright", new CTFont("ArialMY", 24), "Foo")); case "CTLine": return(new CTLine(new NSAttributedString("Hello, world", new CTStringAttributes() { ForegroundColorFromContext = true, Font = new CTFont("ArialMT", 24) }))); case "CGImageDestination": var storage = new NSMutableData(); return(CGImageDestination.Create(new CGDataConsumer(storage), "public.png", 1)); case "CGImageMetadataTag": using (NSString name = new NSString("tagName")) using (var value = new NSString("value")) return(new CGImageMetadataTag(CGImageMetadataTagNamespaces.Exif, CGImageMetadataTagPrefixes.Exif, name, CGImageMetadataType.Default, value)); case "CGImageSource": filename = "xamarin1.png"; return(CGImageSource.FromUrl(NSUrl.FromFilename(filename))); case "SecPolicy": return(SecPolicy.CreateSslPolicy(false, null)); case "SecIdentity": using (var options = NSDictionary.FromObjectAndKey(new NSString("farscape"), SecImportExport.Passphrase)) { NSDictionary[] array; var result = SecImportExport.ImportPkcs12(farscape_pfx, options, out array); if (result != SecStatusCode.Success) { throw new InvalidOperationException(string.Format("Could not create the new instance for type {0} due to {1}.", t.Name, result)); } return(new SecIdentity(array [0].LowlevelObjectForKey(SecImportExport.Identity.Handle))); } case "SecTrust": X509Certificate x = new X509Certificate(mail_google_com); using (var policy = SecPolicy.CreateSslPolicy(true, "mail.google.com")) return(new SecTrust(x, policy)); case "SslContext": return(new SslContext(SslProtocolSide.Client, SslConnectionType.Stream)); case "UIFontFeature": return(new UIFontFeature(CTFontFeatureNumberSpacing.Selector.ProportionalNumbers)); case "NetworkReachability": return(new NetworkReachability(IPAddress.Loopback, null)); case "VTCompressionSession": case "VTSession": return(VTCompressionSession.Create(1024, 768, CMVideoCodecType.H264, (sourceFrame, status, flags, buffer) => { }, null, (CVPixelBufferAttributes)null)); case "VTFrameSilo": return(VTFrameSilo.Create()); case "VTMultiPassStorage": return(VTMultiPassStorage.Create()); case "CFString": return(new CFString("test")); case "DispatchBlock": return(new DispatchBlock(() => { })); case "DispatchQueue": return(new DispatchQueue("com.example.subsystem.taskXYZ")); case "DispatchGroup": return(DispatchGroup.Create()); case "CGColorSpace": return(CGColorSpace.CreateDeviceCmyk()); case "CGGradient": CGColor[] cArray = { UIColor.Black.CGColor, UIColor.Clear.CGColor, UIColor.Blue.CGColor }; return(new CGGradient(null, cArray)); case "CGImage": filename = "xamarin1.png"; using (var dp = new CGDataProvider(filename)) return(CGImage.FromPNG(dp, null, false, CGColorRenderingIntent.Default)); case "CGColor": return(UIColor.Black.CGColor); case "CMClock": return(CMClock.HostTimeClock); case "CMTimebase": return(new CMTimebase(CMClock.HostTimeClock)); case "CVPixelBufferPool": return(new CVPixelBufferPool( new CVPixelBufferPoolSettings(), new CVPixelBufferAttributes(CVPixelFormatType.CV24RGB, 100, 50) )); case "SecCertificate": using (var cdata = NSData.FromArray(mail_google_com)) return(new SecCertificate(cdata)); case "SecCertificate2": using (var cdata = NSData.FromArray(mail_google_com)) return(new SecCertificate2(new SecCertificate(cdata))); case "SecTrust2": X509Certificate x2 = new X509Certificate(mail_google_com); using (var policy = SecPolicy.CreateSslPolicy(true, "mail.google.com")) return(new SecTrust2(new SecTrust(x2, policy))); case "SecIdentity2": using (var options = NSDictionary.FromObjectAndKey(new NSString("farscape"), SecImportExport.Passphrase)) { NSDictionary[] array; var result = SecImportExport.ImportPkcs12(farscape_pfx, options, out array); if (result != SecStatusCode.Success) { throw new InvalidOperationException(string.Format("Could not create the new instance for type {0} due to {1}.", t.Name, result)); } return(new SecIdentity2(new SecIdentity(array [0].LowlevelObjectForKey(SecImportExport.Identity.Handle)))); } case "SecKey": SecKey private_key; SecKey public_key; using (var record = new SecRecord(SecKind.Key)) { record.KeyType = SecKeyType.RSA; record.KeySizeInBits = 512; // it's not a performance test :) SecKey.GenerateKeyPair(record.ToDictionary(), out public_key, out private_key); return(private_key); } case "SecAccessControl": return(new SecAccessControl(SecAccessible.WhenPasscodeSetThisDeviceOnly)); default: throw new InvalidOperationException(string.Format("Could not create the new instance for type {0}.", t.Name)); } }
async Task <HttpResponseMessage> ProcessRequest(HttpRequestMessage request, CFHTTPMessage message, WebRequestStream body, bool retryWithCredentials, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); WebResponseStream stream; if (body != null) { stream = WebResponseStream.Create(message, body); } else { stream = WebResponseStream.Create(message); } if (stream == null) { throw new HttpRequestException(string.Format( "Failed to create web request for '{0}'.", request.RequestUri) ); } stream.Stream.ShouldAutoredirect = AllowAutoRedirect; stream.Stream.AttemptPersistentConnection = GetKeepAlive(request); var response = await stream.Open( WorkerThread, cancellationToken).ConfigureAwait(false); var status = (HttpStatusCode)response.ResponseStatusCode; if (retryWithCredentials && (body == null) && (status == HttpStatusCode.Unauthorized) || (status == HttpStatusCode.ProxyAuthenticationRequired)) { if (HandleAuthentication(request.RequestUri, message, response)) { stream.Dispose(); return(await ProcessRequest( request, message, null, false, cancellationToken)); } } // The Content object takes ownership of the stream, so we don't // dispose it here. var retval = new HttpResponseMessage(); retval.StatusCode = response.ResponseStatusCode; retval.ReasonPhrase = GetReasonPhrase(response); retval.Version = response.Version; var content = new Content(stream); retval.Content = content; DecodeHeaders(response, retval, content); return(retval); }
async Task <HttpResponseMessage> ProcessRequest(HttpRequestMessage request, CFHTTPMessage message, WebRequestStream body, bool retryWithCredentials, CancellationToken cancellationToken, bool isFirstRequest) { cancellationToken.ThrowIfCancellationRequested(); WebResponseStream stream; if (body != null) { stream = WebResponseStream.Create(message, body); } else { stream = WebResponseStream.Create(message); } if (stream == null) { throw new HttpRequestException(string.Format( "Failed to create web request for '{0}'.", request.RequestUri) ); } if (!isFirstRequest) { stream.Stream.ShouldAutoredirect = AllowAutoRedirect; } stream.Stream.AttemptPersistentConnection = GetKeepAlive(request); var response = await stream.Open( WorkerThread, cancellationToken).ConfigureAwait(true); // with false, we will have a deadlock. var status = (HttpStatusCode)response.ResponseStatusCode; if (IsRedirect(status)) { request.Headers.Authorization = null; stream.Dispose(); // we cannot reuse the message, will deadlock and also the message.ApplyCredentials (auth, credential); // was called the first time using (var retryMsg = CreateRequest(request, false)) { return(await ProcessRequest( request, retryMsg, null, false, cancellationToken, false)); } } if (retryWithCredentials && (body == null) && (status == HttpStatusCode.Unauthorized) || (status == HttpStatusCode.ProxyAuthenticationRequired)) { if (HandleAuthentication(request.RequestUri, message, response)) { stream.Dispose(); using (var retryMsg = CreateRequest(request, true)) { // behave as if it was the first attempt return(await ProcessRequest( request, message, null, false, cancellationToken, true)); // behave as if it was the first attempt } } } // The Content object takes ownership of the stream, so we don't // dispose it here. var retval = new HttpResponseMessage(); retval.StatusCode = response.ResponseStatusCode; retval.ReasonPhrase = GetReasonPhrase(response); retval.Version = response.Version; var content = new Content(stream); retval.Content = content; DecodeHeaders(response, retval, content); return(retval); }
public bool AppliesToRequest (CFHTTPMessage request) { if (request == null) throw new ArgumentNullException ("request"); if (!request.IsRequest) throw new InvalidOperationException (); return CFHTTPAuthenticationAppliesToRequest (Handle, request.Handle); }
public bool AddAuthentication (CFHTTPMessage failureResponse, NSString username, NSString password, AuthenticationScheme scheme, bool forProxy) { if (username == null) throw new ArgumentNullException ("username"); if (password == null) throw new ArgumentNullException ("password"); return CFHTTPMessageAddAuthentication ( Handle, failureResponse.GetHandle (), username.Handle, password.Handle, GetAuthScheme (scheme), forProxy); }