Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
halo
rockchip_libcore
Commits
956162ed
Commit
956162ed
authored
13 years ago
by
Jesse Wilson
Committed by
Android (Google) Code Review
13 years ago
Browse files
Options
Download
Plain Diff
Merge "Make HTTP implementation details public for CTS tests."
parents
e137adb9
ed211506
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
268 additions
and
122 deletions
+268
-122
luni/src/main/java/libcore/net/http/HttpEngine.java
luni/src/main/java/libcore/net/http/HttpEngine.java
+22
-21
luni/src/main/java/libcore/net/http/HttpResponseCache.java
luni/src/main/java/libcore/net/http/HttpResponseCache.java
+4
-3
luni/src/main/java/libcore/net/http/HttpURLConnectionImpl.java
...src/main/java/libcore/net/http/HttpURLConnectionImpl.java
+7
-7
luni/src/main/java/libcore/net/http/HttpsURLConnectionImpl.java
...rc/main/java/libcore/net/http/HttpsURLConnectionImpl.java
+4
-4
luni/src/main/java/libcore/net/http/RawHeaders.java
luni/src/main/java/libcore/net/http/RawHeaders.java
+1
-1
luni/src/main/java/libcore/net/http/RequestHeaders.java
luni/src/main/java/libcore/net/http/RequestHeaders.java
+92
-20
luni/src/main/java/libcore/net/http/ResponseHeaders.java
luni/src/main/java/libcore/net/http/ResponseHeaders.java
+103
-31
luni/src/test/java/libcore/net/http/ParsedHeadersTest.java
luni/src/test/java/libcore/net/http/ParsedHeadersTest.java
+35
-35
No files found.
luni/src/main/java/libcore/net/http/HttpEngine.java
View file @
956162ed
...
...
@@ -218,7 +218,7 @@ public class HttpEngine {
* headers may forbid network use. In that case, dispose of the network
* response and use a BAD_GATEWAY response instead.
*/
if
(
requestHeaders
.
o
nlyIfCached
&&
responseSource
.
requiresConnection
())
{
if
(
requestHeaders
.
isO
nlyIfCached
()
&&
responseSource
.
requiresConnection
())
{
if
(
responseSource
==
ResponseSource
.
CONDITIONAL_CACHE
)
{
IoUtils
.
closeQuietly
(
cachedResponseBody
);
}
...
...
@@ -247,7 +247,7 @@ public class HttpEngine {
}
CacheResponse
candidate
=
responseCache
.
get
(
uri
,
method
,
requestHeaders
.
h
eaders
.
toMultimap
());
requestHeaders
.
getH
eaders
()
.
toMultimap
());
if
(
candidate
==
null
)
{
return
;
}
...
...
@@ -341,9 +341,9 @@ public class HttpEngine {
}
else
if
(
sendChunked
)
{
writeRequestHeaders
(-
1
);
requestBodyOut
=
new
ChunkedOutputStream
(
requestOut
,
chunkLength
);
}
else
if
(
requestHeaders
.
c
ontentLength
!=
-
1
)
{
writeRequestHeaders
(
requestHeaders
.
c
ontentLength
);
requestBodyOut
=
new
RetryableOutputStream
(
requestHeaders
.
c
ontentLength
);
}
else
if
(
requestHeaders
.
getC
ontentLength
()
!=
-
1
)
{
writeRequestHeaders
(
requestHeaders
.
getC
ontentLength
()
);
requestBodyOut
=
new
RetryableOutputStream
(
requestHeaders
.
getC
ontentLength
()
);
}
else
{
requestBodyOut
=
new
RetryableOutputStream
();
}
...
...
@@ -358,7 +358,7 @@ public class HttpEngine {
throw
new
IllegalStateException
();
}
this
.
responseHeaders
=
headers
;
this
.
httpMinorVersion
=
responseHeaders
.
h
eaders
.
getHttpMinorVersion
();
this
.
httpMinorVersion
=
responseHeaders
.
getH
eaders
()
.
getHttpMinorVersion
();
if
(
body
!=
null
)
{
initContentStream
(
body
);
}
...
...
@@ -397,7 +397,7 @@ public class HttpEngine {
if
(
responseHeaders
==
null
)
{
throw
new
IllegalStateException
();
}
return
responseHeaders
.
h
eaders
.
getResponseCode
();
return
responseHeaders
.
getH
eaders
()
.
getResponseCode
();
}
public
final
InputStream
getResponseBody
()
{
...
...
@@ -527,9 +527,9 @@ public class HttpEngine {
return
new
ChunkedInputStream
(
socketIn
,
cacheRequest
,
this
);
}
if
(
responseHeaders
.
c
ontentLength
!=
-
1
)
{
if
(
responseHeaders
.
getC
ontentLength
()
!=
-
1
)
{
return
new
FixedLengthInputStream
(
socketIn
,
cacheRequest
,
this
,
responseHeaders
.
c
ontentLength
);
responseHeaders
.
getC
ontentLength
()
);
}
/*
...
...
@@ -555,7 +555,7 @@ public class HttpEngine {
* See RFC 2616 section 4.3.
*/
public
final
boolean
hasResponseBody
()
{
int
responseCode
=
responseHeaders
.
h
eaders
.
getResponseCode
();
int
responseCode
=
responseHeaders
.
getH
eaders
()
.
getResponseCode
();
if
(
method
!=
HEAD
&&
method
!=
CONNECT
&&
(
responseCode
<
HTTP_CONTINUE
||
responseCode
>=
200
)
...
...
@@ -569,7 +569,7 @@ public class HttpEngine {
* response code, the response is malformed. For best compatibility, we
* honor the headers.
*/
if
(
responseHeaders
.
c
ontentLength
!=
-
1
||
responseHeaders
.
isChunked
())
{
if
(
responseHeaders
.
getC
ontentLength
()
!=
-
1
||
responseHeaders
.
isChunked
())
{
return
true
;
}
...
...
@@ -581,7 +581,7 @@ public class HttpEngine {
* with chunked encoding.
*/
final
void
readTrailers
()
throws
IOException
{
readHeaders
(
responseHeaders
.
h
eaders
);
readHeaders
(
responseHeaders
.
getH
eaders
()
);
}
private
void
readHeaders
(
RawHeaders
headers
)
throws
IOException
{
...
...
@@ -638,7 +638,7 @@ public class HttpEngine {
* the connection is using a proxy.
*/
protected
RawHeaders
getNetworkRequestHeaders
()
throws
IOException
{
requestHeaders
.
h
eaders
.
setStatusLine
(
getRequestLine
());
requestHeaders
.
getH
eaders
()
.
setStatusLine
(
getRequestLine
());
int
fixedContentLength
=
policy
.
getFixedContentLength
();
if
(
fixedContentLength
!=
-
1
)
{
...
...
@@ -650,7 +650,7 @@ public class HttpEngine {
requestHeaders
.
setContentLength
(
contentLength
);
}
return
requestHeaders
.
h
eaders
;
return
requestHeaders
.
getH
eaders
()
;
}
/**
...
...
@@ -660,26 +660,26 @@ public class HttpEngine {
* doesn't know what content types the application is interested in.
*/
private
void
prepareRawRequestHeaders
()
throws
IOException
{
requestHeaders
.
h
eaders
.
setStatusLine
(
getRequestLine
());
requestHeaders
.
getH
eaders
()
.
setStatusLine
(
getRequestLine
());
if
(
requestHeaders
.
u
serAgent
==
null
)
{
if
(
requestHeaders
.
getU
serAgent
()
==
null
)
{
requestHeaders
.
setUserAgent
(
getDefaultUserAgent
());
}
if
(
requestHeaders
.
h
ost
==
null
)
{
if
(
requestHeaders
.
getH
ost
()
==
null
)
{
requestHeaders
.
setHost
(
getOriginAddress
(
policy
.
getURL
()));
}
if
(
httpMinorVersion
>
0
&&
requestHeaders
.
c
onnection
==
null
)
{
if
(
httpMinorVersion
>
0
&&
requestHeaders
.
getC
onnection
()
==
null
)
{
requestHeaders
.
setConnection
(
"Keep-Alive"
);
}
if
(
requestHeaders
.
a
cceptEncoding
==
null
)
{
if
(
requestHeaders
.
getA
cceptEncoding
()
==
null
)
{
transparentGzip
=
true
;
requestHeaders
.
setAcceptEncoding
(
"gzip"
);
}
if
(
hasRequestBody
()
&&
requestHeaders
.
c
ontentType
==
null
)
{
if
(
hasRequestBody
()
&&
requestHeaders
.
getC
ontentType
()
==
null
)
{
requestHeaders
.
setContentType
(
"application/x-www-form-urlencoded"
);
}
...
...
@@ -690,7 +690,8 @@ public class HttpEngine {
CookieHandler
cookieHandler
=
CookieHandler
.
getDefault
();
if
(
cookieHandler
!=
null
)
{
requestHeaders
.
addCookies
(
cookieHandler
.
get
(
uri
,
requestHeaders
.
headers
.
toMultimap
()));
requestHeaders
.
addCookies
(
cookieHandler
.
get
(
uri
,
requestHeaders
.
getHeaders
().
toMultimap
()));
}
}
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/HttpResponseCache.java
View file @
956162ed
...
...
@@ -166,7 +166,8 @@ public final class HttpResponseCache extends ResponseCache {
return
null
;
}
RawHeaders
varyHeaders
=
httpEngine
.
getRequestHeaders
().
headers
.
getAll
(
response
.
varyFields
);
RawHeaders
varyHeaders
=
httpEngine
.
getRequestHeaders
().
getHeaders
().
getAll
(
response
.
getVaryFields
());
Entry
entry
=
new
Entry
(
uri
,
varyHeaders
,
httpConnection
);
DiskLruCache
.
Editor
editor
=
null
;
try
{
...
...
@@ -202,11 +203,11 @@ public final class HttpResponseCache extends ResponseCache {
return
cache
;
}
synchronized
int
getWriteAbortCount
()
{
public
synchronized
int
getWriteAbortCount
()
{
return
writeAbortCount
;
}
synchronized
int
getWriteSuccessCount
()
{
public
synchronized
int
getWriteSuccessCount
()
{
return
writeSuccessCount
;
}
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/HttpURLConnectionImpl.java
View file @
956162ed
...
...
@@ -114,7 +114,7 @@ class HttpURLConnectionImpl extends HttpURLConnection {
*/
@Override
public
final
String
getHeaderField
(
int
position
)
{
try
{
return
getResponse
().
getResponseHeaders
().
h
eaders
.
getValue
(
position
);
return
getResponse
().
getResponseHeaders
().
getH
eaders
()
.
getValue
(
position
);
}
catch
(
IOException
e
)
{
return
null
;
}
...
...
@@ -127,7 +127,7 @@ class HttpURLConnectionImpl extends HttpURLConnection {
*/
@Override
public
final
String
getHeaderField
(
String
fieldName
)
{
try
{
RawHeaders
rawHeaders
=
getResponse
().
getResponseHeaders
().
h
eaders
;
RawHeaders
rawHeaders
=
getResponse
().
getResponseHeaders
().
getH
eaders
()
;
return
fieldName
==
null
?
rawHeaders
.
getStatusLine
()
:
rawHeaders
.
get
(
fieldName
);
...
...
@@ -138,7 +138,7 @@ class HttpURLConnectionImpl extends HttpURLConnection {
@Override
public
final
String
getHeaderFieldKey
(
int
position
)
{
try
{
return
getResponse
().
getResponseHeaders
().
h
eaders
.
getFieldName
(
position
);
return
getResponse
().
getResponseHeaders
().
getH
eaders
()
.
getFieldName
(
position
);
}
catch
(
IOException
e
)
{
return
null
;
}
...
...
@@ -146,7 +146,7 @@ class HttpURLConnectionImpl extends HttpURLConnection {
@Override
public
final
Map
<
String
,
List
<
String
>>
getHeaderFields
()
{
try
{
return
getResponse
().
getResponseHeaders
().
h
eaders
.
toMultimap
();
return
getResponse
().
getResponseHeaders
().
getH
eaders
()
.
toMultimap
();
}
catch
(
IOException
e
)
{
return
null
;
}
...
...
@@ -391,8 +391,8 @@ class HttpURLConnectionImpl extends HttpURLConnection {
// keep asking for username/password until authorized
String
challenge
=
responseCode
==
HTTP_PROXY_AUTH
?
response
.
p
roxyAuthenticate
:
response
.
w
wwAuthenticate
;
?
response
.
getP
roxyAuthenticate
()
:
response
.
getW
wwAuthenticate
()
;
if
(
challenge
==
null
)
{
throw
new
IOException
(
"Received authentication challenge is null"
);
}
...
...
@@ -472,7 +472,7 @@ class HttpURLConnectionImpl extends HttpURLConnection {
}
@Override
public
String
getResponseMessage
()
throws
IOException
{
return
getResponse
().
getResponseHeaders
().
h
eaders
.
getResponseMessage
();
return
getResponse
().
getResponseHeaders
().
getH
eaders
()
.
getResponseMessage
();
}
@Override
public
final
int
getResponseCode
()
throws
IOException
{
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/HttpsURLConnectionImpl.java
View file @
956162ed
...
...
@@ -485,7 +485,7 @@ final class HttpsURLConnectionImpl extends HttpsURLConnection {
*/
private
void
makeTunnel
(
HttpURLConnectionImpl
policy
,
HttpConnection
connection
,
RequestHeaders
requestHeaders
)
throws
IOException
{
RawHeaders
rawRequestHeaders
=
requestHeaders
.
h
eaders
;
RawHeaders
rawRequestHeaders
=
requestHeaders
.
getH
eaders
()
;
while
(
true
)
{
HttpEngine
connect
=
new
ProxyConnectEngine
(
policy
,
rawRequestHeaders
,
connection
);
connect
.
sendRequest
();
...
...
@@ -544,20 +544,20 @@ final class HttpsURLConnectionImpl extends HttpsURLConnection {
+
" HTTP/1.1"
);
// Always set Host and User-Agent.
String
host
=
privateHeaders
.
h
ost
;
String
host
=
privateHeaders
.
getH
ost
()
;
if
(
host
==
null
)
{
host
=
getOriginAddress
(
url
);
}
result
.
set
(
"Host"
,
host
);
String
userAgent
=
privateHeaders
.
u
serAgent
;
String
userAgent
=
privateHeaders
.
getU
serAgent
()
;
if
(
userAgent
==
null
)
{
userAgent
=
getDefaultUserAgent
();
}
result
.
set
(
"User-Agent"
,
userAgent
);
// Copy over the Proxy-Authorization header if it exists.
String
proxyAuthorization
=
privateHeaders
.
p
roxyAuthorization
;
String
proxyAuthorization
=
privateHeaders
.
getP
roxyAuthorization
()
;
if
(
proxyAuthorization
!=
null
)
{
result
.
set
(
"Proxy-Authorization"
,
proxyAuthorization
);
}
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/RawHeaders.java
View file @
956162ed
...
...
@@ -42,7 +42,7 @@ import java.util.TreeMap;
* <p>This class trims whitespace from values. It never returns values with
* leading or trailing whitespace.
*/
final
class
RawHeaders
{
public
final
class
RawHeaders
{
private
static
final
Comparator
<
String
>
FIELD_NAME_COMPARATOR
=
new
Comparator
<
String
>()
{
@FindBugsSuppressWarnings
(
"ES_COMPARING_PARAMETER_STRING_WITH_EQ"
)
@Override
public
int
compare
(
String
a
,
String
b
)
{
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/RequestHeaders.java
View file @
956162ed
...
...
@@ -24,15 +24,15 @@ import java.util.Map;
/**
* Parsed HTTP request headers.
*/
final
class
RequestHeaders
{
final
URI
uri
;
final
RawHeaders
headers
;
public
final
class
RequestHeaders
{
private
final
URI
uri
;
private
final
RawHeaders
headers
;
/** Don't use a cache to satisfy this request. */
boolean
noCache
;
int
maxAgeSeconds
=
-
1
;
int
maxStaleSeconds
=
-
1
;
int
minFreshSeconds
=
-
1
;
private
boolean
noCache
;
private
int
maxAgeSeconds
=
-
1
;
private
int
maxStaleSeconds
=
-
1
;
private
int
minFreshSeconds
=
-
1
;
/**
* This field's name "only-if-cached" is misleading. It actually means "do
...
...
@@ -41,25 +41,25 @@ final class RequestHeaders {
* would require validation (ie. conditional gets) are not permitted if this
* header is set.
*/
boolean
onlyIfCached
;
private
boolean
onlyIfCached
;
/**
* True if the request contains an authorization field. Although this isn't
* necessarily a shared cache, it follows the spec's strict requirements for
* shared caches.
*/
boolean
hasAuthorization
;
int
contentLength
=
-
1
;
String
transferEncoding
;
String
userAgent
;
String
host
;
String
connection
;
String
acceptEncoding
;
String
contentType
;
String
ifModifiedSince
;
String
ifNoneMatch
;
String
proxyAuthorization
;
private
boolean
hasAuthorization
;
private
int
contentLength
=
-
1
;
private
String
transferEncoding
;
private
String
userAgent
;
private
String
host
;
private
String
connection
;
private
String
acceptEncoding
;
private
String
contentType
;
private
String
ifModifiedSince
;
private
String
ifNoneMatch
;
private
String
proxyAuthorization
;
public
RequestHeaders
(
URI
uri
,
RawHeaders
headers
)
{
this
.
uri
=
uri
;
...
...
@@ -127,6 +127,78 @@ final class RequestHeaders {
return
"close"
.
equalsIgnoreCase
(
connection
);
}
public
URI
getUri
()
{
return
uri
;
}
public
RawHeaders
getHeaders
()
{
return
headers
;
}
public
boolean
isNoCache
()
{
return
noCache
;
}
public
int
getMaxAgeSeconds
()
{
return
maxAgeSeconds
;
}
public
int
getMaxStaleSeconds
()
{
return
maxStaleSeconds
;
}
public
int
getMinFreshSeconds
()
{
return
minFreshSeconds
;
}
public
boolean
isOnlyIfCached
()
{
return
onlyIfCached
;
}
public
boolean
hasAuthorization
()
{
return
hasAuthorization
;
}
public
int
getContentLength
()
{
return
contentLength
;
}
public
String
getTransferEncoding
()
{
return
transferEncoding
;
}
public
String
getUserAgent
()
{
return
userAgent
;
}
public
String
getHost
()
{
return
host
;
}
public
String
getConnection
()
{
return
connection
;
}
public
String
getAcceptEncoding
()
{
return
acceptEncoding
;
}
public
String
getContentType
()
{
return
contentType
;
}
public
String
getIfModifiedSince
()
{
return
ifModifiedSince
;
}
public
String
getIfNoneMatch
()
{
return
ifNoneMatch
;
}
public
String
getProxyAuthorization
()
{
return
proxyAuthorization
;
}
public
void
setChunked
()
{
if
(
this
.
transferEncoding
!=
null
)
{
headers
.
removeAll
(
"Transfer-Encoding"
);
...
...
This diff is collapsed.
Click to expand it.
luni/src/main/java/libcore/net/http/ResponseHeaders.java
View file @
956162ed
...
...
@@ -30,7 +30,7 @@ import libcore.util.Objects;
/**
* Parsed HTTP response headers.
*/
final
class
ResponseHeaders
{
public
final
class
ResponseHeaders
{
/** HTTP header name for the local time when the request was sent. */
private
static
final
String
SENT_MILLIS
=
"X-Android-Sent-Millis"
;
...
...
@@ -38,32 +38,32 @@ final class ResponseHeaders {
/** HTTP header name for the local time when the response was received. */
private
static
final
String
RECEIVED_MILLIS
=
"X-Android-Received-Millis"
;
final
URI
uri
;
final
RawHeaders
headers
;
private
final
URI
uri
;
private
final
RawHeaders
headers
;
/** The server's time when this response was served, if known. */
Date
servedDate
;
private
Date
servedDate
;
/** The last modified date of the response, if known. */
Date
lastModified
;
private
Date
lastModified
;
/**
* The expiration date of the response, if known. If both this field and the
* max age are set, the max age is preferred.
*/
Date
expires
;
private
Date
expires
;
/**
* Extension header set by HttpURLConnectionImpl specifying the timestamp
* when the HTTP request was first initiated.
*/
long
sentRequestMillis
;
private
long
sentRequestMillis
;
/**
* Extension header set by HttpURLConnectionImpl specifying the timestamp
* when the HTTP response was first received.
*/
long
receivedResponseMillis
;
private
long
receivedResponseMillis
;
/**
* In the response, this field's name "no-cache" is misleading. It doesn't
...
...
@@ -71,23 +71,23 @@ final class ResponseHeaders {
* the response with the origin server before returning it. We can do this
* with a conditional get.
*/
boolean
noCache
;
private
boolean
noCache
;
/** If true, this response should not be cached. */
boolean
noStore
;
private
boolean
noStore
;
/**
* The duration past the response's served date that it can be served
* without validation.
*/
int
maxAgeSeconds
=
-
1
;
private
int
maxAgeSeconds
=
-
1
;
/**
* The "s-maxage" directive is the max age for shared caches. Not to be
* confused with "max-age" for non-shared caches, As in Firefox and Chrome,
* this directive is not honored by this cache.
*/
int
sMaxAgeSeconds
=
-
1
;
private
int
sMaxAgeSeconds
=
-
1
;
/**
* This request header field's name "only-if-cached" is misleading. It
...
...
@@ -96,20 +96,20 @@ final class ResponseHeaders {
* Cached responses that would require validation (ie. conditional gets) are
* not permitted if this header is set.
*/
boolean
isPublic
;
boolean
mustRevalidate
;
String
etag
;
int
ageSeconds
=
-
1
;
private
boolean
isPublic
;
private
boolean
mustRevalidate
;
private
String
etag
;
private
int
ageSeconds
=
-
1
;
/** Case-insensitive set of field names. */
Set
<
String
>
varyFields
=
Collections
.
emptySet
();
private
Set
<
String
>
varyFields
=
Collections
.
emptySet
();
String
contentEncoding
;
String
transferEncoding
;
int
contentLength
=
-
1
;
String
connection
;
String
proxyAuthenticate
;
String
wwwAuthenticate
;
private
String
contentEncoding
;
private
String
transferEncoding
;
private
int
contentLength
=
-
1
;
private
String
connection
;
private
String
proxyAuthenticate
;
private
String
wwwAuthenticate
;
public
ResponseHeaders
(
URI
uri
,
RawHeaders
headers
)
{
this
.
uri
=
uri
;
...
...
@@ -200,6 +200,78 @@ final class ResponseHeaders {
return
"close"
.
equalsIgnoreCase
(
connection
);
}
public
URI
getUri
()
{
return
uri
;
}
public
RawHeaders
getHeaders
()
{
return
headers
;
}
public
Date
getServedDate
()
{
return
servedDate
;
}
public
Date
getLastModified
()
{
return
lastModified
;
}
public
Date
getExpires
()
{
return
expires
;
}
public
boolean
isNoCache
()
{
return
noCache
;
}
public
boolean
isNoStore
()
{
return
noStore
;
}
public
int
getMaxAgeSeconds
()
{
return
maxAgeSeconds
;
}
public
int
getSMaxAgeSeconds
()
{
return
sMaxAgeSeconds
;
}
public
boolean
isPublic
()
{
return
isPublic
;
}
public
boolean
isMustRevalidate
()
{
return
mustRevalidate
;
}
public
String
getEtag
()
{
return
etag
;
}
public
Set
<
String
>
getVaryFields
()
{
return
varyFields
;
}
public
String
getContentEncoding
()
{
return
contentEncoding
;
}
public
int
getContentLength
()
{
return
contentLength
;
}
public
String
getConnection
()
{
return
connection
;
}
public
String
getProxyAuthenticate
()
{
return
proxyAuthenticate
;
}
public
String
getWwwAuthenticate
()
{
return
wwwAuthenticate
;
}
public
void
setLocalTimestamps
(
long
sentRequestMillis
,
long
receivedResponseMillis
)
{
this
.
sentRequestMillis
=
sentRequestMillis
;
headers
.
add
(
SENT_MILLIS
,
Long
.
toString
(
sentRequestMillis
));
...
...
@@ -279,7 +351,7 @@ final class ResponseHeaders {
* Responses to authorized requests aren't cacheable unless they include
* a 'public', 'must-revalidate' or 's-maxage' directive.
*/
if
(
request
.
hasAuthorization
if
(
request
.
hasAuthorization
()
&&
!
isPublic
&&
!
mustRevalidate
&&
sMaxAgeSeconds
==
-
1
)
{
...
...
@@ -328,26 +400,26 @@ final class ResponseHeaders {
return
ResponseSource
.
NETWORK
;
}
if
(
request
.
n
oCache
||
request
.
hasConditions
())
{
if
(
request
.
isN
oCache
()
||
request
.
hasConditions
())
{
return
ResponseSource
.
NETWORK
;
}
long
ageMillis
=
computeAge
(
nowMillis
);
long
freshMillis
=
computeFreshnessLifetime
();
if
(
request
.
m
axAgeSeconds
!=
-
1
)
{
if
(
request
.
getM
axAgeSeconds
()
!=
-
1
)
{
freshMillis
=
Math
.
min
(
freshMillis
,
TimeUnit
.
SECONDS
.
toMillis
(
request
.
m
axAgeSeconds
));
TimeUnit
.
SECONDS
.
toMillis
(
request
.
getM
axAgeSeconds
()
));
}
long
minFreshMillis
=
0
;
if
(
request
.
m
inFreshSeconds
!=
-
1
)
{
minFreshMillis
=
TimeUnit
.
SECONDS
.
toMillis
(
request
.
m
inFreshSeconds
);
if
(
request
.
getM
inFreshSeconds
()
!=
-
1
)
{
minFreshMillis
=
TimeUnit
.
SECONDS
.
toMillis
(
request
.
getM
inFreshSeconds
()
);
}
long
maxStaleMillis
=
0
;
if
(!
mustRevalidate
&&
request
.
m
axStaleSeconds
!=
-
1
)
{
maxStaleMillis
=
TimeUnit
.
SECONDS
.
toMillis
(
request
.
m
axStaleSeconds
);
if
(!
mustRevalidate
&&
request
.
getM
axStaleSeconds
()
!=
-
1
)
{
maxStaleMillis
=
TimeUnit
.
SECONDS
.
toMillis
(
request
.
getM
axStaleSeconds
()
);
}
if
(!
noCache
&&
ageMillis
+
minFreshMillis
<
freshMillis
+
maxStaleMillis
)
{
...
...
This diff is collapsed.
Click to expand it.
luni/src/test/java/libcore/net/http/ParsedHeadersTest.java
View file @
956162ed
...
...
@@ -38,84 +38,84 @@ public final class ParsedHeadersTest extends TestCase {
headers
.
add
(
"ETAG"
,
"v1"
);
headers
.
add
(
"PRAGMA"
,
"no-cache"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertEquals
(
new
Date
(
1000
),
parsedHeaders
.
s
ervedDate
);
assertEquals
(
new
Date
(
2000
),
parsedHeaders
.
e
xpires
);
assertEquals
(
new
Date
(
3000
),
parsedHeaders
.
l
astModified
);
assertEquals
(
"v1"
,
parsedHeaders
.
e
tag
);
assertTrue
(
parsedHeaders
.
n
oCache
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
assertEquals
(
new
Date
(
1000
),
parsedHeaders
.
getS
ervedDate
()
);
assertEquals
(
new
Date
(
2000
),
parsedHeaders
.
getE
xpires
()
);
assertEquals
(
new
Date
(
3000
),
parsedHeaders
.
getL
astModified
()
);
assertEquals
(
"v1"
,
parsedHeaders
.
getE
tag
()
);
assertTrue
(
parsedHeaders
.
isN
oCache
()
);
}
public
void
testCommaSeparatedCacheControlHeaders
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"no-store, max-age=60, public"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertTrue
(
parsedHeaders
.
isPublic
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
assertTrue
(
parsedHeaders
.
isPublic
()
);
}
public
void
testQuotedFieldName
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"private=\"Set-Cookie\", no-store"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
}
public
void
testUnquotedValue
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"private=Set-Cookie, no-store"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
}
public
void
testQuotedValue
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"private=\" a, no-cache, c \", no-store"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertFalse
(
parsedHeaders
.
n
oCache
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
assertFalse
(
parsedHeaders
.
isN
oCache
()
);
}
public
void
testDanglingQuote
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"private=\"a, no-cache, c"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertFalse
(
parsedHeaders
.
n
oCache
);
assertFalse
(
parsedHeaders
.
isN
oCache
()
);
}
public
void
testTrailingComma
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"public,"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
isPublic
);
assertTrue
(
parsedHeaders
.
isPublic
()
);
}
public
void
testTrailingEquals
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"private="
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
new
ResponseHeaders
(
uri
,
headers
);
}
public
void
testSpaceBeforeEquals
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"max-age =60"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testSpaceAfterEqualsWithQuotes
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"max-age= \"60\""
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testSpaceAfterEqualsWithoutQuotes
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"max-age= 60"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testCacheControlRequestDirectivesAreCaseInsensitive
()
{
...
...
@@ -126,11 +126,11 @@ public final class ParsedHeadersTest extends TestCase {
headers
.
add
(
"Cache-Control"
,
"MIN-FRESH=80"
);
headers
.
add
(
"Cache-Control"
,
"ONLY-IF-CACHED"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oCache
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
70
,
parsedHeaders
.
m
axStaleSeconds
);
assertEquals
(
80
,
parsedHeaders
.
m
inFreshSeconds
);
assertTrue
(
parsedHeaders
.
o
nlyIfCached
);
assertTrue
(
parsedHeaders
.
isN
oCache
()
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
assertEquals
(
70
,
parsedHeaders
.
getM
axStaleSeconds
()
);
assertEquals
(
80
,
parsedHeaders
.
getM
inFreshSeconds
()
);
assertTrue
(
parsedHeaders
.
isO
nlyIfCached
()
);
}
public
void
testCacheControlResponseDirectivesAreCaseInsensitive
()
{
...
...
@@ -142,46 +142,46 @@ public final class ParsedHeadersTest extends TestCase {
headers
.
add
(
"Cache-Control"
,
"PUBLIC"
);
headers
.
add
(
"Cache-Control"
,
"MUST-REVALIDATE"
);
ResponseHeaders
parsedHeaders
=
new
ResponseHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oCache
);
assertTrue
(
parsedHeaders
.
n
oStore
);
assertEquals
(
60
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
70
,
parsedHeaders
.
s
MaxAgeSeconds
);
assertTrue
(
parsedHeaders
.
isPublic
);
assertTrue
(
parsedHeaders
.
m
ustRevalidate
);
assertTrue
(
parsedHeaders
.
isN
oCache
()
);
assertTrue
(
parsedHeaders
.
isN
oStore
()
);
assertEquals
(
60
,
parsedHeaders
.
getM
axAgeSeconds
()
);
assertEquals
(
70
,
parsedHeaders
.
getS
MaxAgeSeconds
()
);
assertTrue
(
parsedHeaders
.
isPublic
()
);
assertTrue
(
parsedHeaders
.
isM
ustRevalidate
()
);
}
public
void
testPragmaDirectivesAreCaseInsensitive
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Pragma"
,
"NO-CACHE"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertTrue
(
parsedHeaders
.
n
oCache
);
assertTrue
(
parsedHeaders
.
isN
oCache
()
);
}
public
void
testMissingInteger
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"max-age"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(-
1
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(-
1
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testInvalidInteger
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"MAX-AGE=pi"
);
RequestHeaders
requestHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(-
1
,
requestHeaders
.
m
axAgeSeconds
);
assertEquals
(-
1
,
requestHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testVeryLargeInteger
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"MAX-AGE="
+
(
Integer
.
MAX_VALUE
+
1L
));
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(
Integer
.
MAX_VALUE
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
Integer
.
MAX_VALUE
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
public
void
testNegativeInteger
()
{
RawHeaders
headers
=
new
RawHeaders
();
headers
.
add
(
"Cache-Control"
,
"MAX-AGE=-2"
);
RequestHeaders
parsedHeaders
=
new
RequestHeaders
(
uri
,
headers
);
assertEquals
(
0
,
parsedHeaders
.
m
axAgeSeconds
);
assertEquals
(
0
,
parsedHeaders
.
getM
axAgeSeconds
()
);
}
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment