/// <summary>Parses the Set-Cookie value into an array of <tt>Cookie</tt>s.</summary> /// <remarks> /// Parses the Set-Cookie value into an array of <tt>Cookie</tt>s. /// <p>Syntax of the Set-Cookie HTTP Response Header:</p> /// <p>This is the format a CGI script would use to add to /// the HTTP headers a new piece of data which is to be stored by /// the client for later retrieval.</p> /// <PRE> /// Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure /// </PRE> /// <p>Please note that the Netscape draft specification does not fully conform to the HTTP /// header format. Comma character if present in <code>Set-Cookie</code> will not be treated /// as a header element separator</p> /// </remarks> /// <seealso><a href="http://web.archive.org/web/20020803110822/http://wp.netscape.com/newsref/std/cookie_spec.html"> /// * The Cookie Spec.</a></seealso> /// <param name="header">the <tt>Set-Cookie</tt> received from the server</param> /// <returns>an array of <tt>Cookie</tt>s parsed from the Set-Cookie value</returns> /// <exception cref="Apache.Http.Cookie.MalformedCookieException">if an exception occurs during parsing /// </exception> public override IList <Apache.Http.Cookie.Cookie> Parse(Header header, CookieOrigin origin) { Args.NotNull(header, "Header"); Args.NotNull(origin, "Cookie origin"); if (!Sharpen.Runtime.EqualsIgnoreCase(header.GetName(), SM.SetCookie)) { throw new MalformedCookieException("Unrecognized cookie header '" + header.ToString () + "'"); } NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.Default; CharArrayBuffer buffer; ParserCursor cursor; if (header is FormattedHeader) { buffer = ((FormattedHeader)header).GetBuffer(); cursor = new ParserCursor(((FormattedHeader)header).GetValuePos(), buffer.Length( )); } else { string s = header.GetValue(); if (s == null) { throw new MalformedCookieException("Header value is null"); } buffer = new CharArrayBuffer(s.Length); buffer.Append(s); cursor = new ParserCursor(0, buffer.Length()); } return(Parse(new HeaderElement[] { parser.ParseHeader(buffer, cursor) }, origin)); }
/// <exception cref="Apache.Http.Cookie.MalformedCookieException"></exception> public virtual IList <Apache.Http.Cookie.Cookie> Parse(Header header, CookieOrigin origin) { Args.NotNull(header, "Header"); Args.NotNull(origin, "Cookie origin"); HeaderElement[] helems = header.GetElements(); bool versioned = false; bool netscape = false; foreach (HeaderElement helem in helems) { if (helem.GetParameterByName("version") != null) { versioned = true; } if (helem.GetParameterByName("expires") != null) { netscape = true; } } if (netscape || !versioned) { // Need to parse the header again, because Netscape style cookies do not correctly // support multiple header elements (comma cannot be treated as an element separator) NetscapeDraftHeaderParser parser = NetscapeDraftHeaderParser.Default; CharArrayBuffer buffer; ParserCursor cursor; if (header is FormattedHeader) { buffer = ((FormattedHeader)header).GetBuffer(); cursor = new ParserCursor(((FormattedHeader)header).GetValuePos(), buffer.Length( )); } else { string s = header.GetValue(); if (s == null) { throw new MalformedCookieException("Header value is null"); } buffer = new CharArrayBuffer(s.Length); buffer.Append(s); cursor = new ParserCursor(0, buffer.Length()); } helems = new HeaderElement[] { parser.ParseHeader(buffer, cursor) }; return(GetCompat().Parse(helems, origin)); } else { if (SM.SetCookie2.Equals(header.GetName())) { return(GetStrict().Parse(helems, origin)); } else { return(GetObsoleteStrict().Parse(helems, origin)); } } }