public void CookieWithPath_UsesAssignedPath()
        {
            const string     testDomain   = "test.com";
            const string     cookieHeader = "sessionToken=abc123; Path=/test/path";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader(testDomain, cookieHeader);

            Assert.That(actual[0].Path, Is.EqualTo("/test/path"));
        }
        public void CookieWithDomain_UsesAssignedDomain()
        {
            const string     testDomain   = "test.com";
            const string     cookieHeader = "sessionToken=abc123; Domain=.cookie-specified.com";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader(testDomain, cookieHeader);

            Assert.That(actual[0].Domain, Is.EqualTo(".cookie-specified.com"));
        }
        public void CookieWithNoPath_PathIsForwardSlash()
        {
            const string     testDomain   = "test.com";
            const string     cookieHeader = "sessionToken=abc123";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader(testDomain, cookieHeader);

            Assert.That(actual[0].Path, Is.EqualTo("/"));
        }
        public void KeyOnlyCookie_ParsesNameValueCorrectly()
        {
            CookieCollection actual = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", "theme");

            Assert.That(actual.Count, Is.EqualTo(1));
            Assert.That(actual[0].Name, Is.EqualTo("theme"));
            Assert.That(actual[0].Value, Is.EqualTo(""));
        }
        public void CookieWithNoDomain_UsesDefaultDomain()
        {
            const string     testDomain   = "test.com";
            const string     cookieHeader = "theme";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader(testDomain, cookieHeader);

            Assert.That(actual[0].Domain, Is.EqualTo(testDomain));
        }
        public void KeyValueCookie_StripsCarriageReturns()
        {
            CookieCollection actual = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", "theme=light\r\n");

            Assert.That(actual.Count, Is.EqualTo(1));
            Assert.That(actual[0].Name, Is.EqualTo("theme"));
            Assert.That(actual[0].Value, Is.EqualTo("light"));
        }
        public void KeyValueCookie_ParsesNameValueCorrectly()
        {
            var actual = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", "theme=light");

            Assert.That(actual.Count, Is.EqualTo(1));
            Assert.That(actual[0].Name, Is.EqualTo("theme"));
            Assert.That(actual[0].Value, Is.EqualTo("light"));
        }
        public void CookieContainingCommaValue_IsReadAsASingleCookie()
        {
            const string     cookieHeader = "key=\"value1, value2\"";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", cookieHeader);

            Assert.That(actual.Count, Is.EqualTo(1));
            Assert.That(actual[0].Name, Is.EqualTo("key"));
            Assert.That(actual[0].Value, Is.EqualTo("value1, value2"));
        }
        public void KeyValueCookieWithExpiresAttribute_DisregardsExpiresValue()
        {
            const string     cookieHeader = "sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", cookieHeader);

            Assert.That(actual.Count, Is.EqualTo(1));
            Assert.That(actual[0].Name, Is.EqualTo("sessionToken"));
            Assert.That(actual[0].Value, Is.EqualTo("abc123"));
            Assert.That(actual[0].Expires, Is.EqualTo(DateTime.MinValue));
        }
        public void CommaSeparatedCookies_AreReadAsMultipleCookies()
        {
            const string     cookieHeader = "key1=value1; Expires=Test, TestDate, key2=value2";
            CookieCollection actual       = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", cookieHeader);

            Assert.That(actual.Count, Is.EqualTo(2));
            Assert.That(actual[0].Name, Is.EqualTo("key1"));
            Assert.That(actual[0].Value, Is.EqualTo("value1"));
            Assert.That(actual[1].Name, Is.EqualTo("key2"));
            Assert.That(actual[1].Value, Is.EqualTo("value2"));
        }
