예제 #1
0
        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);
            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");
            }
        }
        CFHTTPMessage CreateRequest(HttpRequestMessage request)
        {
            var message = CFHTTPMessage.CreateRequest(
                request.RequestUri, request.Method.Method, request.Version);

            SetupRequest(request, message);

            if ((auth == null) || (Credentials == null) || !PreAuthenticate)
            {
                return(message);
            }

            if (!auth.AppliesToRequest(message))
            {
                return(message);
            }

            var method     = auth.GetMethod();
            var credential = Credentials.GetCredential(request.RequestUri, method);

            if (credential == null)
            {
                return(message);
            }

            message.ApplyCredentials(auth, credential);
            return(message);
        }
예제 #3
0
 public void CreateRequest10()
 {
     using (var m = CFHTTPMessage.CreateRequest(new Uri("http://www.xamarin.com"), "GET", new Version(1, 0))) {
         Assert.That(m.Handle, Is.Not.EqualTo(IntPtr.Zero), "Handle");
         Assert.False(m.IsHeaderComplete, "IsHeaderComplete");
         Assert.True(m.IsRequest, "IsRequest");
         Assert.Throws <InvalidOperationException> (delegate { var x = m.ResponseStatusCode; }, "ResponseStatusCode");
         Assert.Throws <InvalidOperationException> (delegate { var x = m.ResponseStatusLine; }, "ResponseStatusLine");
         Assert.That(m.Version.ToString(), Is.EqualTo("1.0"), "Version");
     }
 }
예제 #4
0
        CFHTTPMessage CreateWebRequestAsync(HttpRequestMessage request)
        {
            var req = CFHTTPMessage.CreateRequest(request.RequestUri, request.Method.Method, request.Version);

            // TODO:

/*
 *                      if (wr.ProtocolVersion == HttpVersion.Version10) {
 *                              wr.KeepAlive = request.Headers.ConnectionKeepAlive;
 *                      } else {
 *                              wr.KeepAlive = request.Headers.ConnectionClose != true;
 *                      }
 *
 *                      if (useDefaultCredentials) {
 *                              wr.UseDefaultCredentials = true;
 *                      } else {
 *                              wr.Credentials = credentials;
 *                      }
 *
 *                      if (useProxy) {
 *                              wr.Proxy = proxy;
 *                      }
 */
            if (cookies != null)
            {
                string cookieHeader = cookies.GetCookieHeader(request.RequestUri);
                if (cookieHeader != "")
                {
                    req.SetHeaderFieldValue("Cookie", cookieHeader);
                }
            }

            foreach (var header in request.Headers)
            {
                foreach (var value in header.Value)
                {
                    req.SetHeaderFieldValue(header.Key, value);
                }
            }

            if (request.Content != null)
            {
                foreach (var header in request.Content.Headers)
                {
                    foreach (var value in header.Value)
                    {
                        req.SetHeaderFieldValue(header.Key, value);
                    }
                }
            }

            return(req);
        }
예제 #5
0
 public void CreateRequest10()
 {
     using (var m = CFHTTPMessage.CreateRequest(NetworkResources.XamarinUri, "GET", new Version(1, 0))) {
         Assert.That(m.Handle, Is.Not.EqualTo(IntPtr.Zero), "Handle");
         Assert.False(m.IsHeaderComplete, "IsHeaderComplete");
         Assert.True(m.IsRequest, "IsRequest");
         Assert.Throws <InvalidOperationException> (delegate { var x = m.ResponseStatusCode; }, "ResponseStatusCode");
         Assert.Throws <InvalidOperationException> (delegate { var x = m.ResponseStatusLine; }, "ResponseStatusLine");
         Assert.That(m.Version.ToString(), Is.EqualTo("1.0"), "Version");
         Assert.That(TestRuntime.CFGetRetainCount(m.Handle), Is.EqualTo((nint)1), "RetainCount");
     }
 }
예제 #6
0
 public static WebResponseStream Create(Uri uri, HttpMethod method, Version version)
 {
     using (var req = CFHTTPMessage.CreateRequest(uri, method.Method, version))
         return(Create(req));
 }