@@ -30,26 +30,20 @@ public virtual bool IsRequestCacheable(ResponseCachingContext context)
30
30
// Verify request cache-control parameters
31
31
if ( ! StringValues . IsNullOrEmpty ( request . Headers [ HeaderNames . CacheControl ] ) )
32
32
{
33
- foreach ( var header in request . Headers [ HeaderNames . CacheControl ] )
33
+ if ( HttpHeaderParsingHelpers . HeaderContains ( request . Headers [ HeaderNames . CacheControl ] , CacheControlValues . NoCacheString ) )
34
34
{
35
- if ( header . IndexOf ( CacheControlValues . NoCacheString , StringComparison . OrdinalIgnoreCase ) != - 1 )
36
- {
37
- context . Logger . LogRequestWithNoCacheNotCacheable ( ) ;
38
- return false ;
39
- }
35
+ context . Logger . LogRequestWithNoCacheNotCacheable ( ) ;
36
+ return false ;
40
37
}
41
38
}
42
39
else
43
40
{
44
41
// Support for legacy HTTP 1.0 cache directive
45
42
var pragmaHeaderValues = request . Headers [ HeaderNames . Pragma ] ;
46
- foreach ( var directive in pragmaHeaderValues )
43
+ if ( HttpHeaderParsingHelpers . HeaderContains ( request . Headers [ HeaderNames . Pragma ] , CacheControlValues . NoCacheString ) )
47
44
{
48
- if ( string . Equals ( CacheControlValues . NoCacheString , directive , StringComparison . OrdinalIgnoreCase ) )
49
- {
50
- context . Logger . LogRequestWithPragmaNoCacheNotCacheable ( ) ;
51
- return false ;
52
- }
45
+ context . Logger . LogRequestWithPragmaNoCacheNotCacheable ( ) ;
46
+ return false ;
53
47
}
54
48
}
55
49
@@ -61,48 +55,30 @@ public virtual bool IsResponseCacheable(ResponseCachingContext context)
61
55
var responseCacheControlHeader = context . HttpContext . Response . Headers [ HeaderNames . CacheControl ] ;
62
56
63
57
// Only cache pages explicitly marked with public
64
- var isPublic = false ;
65
- foreach ( var header in responseCacheControlHeader )
66
- {
67
- if ( header . IndexOf ( CacheControlValues . PublicString , StringComparison . OrdinalIgnoreCase ) != - 1 )
68
- {
69
- isPublic = true ;
70
- break ;
71
- }
72
- }
73
- if ( ! isPublic )
58
+ if ( ! HttpHeaderParsingHelpers . HeaderContains ( responseCacheControlHeader , CacheControlValues . PublicString ) )
74
59
{
75
60
context . Logger . LogResponseWithoutPublicNotCacheable ( ) ;
76
61
return false ;
77
62
}
78
63
79
64
// Check no-store
80
- foreach ( var header in context . HttpContext . Request . Headers [ HeaderNames . CacheControl ] )
65
+ if ( HttpHeaderParsingHelpers . HeaderContains ( context . HttpContext . Request . Headers [ HeaderNames . CacheControl ] , CacheControlValues . NoStoreString ) )
81
66
{
82
- if ( header . IndexOf ( CacheControlValues . NoStoreString , StringComparison . OrdinalIgnoreCase ) != - 1 )
83
- {
84
- context . Logger . LogResponseWithNoStoreNotCacheable ( ) ;
85
- return false ;
86
- }
67
+ context . Logger . LogResponseWithNoStoreNotCacheable ( ) ;
68
+ return false ;
87
69
}
88
70
89
- foreach ( var header in responseCacheControlHeader )
71
+ if ( HttpHeaderParsingHelpers . HeaderContains ( responseCacheControlHeader , CacheControlValues . NoStoreString ) )
90
72
{
91
- if ( header . IndexOf ( CacheControlValues . NoStoreString , StringComparison . OrdinalIgnoreCase ) != - 1 )
92
- {
93
- context . Logger . LogResponseWithNoStoreNotCacheable ( ) ;
94
- return false ;
95
- }
73
+ context . Logger . LogResponseWithNoStoreNotCacheable ( ) ;
74
+ return false ;
96
75
}
97
76
98
77
// Check no-cache
99
- foreach ( var header in responseCacheControlHeader )
78
+ if ( HttpHeaderParsingHelpers . HeaderContains ( responseCacheControlHeader , CacheControlValues . NoCacheString ) )
100
79
{
101
- if ( header . IndexOf ( CacheControlValues . NoCacheString , StringComparison . OrdinalIgnoreCase ) != - 1 )
102
- {
103
- context . Logger . LogResponseWithNoCacheNotCacheable ( ) ;
104
- return false ;
105
- }
80
+ context . Logger . LogResponseWithNoCacheNotCacheable ( ) ;
81
+ return false ;
106
82
}
107
83
108
84
var response = context . HttpContext . Response ;
@@ -123,13 +99,10 @@ public virtual bool IsResponseCacheable(ResponseCachingContext context)
123
99
}
124
100
125
101
// Check private
126
- foreach ( var header in responseCacheControlHeader )
102
+ if ( HttpHeaderParsingHelpers . HeaderContains ( responseCacheControlHeader , CacheControlValues . PrivateString ) )
127
103
{
128
- if ( header . IndexOf ( CacheControlValues . PrivateString , StringComparison . OrdinalIgnoreCase ) != - 1 )
129
- {
130
- context . Logger . LogResponseWithPrivateNotCacheable ( ) ;
131
- return false ;
132
- }
104
+ context . Logger . LogResponseWithPrivateNotCacheable ( ) ;
105
+ return false ;
133
106
}
134
107
135
108
// Check response code
@@ -191,7 +164,7 @@ public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
191
164
192
165
// Add min-fresh requirements
193
166
int seconds ;
194
- if ( ParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MinFreshString , out seconds ) )
167
+ if ( HttpHeaderParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MinFreshString , out seconds ) )
195
168
{
196
169
var minFresh = TimeSpan . FromSeconds ( seconds ) ;
197
170
age += minFresh ;
@@ -200,7 +173,7 @@ public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
200
173
201
174
// Validate shared max age, this overrides any max age settings for shared caches
202
175
TimeSpan ? cachedSharedMaxAge = null ;
203
- if ( ParsingHelpers . TryGetHeaderValue ( cachedControlHeaders , CacheControlValues . SharedMaxAgeString , out seconds ) )
176
+ if ( HttpHeaderParsingHelpers . TryGetHeaderValue ( cachedControlHeaders , CacheControlValues . SharedMaxAgeString , out seconds ) )
204
177
{
205
178
cachedSharedMaxAge = TimeSpan . FromSeconds ( seconds ) ;
206
179
}
@@ -214,13 +187,13 @@ public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
214
187
else if ( ! cachedSharedMaxAge . HasValue )
215
188
{
216
189
TimeSpan ? requestMaxAge = null ;
217
- if ( ParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MaxAgeString , out seconds ) )
190
+ if ( HttpHeaderParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MaxAgeString , out seconds ) )
218
191
{
219
192
requestMaxAge = TimeSpan . FromSeconds ( seconds ) ;
220
193
}
221
194
222
195
TimeSpan ? cachedMaxAge = null ;
223
- if ( ParsingHelpers . TryGetHeaderValue ( cachedControlHeaders , CacheControlValues . MaxAgeString , out seconds ) )
196
+ if ( HttpHeaderParsingHelpers . TryGetHeaderValue ( cachedControlHeaders , CacheControlValues . MaxAgeString , out seconds ) )
224
197
{
225
198
cachedMaxAge = TimeSpan . FromSeconds ( seconds ) ;
226
199
}
@@ -230,17 +203,14 @@ public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
230
203
if ( age >= lowestMaxAge )
231
204
{
232
205
// Must revalidate
233
- foreach ( var header in cachedControlHeaders )
206
+ if ( HttpHeaderParsingHelpers . HeaderContains ( cachedControlHeaders , CacheControlValues . MustRevalidateString ) )
234
207
{
235
- if ( header . IndexOf ( CacheControlValues . MustRevalidateString , StringComparison . OrdinalIgnoreCase ) != - 1 )
236
- {
237
- context . Logger . LogExpirationMustRevalidate ( age , lowestMaxAge . Value ) ;
238
- return false ;
239
- }
208
+ context . Logger . LogExpirationMustRevalidate ( age , lowestMaxAge . Value ) ;
209
+ return false ;
240
210
}
241
211
242
212
TimeSpan ? requestMaxStale = null ;
243
- if ( ParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MaxStaleString , out seconds ) )
213
+ if ( HttpHeaderParsingHelpers . TryGetHeaderValue ( requestCacheControlHeaders , CacheControlValues . MaxStaleString , out seconds ) )
244
214
{
245
215
requestMaxStale = TimeSpan . FromSeconds ( seconds ) ;
246
216
}
@@ -259,14 +229,11 @@ public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
259
229
{
260
230
// Validate expiration
261
231
DateTimeOffset expires ;
262
- if ( context . CachedResponseHeaders [ HeaderNames . Expires ] . Count > 0 &&
263
- ParsingHelpers . TryParseDate ( context . CachedResponseHeaders [ HeaderNames . Expires ] , out expires ) )
232
+ if ( HttpHeaderParsingHelpers . TryParseHeaderDate ( context . CachedResponseHeaders [ HeaderNames . Expires ] , out expires ) &&
233
+ context . ResponseTime . Value >= expires )
264
234
{
265
- if ( context . ResponseTime . Value >= expires )
266
- {
267
- context . Logger . LogExpirationExpiresExceeded ( context . ResponseTime . Value , expires ) ;
268
- return false ;
269
- }
235
+ context . Logger . LogExpirationExpiresExceeded ( context . ResponseTime . Value , expires ) ;
236
+ return false ;
270
237
}
271
238
}
272
239
}
0 commit comments