Example #11
0
        internal bool DoRequest(Uri uri, string method, NameValueCollection userVariables, string postData, string contentType, string encodingType, int timeoutMilliseconds)
        {
            string html;
            string referer = null;

            if (uri.IsFile)
            {
                StreamReader reader = new StreamReader(uri.AbsolutePath);
                html = reader.ReadToEnd();
                reader.Close();
            }
            else
            {
                bool   handle3xxRedirect = false;
                int    maxRedirects      = 5;         // Per RFC2068, Section 10.3
                string postBody          = string.Empty;
                do
                {
                    Debug.WriteLine(uri.ToString());
                    if (maxRedirects-- == 0)
                    {
                        Log("Too many 3xx redirects", LogMessageType.Error);
                        return(false);
                    }

                    handle3xxRedirect = false;
                    IHttpWebRequest req = null;

                    try
                    {
                        req = PrepareRequestObject(uri, method, contentType, timeoutMilliseconds);
                    }
                    catch (NotSupportedException)
                    {
                        // Happens when the URL cannot be parsed (example: 'javascript:')
                        return(false);
                    }

                    foreach (var header in _extraHeaders)
                    {
                        if (header.StartsWith("host:", StringComparison.OrdinalIgnoreCase))
                        {
                            req.Host = header.Split(':')[1];
                        }
                        else
                        {
                            req.Headers.Add(header);
                        }
                    }

                    if (!string.IsNullOrEmpty(encodingType))
                    {
                        req.Headers.Add(HttpRequestHeader.ContentEncoding, encodingType);
                    }

                    // Remove all expired basic authentication tokens
                    List <BasicAuthenticationToken> expired =
                        _basicAuthenticationTokens.Values.Where(t => DateTime.Now > t.Expiration).ToList();
                    foreach (var expiredToken in expired)
                    {
                        _basicAuthenticationTokens.Remove(expiredToken.Domain);
                    }

                    // If an authentication token exists for the domain, add the authorization header.
                    foreach (var token in _basicAuthenticationTokens.Values)
                    {
                        if (req.Host.Contains(token.Domain))
                        {
                            // Extend the expiration.
                            token.UpdateExpiration();

                            // Add the authentication header.
                            req.Headers.Add(string.Format(
                                                "Authorization: Basic {0}",
                                                token.Token));
                        }
                    }

                    if (_includeFormValues != null)
                    {
                        if (userVariables == null)
                        {
                            userVariables = _includeFormValues;
                        }
                        else
                        {
                            userVariables.Add(_includeFormValues);
                        }
                    }

                    if (userVariables != null)
                    {
                        if (method == "POST")
                        {
                            postBody = StringUtil.MakeQueryString(userVariables);
                            byte[] data = Encoding.GetEncoding(28591).GetBytes(postBody);
                            req.ContentLength = data.Length;
                            using (Stream stream = req.GetRequestStream())
                            {
                                stream.Write(data, 0, data.Length);
                            }
                        }
                        else
                        {
                            uri = new Uri(
                                uri.Scheme + "://" + uri.Host + ":" + uri.Port + uri.AbsolutePath
                                + ((userVariables.Count > 0) ? "?" + StringUtil.MakeQueryString(userVariables) : "")
                                );
                            req = PrepareRequestObject(uri, method, contentType, timeoutMilliseconds);
                        }
                    }
                    else if (postData != null)
                    {
                        if (method == "GET")
                        {
                            throw new InvalidOperationException("Cannot call DoRequest with method GET and non-null postData");
                        }
                        postBody = postData;
                        byte[] data = Encoding.GetEncoding(28591).GetBytes(postData);
                        req.ContentLength = data.Length;
                        using (Stream stream = req.GetRequestStream())
                        {
                            stream.Write(data, 0, data.Length);
                        }
                    }

                    referer = req.Referer;

                    if (contentType != null)
                    {
                        req.ContentType = contentType;
                    }

                    _lastRequestLog = new HttpRequestLog
                    {
                        Method         = method,
                        PostData       = userVariables,
                        PostBody       = postBody,
                        RequestHeaders = req.Headers,
                        Url            = uri
                    };
                    try
                    {
                        using (IHttpWebResponse response = req.GetResponse())
                        {
                            Encoding responseEncoding = Encoding.UTF8;                             //default
                            string   charSet          = response.CharacterSet;
                            if (!String.IsNullOrEmpty(charSet))
                            {
                                try
                                {
                                    responseEncoding = Encoding.GetEncoding(charSet);
                                }
                                catch (ArgumentException)
                                {
                                    responseEncoding = Encoding.UTF8;                                     // try using utf8
                                }
                            }

                            //ensure the stream is disposed
                            using (Stream rs = response.GetResponseStream())
                            {
                                using (StreamReader reader = new StreamReader(rs, responseEncoding))
                                {
                                    html = reader.ReadToEnd();
                                }
                            }

                            _doc = null;
                            _includeFormValues = null;

                            _lastRequestLog.Text            = html;
                            _lastRequestLog.ResponseHeaders = response.Headers;
                            _lastRequestLog.ResponseCode    = (int)response.StatusCode;

                            if (method == "GET" && uri.Query.Length > 0 && uri.Query != "?")
                            {
                                _lastRequestLog.QueryStringData = HttpUtility.ParseQueryString(uri.Query);
                            }

                            if (AutoRedirect == true &&
                                (((int)response.StatusCode == 300 ||                                 // Not entirely supported. If provided, the server's preference from the Location header is honored.
                                  (int)response.StatusCode == 301 ||
                                  (int)response.StatusCode == 302 ||
                                  (int)response.StatusCode == 303 ||
                                  // 304 - Unsupported, conditional Get requests are not supported (mostly because SimpleBrowser does not cache content)
                                  // 305 - Unsupported, possible security threat
                                  // 306 - No longer used, per RFC2616, Section 10.3.7
                                  (int)response.StatusCode == 307 ||
                                  (int)response.StatusCode == 308) &&
                                 response.Headers.AllKeys.Contains("Location")))
                            {
                                uri = new Uri(uri, response.Headers["Location"]);
                                handle3xxRedirect = true;
                                Debug.WriteLine("Redirecting to: " + uri);
                                method        = "GET";
                                postData      = null;
                                userVariables = null;
                            }

                            if (response.Headers.AllKeys.Contains("Set-Cookie"))
                            {
                                var cookies = SetCookieHeaderParser.GetAllCookiesFromHeader(uri.Host, response.Headers["Set-Cookie"]);
                                Cookies.Add(cookies);
                            }
                        }
                    }
                    catch (WebException ex)
                    {
                        if (ex.Response != null)
                        {
                            _lastRequestLog.ResponseHeaders = ex.Response.Headers;
                            //ensure the stream is disposed
                            using (Stream rs = ex.Response.GetResponseStream())
                            {
                                using (StreamReader reader = new StreamReader(rs))
                                {
                                    html = reader.ReadToEnd();
                                }
                            }
                            _lastRequestLog.Text = html;
                        }

                        LastWebException = ex;

                        switch (ex.Status)
                        {
                        case WebExceptionStatus.Timeout:
                            Log("A timeout occurred while trying to load the web page", LogMessageType.Error);
                            break;

                        case WebExceptionStatus.ReceiveFailure:
                            Log("The response was cut short prematurely", LogMessageType.Error);
                            break;

                        default:
                            Log("An exception was thrown while trying to load the page: " + ex.Message, LogMessageType.Error);
                            break;
                        }
                        return(false);
                    }
                    finally
                    {
                        LogRequestData();
                    }
                }while (handle3xxRedirect);
            }

            this._navigationAttributes = null;
            this.RemoveChildBrowsers();             //Any frames contained in the previous state should be removed. They will be recreated if we ever navigate back
            this.AddNavigationState(
                new NavigationState()
            {
                Html        = html,
                Url         = uri,
                ContentType = contentType,
                Referer     = string.IsNullOrEmpty(referer) ? null : new Uri(Uri.UnescapeDataString(referer))
            });

            return(true);
        }
 public void ComplexFacebookCookie_DoesNotThrowException()
 {
     const string cookieHeader =
         "datr=80gTVQMaYfPPoOakoxDXhrmQ; expires=Fri, 24-Mar-2017 23:46:59 GMT; Max-Age=63072000; path=/; domain=.facebook.com; httponly,reg_ext_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.facebook.com,reg_fb_ref=https%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com; httponly,reg_fb_gate=https%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com; httponly";
     CookieCollection actual = SetCookieHeaderParser.GetAllCookiesFromHeader("test.com", cookieHeader);
 }