@@ -11,18 +11,18 @@ namespace Microsoft.Net.Http.Headers
11
11
{
12
12
public class CacheControlHeaderValue
13
13
{
14
- private const string MaxAgeString = "max-age " ;
15
- private const string MaxStaleString = "max-stale " ;
16
- private const string MinFreshString = "min-fresh " ;
17
- private const string MustRevalidateString = "must-revalidate " ;
18
- private const string NoCacheString = "no-cache" ;
19
- private const string NoStoreString = "no-store" ;
20
- private const string NoTransformString = "no-transform " ;
21
- private const string OnlyIfCachedString = "only-if-cached " ;
22
- private const string PrivateString = "private " ;
23
- private const string ProxyRevalidateString = "proxy-revalidate " ;
24
- private const string PublicString = "public " ;
25
- private const string SharedMaxAgeString = "s-maxage " ;
14
+ public static readonly string PublicString = "public " ;
15
+ public static readonly string PrivateString = "private " ;
16
+ public static readonly string MaxAgeString = "max-age " ;
17
+ public static readonly string SharedMaxAgeString = "s-maxage " ;
18
+ public static readonly string NoCacheString = "no-cache" ;
19
+ public static readonly string NoStoreString = "no-store" ;
20
+ public static readonly string MaxStaleString = "max-stale " ;
21
+ public static readonly string MinFreshString = "min-fresh " ;
22
+ public static readonly string NoTransformString = "no-transform " ;
23
+ public static readonly string OnlyIfCachedString = "only-if-cached " ;
24
+ public static readonly string MustRevalidateString = "must-revalidate " ;
25
+ public static readonly string ProxyRevalidateString = "proxy-revalidate " ;
26
26
27
27
// The Cache-Control header is special: It is a header supporting a list of values, but we represent the list
28
28
// as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is
@@ -394,63 +394,120 @@ private static bool TrySetCacheControlValues(
394
394
CacheControlHeaderValue cc ,
395
395
List < NameValueHeaderValue > nameValueList )
396
396
{
397
- foreach ( NameValueHeaderValue nameValue in nameValueList )
397
+ for ( var i = 0 ; i < nameValueList . Count ; i ++ )
398
398
{
399
+ var nameValue = nameValueList [ i ] ;
400
+ var name = nameValue . Name ;
399
401
var success = true ;
400
- string name = nameValue . Name . ToLowerInvariant ( ) ;
401
402
402
- switch ( name )
403
+ switch ( name . Length )
403
404
{
404
- case NoCacheString :
405
- success = TrySetOptionalTokenList ( nameValue , ref cc . _noCache , ref cc . _noCacheHeaders ) ;
406
- break ;
407
-
408
- case NoStoreString :
409
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _noStore ) ;
410
- break ;
411
-
412
- case MaxAgeString :
413
- success = TrySetTimeSpan ( nameValue , ref cc . _maxAge ) ;
414
- break ;
415
-
416
- case MaxStaleString :
417
- success = ( ( nameValue . Value == null ) || TrySetTimeSpan ( nameValue , ref cc . _maxStaleLimit ) ) ;
418
- if ( success )
405
+ case 6 :
406
+ if ( string . Equals ( PublicString , name , StringComparison . OrdinalIgnoreCase ) )
419
407
{
420
- cc . _maxStale = true ;
408
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _public ) ;
409
+ }
410
+ else
411
+ {
412
+ goto default ;
421
413
}
422
414
break ;
423
415
424
- case MinFreshString :
425
- success = TrySetTimeSpan ( nameValue , ref cc . _minFresh ) ;
426
- break ;
427
-
428
- case NoTransformString :
429
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _noTransform ) ;
416
+ case 7 :
417
+ if ( string . Equals ( MaxAgeString , name , StringComparison . OrdinalIgnoreCase ) )
418
+ {
419
+ success = TrySetTimeSpan ( nameValue , ref cc . _maxAge ) ;
420
+ }
421
+ else if ( string . Equals ( PrivateString , name , StringComparison . OrdinalIgnoreCase ) )
422
+ {
423
+ success = TrySetOptionalTokenList ( nameValue , ref cc . _private , ref cc . _privateHeaders ) ;
424
+ }
425
+ else
426
+ {
427
+ goto default ;
428
+ }
430
429
break ;
431
430
432
- case OnlyIfCachedString :
433
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _onlyIfCached ) ;
431
+ case 8 :
432
+ if ( string . Equals ( NoCacheString , name , StringComparison . OrdinalIgnoreCase ) )
433
+ {
434
+ success = TrySetOptionalTokenList ( nameValue , ref cc . _noCache , ref cc . _noCacheHeaders ) ;
435
+ }
436
+ else if ( string . Equals ( NoStoreString , name , StringComparison . OrdinalIgnoreCase ) )
437
+ {
438
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _noStore ) ;
439
+ }
440
+ else if ( string . Equals ( SharedMaxAgeString , name , StringComparison . OrdinalIgnoreCase ) )
441
+ {
442
+ success = TrySetTimeSpan ( nameValue , ref cc . _sharedMaxAge ) ;
443
+ }
444
+ else
445
+ {
446
+ goto default ;
447
+ }
434
448
break ;
435
449
436
- case PublicString :
437
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _public ) ;
450
+ case 9 :
451
+ if ( string . Equals ( MaxStaleString , name , StringComparison . OrdinalIgnoreCase ) )
452
+ {
453
+ success = ( ( nameValue . Value == null ) || TrySetTimeSpan ( nameValue , ref cc . _maxStaleLimit ) ) ;
454
+ if ( success )
455
+ {
456
+ cc . _maxStale = true ;
457
+ }
458
+ }
459
+ else if ( string . Equals ( MinFreshString , name , StringComparison . OrdinalIgnoreCase ) )
460
+ {
461
+ success = TrySetTimeSpan ( nameValue , ref cc . _minFresh ) ;
462
+ }
463
+ else
464
+ {
465
+ goto default ;
466
+ }
438
467
break ;
439
468
440
- case PrivateString :
441
- success = TrySetOptionalTokenList ( nameValue , ref cc . _private , ref cc . _privateHeaders ) ;
469
+ case 12 :
470
+ if ( string . Equals ( NoTransformString , name , StringComparison . OrdinalIgnoreCase ) )
471
+ {
472
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _noTransform ) ;
473
+ }
474
+ else
475
+ {
476
+ goto default ;
477
+ }
442
478
break ;
443
479
444
- case MustRevalidateString :
445
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _mustRevalidate ) ;
480
+ case 14 :
481
+ if ( string . Equals ( OnlyIfCachedString , name , StringComparison . OrdinalIgnoreCase ) )
482
+ {
483
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _onlyIfCached ) ;
484
+ }
485
+ else
486
+ {
487
+ goto default ;
488
+ }
446
489
break ;
447
490
448
- case ProxyRevalidateString :
449
- success = TrySetTokenOnlyValue ( nameValue , ref cc . _proxyRevalidate ) ;
491
+ case 15 :
492
+ if ( string . Equals ( MustRevalidateString , name , StringComparison . OrdinalIgnoreCase ) )
493
+ {
494
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _mustRevalidate ) ;
495
+ }
496
+ else
497
+ {
498
+ goto default ;
499
+ }
450
500
break ;
451
501
452
- case SharedMaxAgeString :
453
- success = TrySetTimeSpan ( nameValue , ref cc . _sharedMaxAge ) ;
502
+ case 16 :
503
+ if ( string . Equals ( ProxyRevalidateString , name , StringComparison . OrdinalIgnoreCase ) )
504
+ {
505
+ success = TrySetTokenOnlyValue ( nameValue , ref cc . _proxyRevalidate ) ;
506
+ }
507
+ else
508
+ {
509
+ goto default ;
510
+ }
454
511
break ;
455
512
456
513
default :
0 commit comments