KTVHCDataResponse.m 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //
  2. // KTVHCDataResponse.m
  3. // KTVHTTPCache
  4. //
  5. // Created by Single on 2017/8/24.
  6. // Copyright © 2017年 Single. All rights reserved.
  7. //
  8. #import "KTVHCDataResponse.h"
  9. #import "KTVHCLog.h"
  10. @implementation KTVHCDataResponse
  11. - (instancetype)initWithURL:(NSURL *)URL headers:(NSDictionary *)headers
  12. {
  13. if (self = [super init])
  14. {
  15. KTVHCLogAlloc(self);
  16. _URL = URL;
  17. _headers = headers;
  18. NSMutableDictionary * headersWithoutRangeAndLength = [headers mutableCopy];
  19. for (NSString * key in [self withoutHeaderKeys])
  20. {
  21. [headersWithoutRangeAndLength removeObjectForKey:key];
  22. }
  23. _headersWithoutRangeAndLength = [headersWithoutRangeAndLength copy];
  24. _contentType = [self headerValueWithKey:@"Content-Type"];
  25. _currentLength = [self headerValueWithKey:@"Content-Length"].longLongValue;
  26. _range = KTVHCRangeWithResponseHeaderValue([self headerValueWithKey:@"Content-Range"], &_totalLength);
  27. KTVHCLogDataResponse(@"%p Create data response\nURL : %@\nHeaders : %@\nheadersWithoutRangeAndLength : %@\ncontentType : %@\ntotalLength : %lld\ncurrentLength : %lld", self, self.URL, self.headers, self.headersWithoutRangeAndLength, self.contentType, self.totalLength, self.currentLength);
  28. }
  29. return self;
  30. }
  31. - (void)dealloc
  32. {
  33. KTVHCLogDealloc(self);
  34. }
  35. - (NSString *)headerValueWithKey:(NSString *)key
  36. {
  37. NSString * value = [self.headers objectForKey:key];
  38. if (!value)
  39. {
  40. value = [self.headers objectForKey:[key lowercaseString]];
  41. }
  42. return value;
  43. }
  44. - (NSArray <NSString *> *)withoutHeaderKeys
  45. {
  46. static NSArray * obj = nil;
  47. static dispatch_once_t onceToken;
  48. dispatch_once(&onceToken, ^{
  49. obj = @[@"Content-Length",
  50. @"content-length",
  51. @"Content-Range",
  52. @"content-range"];
  53. });
  54. return obj;
  55. }
  56. - (KTVHCDataResponse *)responseWithRange:(KTVHCRange)range
  57. {
  58. if (!KTVHCEqualRanges(self.range, range))
  59. {
  60. NSDictionary * headers = KTVHCRangeFillToResponseHeaders(range, self.headers, self.totalLength);
  61. KTVHCDataResponse * obj = [[KTVHCDataResponse alloc] initWithURL:self.URL headers:headers];
  62. return obj;
  63. }
  64. return self;
  65. }
  66. @end