Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
d4113561
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d4113561
编写于
11月 25, 2011
作者:
C
chegar
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7115150: java.net.HttpCookie code cleanup, style, formatting, typos
Reviewed-by: michaelm
上级
aec835c6
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
266 addition
and
366 deletion
+266
-366
src/share/classes/java/net/HttpCookie.java
src/share/classes/java/net/HttpCookie.java
+266
-366
未找到文件。
src/share/classes/java/net/HttpCookie.java
浏览文件 @
d4113561
...
...
@@ -31,17 +31,15 @@ import java.util.NoSuchElementException;
import
java.text.SimpleDateFormat
;
import
java.util.TimeZone
;
import
java.util.Date
;
import
java.lang.NullPointerException
;
// for javadoc
import
java.util.Locale
;
import
java.util.Objects
;
/**
* An HttpCookie object represents an
http
cookie, which carries state
* An HttpCookie object represents an
HTTP
cookie, which carries state
* information between server and user agent. Cookie is widely adopted
* to create stateful sessions.
*
* <p>
There are 3 http
cookie specifications:
* <p>
There are 3 HTTP
cookie specifications:
* <blockquote>
* Netscape draft<br>
* RFC 2109 - <a href="http://www.ietf.org/rfc/rfc2109.txt">
...
...
@@ -50,25 +48,19 @@ import java.util.Objects;
* <i>http://www.ietf.org/rfc/rfc2965.txt</i></a>
* </blockquote>
*
* <p>HttpCookie class can accept all these 3 forms of syntax.
* <p>
HttpCookie class can accept all these 3 forms of syntax.
*
* @author Edward Wang
* @since 1.6
*/
public
final
class
HttpCookie
implements
Cloneable
{
/
* ---------------- Fields -------------- */
/
/ ---------------- Fields --------------
//
// The value of the cookie itself.
//
private
String
name
;
// NAME= ... "$Name" style is reserved
private
final
String
name
;
// NAME= ... "$Name" style is reserved
private
String
value
;
// value of NAME
//
// Attributes encoded in the header's cookie fields.
//
private
String
comment
;
// Comment=VALUE ... describes cookie's use
private
String
commentURL
;
// CommentURL="http URL" ... describes cookie's use
private
boolean
toDiscard
;
// Discard ... discard cookie unconditionally
...
...
@@ -80,70 +72,61 @@ public final class HttpCookie implements Cloneable {
private
boolean
httpOnly
;
// HttpOnly ... i.e. not accessible to scripts
private
int
version
=
1
;
// Version=1 ... RFC 2965 style
//
// Hold the creation time (in seconds) of the http cookie for later
// expiration calculation
//
private
long
whenCreated
=
0
;
private
final
long
whenCreated
;
//
// Since the positive and zero max-age have their meanings,
// this value serves as a hint as 'not specify max-age'
//
private
final
static
long
MAX_AGE_UNSPECIFIED
=
-
1
;
//
// date formats used by Netscape's cookie draft
// as well as formats seen on various sites
//
private
final
static
String
[]
COOKIE_DATE_FORMATS
=
{
"EEE',' dd-MMM-yyyy HH:mm:ss 'GMT'"
,
"EEE',' dd MMM yyyy HH:mm:ss 'GMT'"
,
"EEE MMM dd yyyy HH:mm:ss 'GMT'Z"
};
//
// constant strings represent set-cookie header token
//
private
final
static
String
SET_COOKIE
=
"set-cookie:"
;
private
final
static
String
SET_COOKIE2
=
"set-cookie2:"
;
/* ---------------- Ctors -------------- */
// ---------------- Ctors --------------
/**
* Constructs a cookie with a specified name and value.
*
* <p>The name must conform to RFC 2965. That means it can contain
* <p>
The name must conform to RFC 2965. That means it can contain
* only ASCII alphanumeric characters and cannot contain commas,
* semicolons, or white space or begin with a $ character. The cookie's
* name cannot be changed after creation.
*
* <p>The value can be anything the server chooses to send. Its
* <p>
The value can be anything the server chooses to send. Its
* value is probably of interest only to the server. The cookie's
* value can be changed after creation with the
*
<code>setValue</code>
method.
*
{@code setValue}
method.
*
* <p>By default, cookies are created according to the RFC 2965
* <p>
By default, cookies are created according to the RFC 2965
* cookie specification. The version can be changed with the
*
<code>setVersion</code>
method.
*
{@code setVersion}
method.
*
*
* @param name a <code>String</code> specifying the name of the cookie
* @param name
* a {@code String} specifying the name of the cookie
*
* @param value a <code>String</code> specifying the value of the cookie
* @param value
* a {@code String} specifying the value of the cookie
*
* @throws IllegalArgumentException
* if the cookie name contains illegal characters or it is one of
* the tokens reserved for use by the cookie protocol
* @throws NullPointerException
* if {@code name} is {@code null}
*
* @throws IllegalArgumentException if the cookie name contains illegal characters
* or it is one of the tokens reserved for use
* by the cookie protocol
* @throws NullPointerException if <tt>name</tt> is <tt>null</tt>
* @see #setValue
* @see #setVersion
*
*/
public
HttpCookie
(
String
name
,
String
value
)
{
name
=
name
.
trim
();
if
(
name
.
length
()
==
0
||
!
isToken
(
name
)
||
isReserved
(
name
))
{
...
...
@@ -159,23 +142,25 @@ public final class HttpCookie implements Cloneable {
portlist
=
null
;
}
/**
* Constructs cookies from set-cookie or set-cookie2 header string.
* RFC 2965 section 3.2.2 set-cookie2 syntax indicates that one header line
* may contain more than one cookie definitions, so this is a static
* utility method instead of another constructor.
*
* @param header a <tt>String</tt> specifying the set-cookie header.
* The header should start with "set-cookie", or "set-cookie2"
* token; or it should have no leading token at all.
* @return a List of cookie parsed from header line string
* @throws IllegalArgumentException if header string violates the cookie
* specification's syntax, or the cookie
* name contains llegal characters, or
* the cookie name is one of the tokens
* reserved for use by the cookie protocol
* @throws NullPointerException if the header string is <tt>null</tt>
* @param header
* a {@code String} specifying the set-cookie header. The header
* should start with "set-cookie", or "set-cookie2" token; or it
* should have no leading token at all.
*
* @return a List of cookie parsed from header line string
*
* @throws IllegalArgumentException
* if header string violates the cookie specification's syntax, or
* the cookie name contains illegal characters, or the cookie name
* is one of the tokens reserved for use by the cookie protocol
* @throws NullPointerException
* if the header string is {@code null}
*/
public
static
List
<
HttpCookie
>
parse
(
String
header
)
{
int
version
=
guessCookieVersion
(
header
);
...
...
@@ -187,10 +172,9 @@ public final class HttpCookie implements Cloneable {
header
=
header
.
substring
(
SET_COOKIE
.
length
());
}
List
<
HttpCookie
>
cookies
=
new
java
.
util
.
ArrayList
<
HttpCookie
>();
// The Netscape cookie may have a comma in its expires attribute,
// while the comma is the delimiter in rfc 2965/2109 cookie header string.
List
<
HttpCookie
>
cookies
=
new
java
.
util
.
ArrayList
<>();
// The Netscape cookie may have a comma in its expires attribute, while
// the comma is the delimiter in rfc 2965/2109 cookie header string.
// so the parse logic is slightly different
if
(
version
==
0
)
{
// Netscape draft cookie
...
...
@@ -212,17 +196,13 @@ public final class HttpCookie implements Cloneable {
return
cookies
;
}
/* ---------------- Public operations -------------- */
// ---------------- Public operations --------------
/**
* Reports whether this
http
cookie has expired or not.
* Reports whether this
HTTP
cookie has expired or not.
*
* @return
<tt>true</tt> to indicate this http
cookie has expired;
* otherwise,
<tt>false</tt>
* @return
{@code true} to indicate this HTTP
cookie has expired;
* otherwise,
{@code false}
*/
public
boolean
hasExpired
()
{
if
(
maxAge
==
0
)
return
true
;
...
...
@@ -240,155 +220,123 @@ public final class HttpCookie implements Cloneable {
}
/**
*
* Specifies a comment that describes a cookie's purpose.
* The comment is useful if the browser presents the cookie
* to the user. Comments
* are not supported by Netscape Version 0 cookies.
* to the user. Comments are not supported by Netscape Version 0 cookies.
*
* @param purpose a <code>String</code> specifying the comment
* to display to the user
*
* @see #getComment
* @param purpose
* a {@code String} specifying the comment to display to the user
*
* @see #getComment
*/
public
void
setComment
(
String
purpose
)
{
comment
=
purpose
;
}
/**
* Returns the comment describing the purpose of this cookie, or
*
<code>null</code>
if the cookie has no comment.
*
{@code null}
if the cookie has no comment.
*
* @return a <code>String</code> containing the comment,
* or <code>null</code> if none
*
* @see #setComment
* @return a {@code String} containing the comment, or {@code null} if none
*
* @see #setComment
*/
public
String
getComment
()
{
return
comment
;
}
/**
* Specifies a comment URL that describes a cookie's purpose.
* The comment URL is useful if the browser presents the cookie
* to the user. Comment URL is RFC 2965 only.
*
* Specifies a comment url that describes a cookie's purpose.
* The comment url is useful if the browser presents the cookie
* to the user. Comment url is RFC 2965 only.
*
* @param purpose a <code>String</code> specifying the comment url
* to display to the user
*
* @see #getCommentURL
* @param purpose
* a {@code String} specifying the comment URL to display to the user
*
* @see #getCommentURL
*/
public
void
setCommentURL
(
String
purpose
)
{
commentURL
=
purpose
;
}
/**
* Returns the comment url describing the purpose of this cookie, or
* <code>null</code> if the cookie has no comment url.
*
* @return a <code>String</code> containing the comment url,
* or <code>null</code> if none
* Returns the comment URL describing the purpose of this cookie, or
* {@code null} if the cookie has no comment URL.
*
* @see #setCommentURL
* @return a {@code String} containing the comment URL, or {@code null}
* if none
*
* @see #setCommentURL
*/
public
String
getCommentURL
()
{
return
commentURL
;
}
/**
* Specify whether user agent should discard the cookie unconditionally.
* This is RFC 2965 only attribute.
*
* @param discard <tt>true</tt> indicates to discard cookie unconditionally
* @param discard
* {@code true} indicates to discard cookie unconditionally
*
* @see #getDiscard
* @see
#getDiscard
*/
public
void
setDiscard
(
boolean
discard
)
{
toDiscard
=
discard
;
}
/**
* Return the discard attribute of the cookie
* Return
s
the discard attribute of the cookie
*
* @return a
<tt>boolean</tt>
to represent this cookie's discard attribute
* @return a
{@code boolean}
to represent this cookie's discard attribute
*
* @see #setDiscard
* @see
#setDiscard
*/
public
boolean
getDiscard
()
{
return
toDiscard
;
}
/**
* Specify the portlist of the cookie, which restricts the port(s)
* to which a cookie may be sent back in a Cookie header.
*
* @param ports a <tt>String</tt> specify the port list, which is
* comma seperated series of digits
* @see #getPortlist
* @param ports
* a {@code String} specify the port list, which is comma separated
* series of digits
*
* @see #getPortlist
*/
public
void
setPortlist
(
String
ports
)
{
portlist
=
ports
;
}
/**
* Return the port list attribute of the cookie
* Return
s
the port list attribute of the cookie
*
* @return a
<tt>String</tt> contains the port list
*
or <tt>null</tt> if none
* @see #setPortlist
* @return a
{@code String} contains the port list or {@code null} if none
*
* @see
#setPortlist
*/
public
String
getPortlist
()
{
return
portlist
;
}
/**
*
* Specifies the domain within which this cookie should be presented.
*
* <p>The form of the domain name is specified by RFC 2965. A domain
* name begins with a dot (
<code>.foo.com</code>
) and means that
* <p>
The form of the domain name is specified by RFC 2965. A domain
* name begins with a dot (
{@code .foo.com}
) and means that
* the cookie is visible to servers in a specified Domain Name System
* (DNS) zone (for example,
<code>www.foo.com</code>
, but not
*
<code>a.b.foo.com</code>
). By default, cookies are only returned
* (DNS) zone (for example,
{@code www.foo.com}
, but not
*
{@code a.b.foo.com}
). By default, cookies are only returned
* to the server that sent them.
*
* @param pattern
* a {@code String} containing the domain name within which this
* cookie is visible; form is according to RFC 2965
*
* @param pattern a <code>String</code> containing the domain name
* within which this cookie is visible;
* form is according to RFC 2965
*
* @see #getDomain
*
* @see #getDomain
*/
public
void
setDomain
(
String
pattern
)
{
if
(
pattern
!=
null
)
domain
=
pattern
.
toLowerCase
();
...
...
@@ -396,261 +344,187 @@ public final class HttpCookie implements Cloneable {
domain
=
pattern
;
}
/**
* Returns the domain name set for this cookie. The form of
*
the domain name
is set by RFC 2965.
* Returns the domain name set for this cookie. The form of
the domain name
* is set by RFC 2965.
*
* @return a <code>String</code> containing the domain name
*
* @see #setDomain
* @return a {@code String} containing the domain name
*
* @see #setDomain
*/
public
String
getDomain
()
{
return
domain
;
}
/**
* Sets the maximum age of the cookie in seconds.
*
* <p>A positive value indicates that the cookie will expire
* <p>
A positive value indicates that the cookie will expire
* after that many seconds have passed. Note that the value is
* the <i>maximum</i> age when the cookie will expire, not the cookie's
* current age.
*
* <p>A negative value means
* that the cookie is not stored persistently and will be deleted
* when the Web browser exits. A zero value causes the cookie
* to be deleted.
*
* @param expiry an integer specifying the maximum age of the
* cookie in seconds; if zero, the cookie
* should be discarded immediately;
* otherwise, the cookie's max age is unspecified.
* <p> A negative value means that the cookie is not stored persistently
* and will be deleted when the Web browser exits. A zero value causes the
* cookie to be deleted.
*
* @see #getMaxAge
* @param expiry
* an integer specifying the maximum age of the cookie in seconds;
* if zero, the cookie should be discarded immediately; otherwise,
* the cookie's max age is unspecified.
*
* @see #getMaxAge
*/
public
void
setMaxAge
(
long
expiry
)
{
maxAge
=
expiry
;
}
/**
* Returns the maximum age of the cookie, specified in seconds.
* By default, <code>-1</code> indicating the cookie will persist
* until browser shutdown.
* Returns the maximum age of the cookie, specified in seconds. By default,
* {@code -1} indicating the cookie will persist until browser shutdown.
*
* @return an integer specifying the maximum age of the cookie in seconds
*
* @return an integer specifying the maximum age of the
* cookie in seconds
*
*
* @see #setMaxAge
*
* @see #setMaxAge
*/
public
long
getMaxAge
()
{
return
maxAge
;
}
/**
* Specifies a path for the cookie
* t
o which the client should return t
he cookie.
* Specifies a path for the cookie
to which the client should return
* the cookie.
*
* <p>The cookie is visible to all the pages in the directory
* <p>
The cookie is visible to all the pages in the directory
* you specify, and all the pages in that directory's subdirectories.
* A cookie's path must include the servlet that set the cookie,
* for example, <i>/catalog</i>, which makes the cookie
* visible to all directories on the server under <i>/catalog</i>.
*
* <p>Consult RFC 2965 (available on the Internet) for more
* <p>
Consult RFC 2965 (available on the Internet) for more
* information on setting path names for cookies.
*
* @param uri
* a {@code String} specifying a path
*
* @param uri a <code>String</code> specifying a path
*
*
* @see #getPath
*
* @see #getPath
*/
public
void
setPath
(
String
uri
)
{
path
=
uri
;
}
/**
* Returns the path on the server
* to which the browser returns this cookie. The
* cookie is visible to all subpaths on the server.
* Returns the path on the server to which the browser returns this cookie.
* The cookie is visible to all subpaths on the server.
*
* @return a {@code String} specifying a path that contains a servlet name,
* for example, <i>/catalog</i>
*
* @return a <code>String</code> specifying a path that contains
* a servlet name, for example, <i>/catalog</i>
*
* @see #setPath
*
* @see #setPath
*/
public
String
getPath
()
{
return
path
;
}
/**
* Indicates whether the cookie should only be sent using a secure protocol,
* such as HTTPS or SSL.
*
* <p>The default value is <code>false</code>.
*
* @param flag If <code>true</code>, the cookie can only be sent over
* a secure protocol like https.
* If <code>false</code>, it can be sent over any protocol.
* <p> The default value is {@code false}.
*
* @see #getSecure
* @param flag
* If {@code true}, the cookie can only be sent over a secure
* protocol like HTTPS. If {@code false}, it can be sent over
* any protocol.
*
* @see #getSecure
*/
public
void
setSecure
(
boolean
flag
)
{
secure
=
flag
;
}
/**
* Returns <code>true</code> if sending this cookie should be
* restricted to a secure protocol, or <code>false</code> if the
* it can be sent using any protocol.
*
* @return <code>false</code> if the cookie can be sent over
* any standard protocol; otherwise, <code>true</code>
* Returns {@code true} if sending this cookie should be restricted to a
* secure protocol, or {@code false} if the it can be sent using any
* protocol.
*
* @see #setSecure
* @return {@code false} if the cookie can be sent over any standard
* protocol; otherwise, <code>true</code>
*
* @see #setSecure
*/
public
boolean
getSecure
()
{
return
secure
;
}
/**
* Returns the name of the cookie. The name cannot be changed after
* creation.
*
* @return a <code>String</code> specifying the cookie's name
*
* @return a {@code String} specifying the cookie's name
*/
public
String
getName
()
{
return
name
;
}
/**
*
* Assigns a new value to a cookie after the cookie is created.
* If you use a binary value, you may want to use BASE64 encoding.
*
* <p>With Version 0 cookies, values should not contain white
* space, brackets, parentheses, equals signs, commas,
* double quotes, slashes, question marks, at signs, colons,
* and semicolons. Empty values may not behave the same way
* on all browsers.
* <p> With Version 0 cookies, values should not contain white space,
* brackets, parentheses, equals signs, commas, double quotes, slashes,
* question marks, at signs, colons, and semicolons. Empty values may not
* behave the same way on all browsers.
*
* @param newValue a <code>String</code> specifying the new value
*
*
* @see #getValue
* @param newValue
* a {@code String} specifying the new value
*
* @see #getValue
*/
public
void
setValue
(
String
newValue
)
{
value
=
newValue
;
}
/**
* Returns the value of the cookie.
*
* @return a <code>String</code> containing the cookie's
* present value
*
* @see #setValue
* @return a {@code String} containing the cookie's present value
*
* @see #setValue
*/
public
String
getValue
()
{
return
value
;
}
/**
* Returns the version of the protocol this cookie complies
* with. Version 1 complies with RFC 2965/2109,
* and version 0 complies with the original
* cookie specification drafted by Netscape. Cookies provided
* by a browser use and identify the browser's cookie version.
*
* Returns the version of the protocol this cookie complies with. Version 1
* complies with RFC 2965/2109, and version 0 complies with the original
* cookie specification drafted by Netscape. Cookies provided by a browser
* use and identify the browser's cookie version.
*
* @return 0 if the cookie complies with the
* original Netscape specification; 1
* if the cookie complies with RFC 2965/2109
*
* @see #setVersion
* @return 0 if the cookie complies with the original Netscape
* specification; 1 if the cookie complies with RFC 2965/2109
*
* @see #setVersion
*/
public
int
getVersion
()
{
return
version
;
}
/**
* Sets the version of the cookie protocol this cookie complies
* with. Version 0 complies with the original Netscape cookie
* specification. Version 1 complies with RFC 2965/2109.
*
* @param v
* 0 if the cookie should comply with the original Netscape
* specification; 1 if the cookie should comply with RFC 2965/2109
*
* @param v 0 if the cookie should comply with
* the original Netscape specification;
* 1 if the cookie should comply with RFC 2965/2109
*
* @throws IllegalArgumentException if <tt>v</tt> is neither 0 nor 1
*
* @see #getVersion
* @throws IllegalArgumentException
* if {@code v} is neither 0 nor 1
*
* @see #getVersion
*/
public
void
setVersion
(
int
v
)
{
if
(
v
!=
0
&&
v
!=
1
)
{
throw
new
IllegalArgumentException
(
"cookie version should be 0 or 1"
);
...
...
@@ -664,11 +538,11 @@ public final class HttpCookie implements Cloneable {
* attribute. This means that the cookie should not be accessible to
* scripting engines, like javascript.
*
* @return {@code true} if this cookie should be considered http only.
* @see #setHttpOnly(boolean)
* @return {@code true} if this cookie should be considered HTTPOnly
*
* @see #setHttpOnly(boolean)
*/
public
boolean
isHttpOnly
()
{
public
boolean
isHttpOnly
()
{
return
httpOnly
;
}
...
...
@@ -677,24 +551,25 @@ public final class HttpCookie implements Cloneable {
* {@code true} it means the cookie should not be accessible to scripting
* engines like javascript.
*
* @param httpOnly if {@code true} make the cookie HTTP only, i.e.
* only visible as part of an HTTP request.
* @see #isHttpOnly()
* @param httpOnly
* if {@code true} make the cookie HTTP only, i.e. only visible as
* part of an HTTP request.
*
* @see #isHttpOnly()
*/
public
void
setHttpOnly
(
boolean
httpOnly
)
{
public
void
setHttpOnly
(
boolean
httpOnly
)
{
this
.
httpOnly
=
httpOnly
;
}
/**
* The utility method to check whether a host name is in a domain
* or not.
* The utility method to check whether a host name is in a domain or not.
*
* <p>This concept is described in the cookie specification.
* <p>
This concept is described in the cookie specification.
* To understand the concept, some terminologies need to be defined first:
* <blockquote>
* effective host name = hostname if host name contains dot<br>
* or = hostname.local if not
*
* or = hostname.local if not
* </blockquote>
* <p>Host A's name domain-matches host B's if:
* <blockquote><ul>
...
...
@@ -731,9 +606,13 @@ public final class HttpCookie implements Cloneable {
* host is example.local, and example.local domain-matches .local.</li>
* </ul></blockquote>
*
* @param domain the domain name to check host name with
* @param host the host name in question
* @return <tt>true</tt> if they domain-matches; <tt>false</tt> if not
* @param domain
* the domain name to check host name with
*
* @param host
* the host name in question
*
* @return {@code true} if they domain-matches; {@code false} if not
*/
public
static
boolean
domainMatches
(
String
domain
,
String
host
)
{
if
(
domain
==
null
||
host
==
null
)
...
...
@@ -745,7 +624,8 @@ public final class HttpCookie implements Cloneable {
if
(
embeddedDotInDomain
==
0
)
embeddedDotInDomain
=
domain
.
indexOf
(
'.'
,
1
);
if
(!
isLocalDomain
&&
(
embeddedDotInDomain
==
-
1
||
embeddedDotInDomain
==
domain
.
length
()
-
1
))
&&
(
embeddedDotInDomain
==
-
1
||
embeddedDotInDomain
==
domain
.
length
()
-
1
))
return
false
;
// if the host name contains no dot and the domain name
...
...
@@ -779,7 +659,6 @@ public final class HttpCookie implements Cloneable {
return
false
;
}
/**
* Constructs a cookie header string representation of this cookie,
* which is in the format defined by corresponding cookie specification,
...
...
@@ -796,17 +675,15 @@ public final class HttpCookie implements Cloneable {
}
}
/**
* Test the equality of two
http
cookies.
* Test the equality of two
HTTP
cookies.
*
* <p> The result is <tt>true</tt> only if two cookies
* come from same domain (case-insensitive),
* have same name (case-insensitive),
* and have same path (case-sensitive).
* <p> The result is {@code true} only if two cookies come from same domain
* (case-insensitive), have same name (case-insensitive), and have same path
* (case-sensitive).
*
* @return
<tt>true</tt> if 2 http
cookies equal to each other;
*
otherwise, <tt>false</tt>
* @return
{@code true} if two HTTP
cookies equal to each other;
*
otherwise, {@code false}
*/
@Override
public
boolean
equals
(
Object
obj
)
{
...
...
@@ -825,19 +702,17 @@ public final class HttpCookie implements Cloneable {
Objects
.
equals
(
getPath
(),
other
.
getPath
());
}
/**
* Return hash code of this http cookie. The result is the sum of
* hash code value of three significant components of this cookie:
* name, domain, and path.
* That is, the hash code is the value of the expression:
* Returns the hash code of this HTTP cookie. The result is the sum of
* hash code value of three significant components of this cookie: name,
* domain, and path. That is, the hash code is the value of the expression:
* <blockquote>
* getName().toLowerCase().hashCode()<br>
* + getDomain().toLowerCase().hashCode()<br>
* + getPath().hashCode()
* </blockquote>
*
* @return
this http
cookie's hash code
* @return
this HTTP
cookie's hash code
*/
@Override
public
int
hashCode
()
{
...
...
@@ -851,7 +726,7 @@ public final class HttpCookie implements Cloneable {
/**
* Create and return a copy of this object.
*
* @return
a clone of this http
cookie
* @return
a clone of this HTTP
cookie
*/
@Override
public
Object
clone
()
{
...
...
@@ -862,8 +737,7 @@ public final class HttpCookie implements Cloneable {
}
}
/* ---------------- Private operations -------------- */
// ---------------- Private operations --------------
// Note -- disabled for now to allow full Netscape compatibility
// from RFC 2068, token special case characters
...
...
@@ -872,15 +746,14 @@ public final class HttpCookie implements Cloneable {
private
static
final
String
tspecials
=
",;"
;
/*
* Tests a string and returns true if the string counts as a
* token.
* Tests a string and returns true if the string counts as a token.
*
* @param value the <code>String</code> to be tested
* @param value
* the {@code String} to be tested
*
* @return
<code>true</code> if the <code>String</code> is
*
a token; <code>false</code>
if it is not
* @return
{@code true} if the {@code String} is a token;
*
{@code false}
if it is not
*/
private
static
boolean
isToken
(
String
value
)
{
int
len
=
value
.
length
();
...
...
@@ -893,11 +766,12 @@ public final class HttpCookie implements Cloneable {
return
true
;
}
/*
* @param name the name to be tested
* @return <tt>true</tt> if the name is reserved by cookie
* specification, <tt>false</tt> if it is not
* @param name
* the name to be tested
*
* @return {@code true} if the name is reserved by cookie specification,
* {@code false} if it is not
*/
private
static
boolean
isReserved
(
String
name
)
{
if
(
name
.
equalsIgnoreCase
(
"Comment"
)
...
...
@@ -919,16 +793,16 @@ public final class HttpCookie implements Cloneable {
return
false
;
}
/*
* Parse header string to cookie object.
*
* @param header header string; should contain only one NAME=VALUE pair
* @param header
* header string; should contain only one NAME=VALUE pair
*
* @return
an HttpCookie being extracted
* @return an HttpCookie being extracted
*
* @throws
IllegalArgumentException if header string violates the cookie
*
specification
* @throws
IllegalArgumentException
*
if header string violates the cookie
specification
*/
private
static
HttpCookie
parseInternal
(
String
header
)
{
...
...
@@ -974,69 +848,97 @@ public final class HttpCookie implements Cloneable {
return
cookie
;
}
/*
* assign cookie attribute value to attribute name;
* use a map to simulate method dispatch
*/
static
interface
CookieAttributeAssignor
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
);
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
);
}
static
java
.
util
.
Map
<
String
,
CookieAttributeAssignor
>
assignors
=
null
;
static
final
java
.
util
.
Map
<
String
,
CookieAttributeAssignor
>
assignors
=
new
java
.
util
.
HashMap
<>();
static
{
assignors
=
new
java
.
util
.
HashMap
<
String
,
CookieAttributeAssignor
>();
assignors
.
put
(
"comment"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getComment
()
==
null
)
cookie
.
setComment
(
attrValue
);
assignors
.
put
(
"comment"
,
new
CookieAttributeAssignor
()
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getComment
()
==
null
)
cookie
.
setComment
(
attrValue
);
}
});
assignors
.
put
(
"commenturl"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getCommentURL
()
==
null
)
cookie
.
setCommentURL
(
attrValue
);
assignors
.
put
(
"commenturl"
,
new
CookieAttributeAssignor
()
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getCommentURL
()
==
null
)
cookie
.
setCommentURL
(
attrValue
);
}
});
assignors
.
put
(
"discard"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
assignors
.
put
(
"discard"
,
new
CookieAttributeAssignor
()
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
cookie
.
setDiscard
(
true
);
}
});
assignors
.
put
(
"domain"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getDomain
()
==
null
)
cookie
.
setDomain
(
attrValue
);
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getDomain
()
==
null
)
cookie
.
setDomain
(
attrValue
);
}
});
assignors
.
put
(
"max-age"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
try
{
long
maxage
=
Long
.
parseLong
(
attrValue
);
if
(
cookie
.
getMaxAge
()
==
MAX_AGE_UNSPECIFIED
)
cookie
.
setMaxAge
(
maxage
);
if
(
cookie
.
getMaxAge
()
==
MAX_AGE_UNSPECIFIED
)
cookie
.
setMaxAge
(
maxage
);
}
catch
(
NumberFormatException
ignored
)
{
throw
new
IllegalArgumentException
(
"Illegal cookie max-age attribute"
);
throw
new
IllegalArgumentException
(
"Illegal cookie max-age attribute"
);
}
}
});
assignors
.
put
(
"path"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getPath
()
==
null
)
cookie
.
setPath
(
attrValue
);
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getPath
()
==
null
)
cookie
.
setPath
(
attrValue
);
}
});
assignors
.
put
(
"port"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getPortlist
()
==
null
)
cookie
.
setPortlist
(
attrValue
==
null
?
""
:
attrValue
);
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getPortlist
()
==
null
)
cookie
.
setPortlist
(
attrValue
==
null
?
""
:
attrValue
);
}
});
assignors
.
put
(
"secure"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
cookie
.
setSecure
(
true
);
}
});
assignors
.
put
(
"httponly"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
cookie
.
setHttpOnly
(
true
);
}
});
assignors
.
put
(
"version"
,
new
CookieAttributeAssignor
(){
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
try
{
int
version
=
Integer
.
parseInt
(
attrValue
);
cookie
.
setVersion
(
version
);
...
...
@@ -1046,7 +948,9 @@ public final class HttpCookie implements Cloneable {
}
});
assignors
.
put
(
"expires"
,
new
CookieAttributeAssignor
(){
// Netscape only
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
public
void
assign
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
{
if
(
cookie
.
getMaxAge
()
==
MAX_AGE_UNSPECIFIED
)
{
cookie
.
setMaxAge
(
cookie
.
expiryDate2DeltaSeconds
(
attrValue
));
}
...
...
@@ -1054,8 +958,8 @@ public final class HttpCookie implements Cloneable {
});
}
private
static
void
assignAttribute
(
HttpCookie
cookie
,
String
attrName
,
String
attrValue
)
String
attrName
,
String
attrValue
)
{
// strip off the surrounding "-sign if there's any
attrValue
=
stripOffSurroundingQuote
(
attrValue
);
...
...
@@ -1073,11 +977,7 @@ public final class HttpCookie implements Cloneable {
* as Netscape spec, but without leading "Cookie:" token.
*/
private
String
toNetscapeHeaderString
()
{
StringBuilder
sb
=
new
StringBuilder
();
sb
.
append
(
getName
()
+
"="
+
getValue
());
return
sb
.
toString
();
return
getName
()
+
"="
+
getValue
();
}
/*
...
...
@@ -1101,15 +1001,16 @@ public final class HttpCookie implements Cloneable {
static
final
TimeZone
GMT
=
TimeZone
.
getTimeZone
(
"GMT"
);
/*
* @param
dateString a date string in one of the formats
*
defined in Netscape cookie spec
* @param
dateString
*
a date string in one of the formats
defined in Netscape cookie spec
*
* @return
delta seconds between this cookie's creation
*
time and the time
specified by dateString
* @return
delta seconds between this cookie's creation time and the time
* specified by dateString
*/
private
long
expiryDate2DeltaSeconds
(
String
dateString
)
{
for
(
int
i
=
0
;
i
<
COOKIE_DATE_FORMATS
.
length
;
i
++)
{
SimpleDateFormat
df
=
new
SimpleDateFormat
(
COOKIE_DATE_FORMATS
[
i
],
Locale
.
US
);
SimpleDateFormat
df
=
new
SimpleDateFormat
(
COOKIE_DATE_FORMATS
[
i
],
Locale
.
US
);
df
.
setTimeZone
(
GMT
);
try
{
Date
date
=
df
.
parse
(
dateString
);
...
...
@@ -1121,8 +1022,6 @@ public final class HttpCookie implements Cloneable {
return
0
;
}
/*
* try to guess the cookie version through set-cookie header string
*/
...
...
@@ -1184,10 +1083,10 @@ public final class HttpCookie implements Cloneable {
* 2) but not the comma surrounding by double-quotes, which is the comma
* inside port list or embeded URIs.
*
* @param header the cookie header string to split
*
* @return list of strings; never null
* @param header
* the cookie header string to split
*
* @return list of strings; never null
*/
private
static
List
<
String
>
splitMultiCookies
(
String
header
)
{
List
<
String
>
cookies
=
new
java
.
util
.
ArrayList
<
String
>();
...
...
@@ -1197,7 +1096,8 @@ public final class HttpCookie implements Cloneable {
for
(
p
=
0
,
q
=
0
;
p
<
header
.
length
();
p
++)
{
char
c
=
header
.
charAt
(
p
);
if
(
c
==
'"'
)
quoteCount
++;
if
(
c
==
','
&&
(
quoteCount
%
2
==
0
))
{
// it is comma and not surrounding by double-quotes
if
(
c
==
','
&&
(
quoteCount
%
2
==
0
))
{
// it is comma and not surrounding by double-quotes
cookies
.
add
(
header
.
substring
(
q
,
p
));
q
=
p
+
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录