33using System . Collections . Generic ;
44using System . IO ;
55using System . Linq ;
6+ using System . Net ;
67using System . Net . Http ;
78using System . Net . Http . Headers ;
89using System . Threading ;
@@ -34,6 +35,12 @@ public long NotModifiedHits
3435 get { return notModifiedHits ; }
3536 }
3637
38+ private long errorFallbackHits ;
39+ public long ErrorFallbackHits
40+ {
41+ get { return errorFallbackHits ; }
42+ }
43+
3744 private long cachesAdded ;
3845 public long CachesAdded
3946 {
@@ -51,6 +58,7 @@ public long CachesRemoved
5158 private readonly Action < HttpRequestMessage > existingRequestFilter ;
5259 private readonly ResultsFilterHttpDelegate existingResultsFilter ;
5360 private readonly ResultsFilterHttpResponseDelegate existingResultsFilterResponse ;
61+ private ExceptionFilterHttpDelegate existingExceptionFilter ;
5462
5563 private readonly JsonHttpClient client ;
5664
@@ -70,11 +78,12 @@ public CachedHttpClient(JsonHttpClient client)
7078 existingRequestFilter = client . RequestFilter ;
7179 existingResultsFilter = client . ResultsFilter ;
7280 existingResultsFilterResponse = client . ResultsFilterResponse ;
81+ existingExceptionFilter = client . ExceptionFilter ;
7382
7483 client . RequestFilter = OnRequestFilter ;
7584 client . ResultsFilter = OnResultsFilter ;
7685 client . ResultsFilterResponse = OnResultsFilterResponse ;
77- client . NotModifiedFilter = OnNotModifiedFilter ;
86+ client . ExceptionFilter = OnExceptionFilter ;
7887 }
7988
8089 private void OnRequestFilter ( HttpRequestMessage webReq )
@@ -114,13 +123,28 @@ private object OnResultsFilter(Type responseType, string httpMethod, string requ
114123 return ret ;
115124 }
116125
117- public object OnNotModifiedFilter ( HttpResponseMessage webRes , string requestUri , Type responseType )
126+ public object OnExceptionFilter ( HttpResponseMessage webRes , string requestUri , Type responseType )
118127 {
128+ if ( existingExceptionFilter != null )
129+ {
130+ var response = existingExceptionFilter ( webRes , requestUri , responseType ) ;
131+ if ( response != null )
132+ return response ;
133+ }
134+
119135 HttpCacheEntry entry ;
120136 if ( cache . TryGetValue ( requestUri , out entry ) )
121137 {
122- Interlocked . Increment ( ref notModifiedHits ) ;
123- return entry . Response ;
138+ if ( webRes . StatusCode == HttpStatusCode . NotModified )
139+ {
140+ Interlocked . Increment ( ref notModifiedHits ) ;
141+ return entry . Response ;
142+ }
143+ if ( entry . CanUseCacheOnError ( ) )
144+ {
145+ Interlocked . Increment ( ref errorFallbackHits ) ;
146+ return entry . Response ;
147+ }
124148 }
125149
126150 return null ;
@@ -142,6 +166,7 @@ private void OnResultsFilterResponse(HttpResponseMessage webRes, object response
142166 var entry = new HttpCacheEntry ( response )
143167 {
144168 ETag = eTag ,
169+ ContentLength = webRes . Content . Headers . ContentLength
145170 } ;
146171
147172 if ( webRes . Content . Headers . LastModified != null )
@@ -161,7 +186,7 @@ private void OnResultsFilterResponse(HttpResponseMessage webRes, object response
161186 entry . MustRevalidate = cacheControl . MustRevalidate ;
162187 entry . NoCache = cacheControl . NoCache ;
163188
164- entry . Expires = entry . Created + entry . MaxAge ;
189+ entry . SetMaxAge ( entry . MaxAge ) ;
165190 cache [ requestUri ] = entry ;
166191 Interlocked . Increment ( ref cachesAdded ) ;
167192
0 commit comments