Skip to content

Commit 06613b4

Browse files
author
skycxu
committed
eTag字段支持service更改设置
1 parent 99a4ce9 commit 06613b4

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

sonic-iOS/Sonic/Cache/SonicCache.m

+15-1
Original file line numberDiff line numberDiff line change
@@ -465,10 +465,22 @@ - (SonicCacheItem *)saveHtmlString:(NSString *)htmlString
465465
return cacheItem;
466466
}
467467

468+
- (NSString *)getSonicHeaderETagWithHeaders:(NSDictionary *)headers
469+
{
470+
NSString *keyETag = [headers objectForKey:[SonicHeaderKeyCustomeETag lowercaseString]];
471+
if (keyETag && [keyETag isKindOfClass:[NSString class]] && keyETag.length > 0) {
472+
// do nothing
473+
} else {
474+
keyETag = [SonicHeaderKeyETag lowercaseString];
475+
}
476+
477+
return [headers objectForKey:keyETag];
478+
}
479+
468480
- (NSDictionary *)createConfigFromResponseHeaders:(NSDictionary *)headers
469481
{
470482
//Etag,template-tag
471-
NSString *eTag = headers[SonicHeaderKeyETag];
483+
NSString *eTag = [self getSonicHeaderETagWithHeaders:headers];
472484
NSString *templateTag = headers[SonicHeaderKeyTemplate];
473485
NSTimeInterval timeNow = (long)[[NSDate date ]timeIntervalSince1970]*1000;
474486
NSString *localRefresh = [@(timeNow) stringValue];
@@ -479,6 +491,8 @@ - (NSDictionary *)createConfigFromResponseHeaders:(NSDictionary *)headers
479491
eTag = eTag.length > 0? eTag:@"";
480492

481493
NSDictionary *cfgDict = @{
494+
// SonicHeaderKeyCustomeETag:[self getCustomSonicHeaderKeyETagWithHeaders:headers]
495+
// [self getCustomSonicHeaderKeyETagWithHeaders:headers]:eTag
482496
SonicHeaderKeyETag:eTag,
483497
SonicHeaderKeyTemplate:templateTag,
484498
kSonicLocalRefreshTime:localRefresh,

sonic-iOS/Sonic/Network/SonicServer.m

+16-4
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,18 @@ - (NSString *)responseHeaderForKey:(NSString *)aKey
282282
return header;
283283
}
284284

285+
- (NSString *)getSonicHeaderETagWithHeaders:(NSDictionary *)headers
286+
{
287+
NSString *keyETag = [headers objectForKey:[SonicHeaderKeyCustomeETag lowercaseString]];
288+
if (keyETag && [keyETag isKindOfClass:[NSString class]] && keyETag.length > 0) {
289+
// do nothing
290+
} else {
291+
keyETag = [SonicHeaderKeyETag lowercaseString];
292+
}
293+
294+
return [headers objectForKey:keyETag];
295+
}
296+
285297
- (NSDictionary *)sonicItemForCache
286298
{
287299
if (self.isCompletion) {
@@ -294,7 +306,7 @@ - (NSDictionary *)sonicItemForCache
294306
self.data = splitResult[kSonicDataFieldName];
295307

296308
NSMutableDictionary *headers = [[_response.allHeaderFields mutableCopy]autorelease];
297-
NSString *responseEtag = [headers objectForKey:[SonicHeaderKeyETag lowercaseString]];
309+
NSString *responseEtag = [self getSonicHeaderETagWithHeaders:headers];
298310
if (!responseEtag) {
299311
responseEtag = getDataSha1([self.htmlString dataUsingEncoding:NSUTF8StringEncoding]);
300312
[headers setObject:responseEtag forKey:[SonicHeaderKeyETag lowercaseString]];
@@ -336,7 +348,7 @@ - (BOOL)isValidateSonicResponse:(NSHTTPURLResponse *)response
336348
return NO;
337349
}
338350

339-
if ([response.allHeaderFields[SonicHeaderKeyETag] length] == 0) {
351+
if ([[self getSonicHeaderETagWithHeaders:response.allHeaderFields] length] == 0) {
340352
return NO;
341353
}
342354

@@ -381,7 +393,7 @@ - (void)connection:(SonicConnection *)connection didReceiveResponse:(NSHTTPURLRe
381393
}
382394

383395
// fix Weak-Etag case like -> etag: W/"66f0-m2UmCBEh78dNYPv+boO5ETXk4FU".[https://github.com/Tencent/VasSonic/issues/128]
384-
NSString *eTag = [headers objectForKey:[SonicHeaderKeyETag lowercaseString]];
396+
NSString *eTag = [self getSonicHeaderETagWithHeaders:headers];
385397
if ([eTag hasPrefix:@"W/"] && eTag.length > 3) {
386398
// fix Weak-Etag get value length error
387399
NSString *eTagValue = [eTag substringFromIndex:2];
@@ -463,7 +475,7 @@ - (void)connectionDidCompleteWithoutError:(SonicConnection *)connection
463475
[headers setValue:@"true" forKey:[SonicHeaderKeyCacheOffline lowercaseString]];
464476
}
465477
NSString *htmlSha1 = nil;
466-
NSString *responseEtag = [headers objectForKey:[SonicHeaderKeyETag lowercaseString]];
478+
NSString *responseEtag = [self getSonicHeaderETagWithHeaders:headers];
467479
if (!responseEtag) {
468480
responseEtag = htmlSha1 = getDataSha1([self.htmlString dataUsingEncoding:NSUTF8StringEncoding]);
469481
[headers setObject:responseEtag forKey:[SonicHeaderKeyETag lowercaseString]];

sonic-iOS/Sonic/Session/SonicSession.m

+13-1
Original file line numberDiff line numberDiff line change
@@ -287,13 +287,25 @@ - (void)syncCookies
287287
}
288288
}
289289

290+
- (NSString *)getSonicHeaderETagWithHeaders:(NSDictionary *)headers
291+
{
292+
NSString *keyETag = [headers objectForKey:[SonicHeaderKeyCustomeETag lowercaseString]];
293+
if (keyETag && [keyETag isKindOfClass:[NSString class]] && keyETag.length > 0) {
294+
// do nothing
295+
} else {
296+
keyETag = [SonicHeaderKeyETag lowercaseString];
297+
}
298+
299+
return [headers objectForKey:keyETag];
300+
}
301+
290302
- (NSDictionary *)buildRequestHeaderFields
291303
{
292304
NSDictionary *cacheHeaders = self.cacheConfigHeaders;
293305
NSMutableDictionary *requestHeaders = [NSMutableDictionary dictionary];
294306

295307
if (cacheHeaders) {
296-
NSString *eTag = cacheHeaders[SonicHeaderKeyETag];
308+
NSString *eTag = [self getSonicHeaderETagWithHeaders:cacheHeaders];
297309
if (eTag.length > 0) {
298310
[requestHeaders setObject:eTag forKey:HTTPHeaderKeyIfNoneMatch];
299311
}

sonic-iOS/Sonic/SonicConstants.h

+6
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ typedef NS_ENUM(NSInteger, SonicErrorType) {
150150
*/
151151
#define SonicHeaderKeyETag @"etag"
152152

153+
/**
154+
* Pass Etag through this field.
155+
* This header represents that the "eTag" key can be modified by service.
156+
*/
157+
#define SonicHeaderKeyCustomeETag @"sonic-etag-key"
158+
153159
/**
154160
* Content-Security-Policy key for header.
155161
*/

0 commit comments

Comments
 (0)