Skip to content

Commit b44ea73

Browse files
refactoring of ParsedCookie to separate cookie from attributes
1 parent 9008e45 commit b44ea73

File tree

7 files changed

+188
-188
lines changed

7 files changed

+188
-188
lines changed

NScrape.Test/Cookies/SetCookieHeaderGrammarTests.cs

Lines changed: 131 additions & 131 deletions
Large diffs are not rendered by default.

NScrape/Cookies/ParsedCookie.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace NScrape.Cookies {
44
internal class ParsedCookie {
5-
public ParsedCookie( IEnumerable<CookieNameValuePair> cookieNameValuePairs ) {
6-
CookieNameValuePairs = cookieNameValuePairs;
5+
public ParsedCookie( CookieNameValuePair cookiePair, IEnumerable<CookieNameValuePair> attributePairs ) {
6+
CookiePair = cookiePair;
7+
AttributePairs = attributePairs;
78
}
89

9-
public IEnumerable<CookieNameValuePair> CookieNameValuePairs { get; private set; }
10+
public CookieNameValuePair CookiePair { get; set; }
11+
12+
public IEnumerable<CookieNameValuePair> AttributePairs { get; private set; }
1013
}
1114
}

NScrape/Cookies/SetCookieHeaderGrammar.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
3-
using Sprache;
1+
using Sprache;
42

53
namespace NScrape.Cookies {
64
// Building an External DSL in C#
@@ -50,10 +48,10 @@ from delimiter in SemiColonSeparator.Optional().Token()
5048
select new CookieNameValuePair( name );
5149

5250
public static readonly Parser<ParsedCookie> Cookie =
53-
from cookiePair in NameValue.Once()
51+
from cookiePair in NameValue
5452
from cookieAttributes in ExpiresNameValue.Or( NameValue.Or( NameOnly ) ).Many()
5553
from delimiter in CommaSeparator.Optional()
56-
select new ParsedCookie( cookiePair.Union( cookieAttributes ) );
54+
select new ParsedCookie( cookiePair, cookieAttributes );
5755

5856
public static readonly Parser<ParsedSetCookieHeader> SetCookieHeader =
5957
from cookies in Cookie.Many()

NScrape/NScrapeUtility.cs

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,67 +35,64 @@ internal static IEnumerable<Cookie> ParseSetCookieHeader( string setCookieHeader
3535

3636
foreach ( var parsedCookie in header.ParsedCookies ) {
3737
var cookie = new Cookie {
38+
Name = parsedCookie.CookiePair.Name,
39+
Value = parsedCookie.CookiePair.Value,
3840
Path = "/",
3941
Domain = hostName
4042
};
4143

4244
var hasMaxAge = false;
4345

44-
if ( parsedCookie.CookieNameValuePairs.Any() ) {
45-
cookie.Name = parsedCookie.CookieNameValuePairs.ElementAt( 0 ).Name;
46-
cookie.Value = parsedCookie.CookieNameValuePairs.ElementAt( 0 ).Value;
47-
48-
foreach ( var nameValuePair in parsedCookie.CookieNameValuePairs.Skip( 1 ) ) {
49-
if ( string.Equals( nameValuePair.Name, "httponly", StringComparison.OrdinalIgnoreCase ) ) {
50-
cookie.HttpOnly = true;
46+
foreach ( var nameValuePair in parsedCookie.AttributePairs ) {
47+
if ( string.Equals( nameValuePair.Name, "httponly", StringComparison.OrdinalIgnoreCase ) ) {
48+
cookie.HttpOnly = true;
49+
}
50+
else if ( string.Equals( nameValuePair.Name, "secure", StringComparison.OrdinalIgnoreCase ) ) {
51+
cookie.Secure = true;
52+
}
53+
else if ( string.Equals( nameValuePair.Name, "path", StringComparison.OrdinalIgnoreCase ) ) {
54+
if ( nameValuePair.Value != string.Empty ) {
55+
cookie.Path = nameValuePair.Value;
5156
}
52-
else if ( string.Equals( nameValuePair.Name, "secure", StringComparison.OrdinalIgnoreCase ) ) {
53-
cookie.Secure = true;
57+
else {
58+
cookie.Path = "/";
5459
}
55-
else if ( string.Equals( nameValuePair.Name, "path", StringComparison.OrdinalIgnoreCase ) ) {
56-
if ( nameValuePair.Value != string.Empty ) {
57-
cookie.Path = nameValuePair.Value;
58-
}
59-
else {
60-
cookie.Path = "/";
61-
}
60+
}
61+
else if ( string.Equals( nameValuePair.Name, "domain", StringComparison.OrdinalIgnoreCase ) ) {
62+
if ( nameValuePair.Value != string.Empty ) {
63+
cookie.Domain = nameValuePair.Value;
6264
}
63-
else if ( string.Equals( nameValuePair.Name, "domain", StringComparison.OrdinalIgnoreCase ) ) {
64-
if ( nameValuePair.Value != string.Empty ) {
65-
cookie.Domain = nameValuePair.Value;
66-
}
67-
else {
68-
cookie.Domain = hostName;
69-
}
65+
else {
66+
cookie.Domain = hostName;
7067
}
71-
else if ( string.Equals( nameValuePair.Name, "max-age", StringComparison.OrdinalIgnoreCase ) ) {
72-
var maxAge = int.Parse( nameValuePair.Value );
73-
cookie.Expires = DateTime.Now.AddSeconds( maxAge );
68+
}
69+
else if ( string.Equals( nameValuePair.Name, "max-age", StringComparison.OrdinalIgnoreCase ) ) {
70+
var maxAge = int.Parse( nameValuePair.Value );
71+
cookie.Expires = DateTime.Now.AddSeconds( maxAge );
7472

75-
// Prevent the 'expires' value from overriding the value that was determined using max-age
76-
hasMaxAge = true;
77-
}
78-
else if ( !hasMaxAge && string.Equals( nameValuePair.Name, "expires", StringComparison.OrdinalIgnoreCase ) ) {
79-
// max-age takes precedence over "expires"
80-
DateTime parsedDate;
73+
// Prevent the 'expires' value from overriding the value that was determined using max-age
74+
hasMaxAge = true;
75+
}
76+
else if ( !hasMaxAge && string.Equals( nameValuePair.Name, "expires", StringComparison.OrdinalIgnoreCase ) ) {
77+
// max-age takes precedence over "expires"
78+
DateTime parsedDate;
8179

82-
if ( TryParseHttpDate( nameValuePair.Value, out parsedDate ) ) {
83-
cookie.Expires = parsedDate.ToLocalTime();
84-
}
80+
if ( TryParseHttpDate( nameValuePair.Value, out parsedDate ) ) {
81+
cookie.Expires = parsedDate.ToLocalTime();
8582
}
86-
else if ( string.Equals( nameValuePair.Name, "version", StringComparison.OrdinalIgnoreCase ) ) {
87-
if ( nameValuePair.Value != string.Empty ) {
88-
int version;
83+
}
84+
else if ( string.Equals( nameValuePair.Name, "version", StringComparison.OrdinalIgnoreCase ) ) {
85+
if ( nameValuePair.Value != string.Empty ) {
86+
int version;
8987

90-
if ( int.TryParse( nameValuePair.Value, out version ) ) {
91-
cookie.Version = version;
92-
}
88+
if ( int.TryParse( nameValuePair.Value, out version ) ) {
89+
cookie.Version = version;
9390
}
9491
}
9592
}
96-
97-
cookies.Add( cookie );
9893
}
94+
95+
cookies.Add( cookie );
9996
}
10097

10198
return cookies;

NScrape/WebClient.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,13 @@ public WebResponse SendRequest( WebRequest webRequest ) {
230230
//
231231
// To catch these, we parse the header manually and add any cookie that is missing.
232232
if ( webResponse.Headers.AllKeys.Contains( CommonHeaders.SetCookie ) ) {
233-
var parsedCookies = NScrapeUtility.ParseSetCookieHeader( webResponse.Headers[CommonHeaders.SetCookie], httpWebRequest.Host );
233+
var responseCookieList = responseCookies.OfType<Cookie>().ToList();
234234

235-
foreach ( var parsedCookie in parsedCookies ) {
236-
if ( responseCookies.OfType<Cookie>().All( c => c.Name != parsedCookie.Name ) ) {
237-
responseCookies.Add( parsedCookie );
235+
var cookies = NScrapeUtility.ParseSetCookieHeader( webResponse.Headers[CommonHeaders.SetCookie], httpWebRequest.Host );
236+
237+
foreach ( var cookie in cookies ) {
238+
if ( responseCookieList.All( c => c.Name != cookie.Name ) ) {
239+
responseCookies.Add( cookie );
238240
}
239241
}
240242
}

NScrape/WebRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected WebRequest( WebRequestType type, Uri destination ) {
4949
/// <remarks>
5050
/// Headers may be sent with the request by adding them to the headers collection.
5151
/// </remarks>
52-
public NameValueCollection Headers { get; private set; }
52+
public NameValueCollection Headers { get; }
5353

5454
/// <summary>
5555
/// Gets the type of the request.

NScrape/WebResponseFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static WebResponseFactory() {
4242
/// object with the given content type and returns a <see cref="WebResponse"/>. The return value
4343
/// is usually a subclass of the <see cref="WebResponse"/> class.
4444
/// </remarks>
45-
public static Dictionary<string, Func<HttpWebResponse, WebResponse>> SupportedContentTypes { get; private set; }
45+
public static Dictionary<string, Func<HttpWebResponse, WebResponse>> SupportedContentTypes { get; }
4646

4747
/// <summary>
4848
/// Creates an <see cref="HtmlWebResponse"/>.

0 commit comments

Comments
 (0)