KTVHCRange.m 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //
  2. // KTVHCRange.m
  3. // KTVHTTPCache
  4. //
  5. // Created by Single on 2018/5/20.
  6. // Copyright © 2018年 Single. All rights reserved.
  7. //
  8. #import "KTVHCRange.h"
  9. BOOL KTVHCRangeIsFull(KTVHCRange range)
  10. {
  11. return KTVHCEqualRanges(range, KTVHCRangeFull());
  12. }
  13. BOOL KTVHCRangeIsVaild(KTVHCRange range)
  14. {
  15. return !KTVHCRangeIsInvaild(range);
  16. }
  17. BOOL KTVHCRangeIsInvaild(KTVHCRange range)
  18. {
  19. return KTVHCEqualRanges(range, KTVHCRangeInvaild());
  20. }
  21. BOOL KTVHCEqualRanges(KTVHCRange range1, KTVHCRange range2)
  22. {
  23. return range1.start == range2.start && range1.end == range2.end;
  24. }
  25. long long KTVHCRangeGetLength(KTVHCRange range)
  26. {
  27. if (range.start == KTVHCNotFound || range.end == KTVHCNotFound) {
  28. return KTVHCNotFound;
  29. }
  30. return range.end - range.start + 1;
  31. }
  32. NSString *KTVHCStringFromRange(KTVHCRange range)
  33. {
  34. return [NSString stringWithFormat:@"Range : {%lld, %lld}", range.start, range.end];
  35. }
  36. NSString *KTVHCRangeGetHeaderString(KTVHCRange range)
  37. {
  38. NSMutableString *string = [NSMutableString stringWithFormat:@"bytes="];
  39. if (range.start != KTVHCNotFound) {
  40. [string appendFormat:@"%lld", range.start];
  41. }
  42. [string appendFormat:@"-"];
  43. if (range.end != KTVHCNotFound) {
  44. [string appendFormat:@"%lld", range.end];
  45. }
  46. return [string copy];
  47. }
  48. NSDictionary *KTVHCRangeFillToRequestHeaders(KTVHCRange range, NSDictionary *headers)
  49. {
  50. NSMutableDictionary *ret = [NSMutableDictionary dictionaryWithDictionary:headers];
  51. [ret setObject:KTVHCRangeGetHeaderString(range) forKey:@"Range"];
  52. return ret;
  53. }
  54. NSDictionary *KTVHCRangeFillToRequestHeadersIfNeeded(KTVHCRange range, NSDictionary *headers)
  55. {
  56. if ([headers objectForKey:@"Range"]) {
  57. return headers;
  58. }
  59. return KTVHCRangeFillToRequestHeaders(range, headers);
  60. }
  61. NSDictionary *KTVHCRangeFillToResponseHeaders(KTVHCRange range, NSDictionary *headers, long long totalLength)
  62. {
  63. NSMutableDictionary *ret = [NSMutableDictionary dictionaryWithDictionary:headers];
  64. long long currentLength = KTVHCRangeGetLength(range);
  65. [ret setObject:[NSString stringWithFormat:@"%lld", currentLength] forKey:@"Content-Length"];
  66. [ret setObject:[NSString stringWithFormat:@"bytes %lld-%lld/%lld", range.start, range.end, totalLength] forKey:@"Content-Range"];
  67. return ret;
  68. }
  69. NSString *KTVHCResponseRangeStringWithContentLength(long long contentLength)
  70. {
  71. return [NSString stringWithFormat:@"bytes 0-%lld/%lld", contentLength - 1, contentLength];
  72. }
  73. KTVHCRange KTVHCMakeRange(long long start, long long end)
  74. {
  75. KTVHCRange range = {start, end};
  76. return range;
  77. }
  78. KTVHCRange KTVHCRangeZero(void)
  79. {
  80. return KTVHCMakeRange(0, 0);
  81. }
  82. KTVHCRange KTVHCRangeFull(void)
  83. {
  84. return KTVHCMakeRange(0, KTVHCNotFound);
  85. }
  86. KTVHCRange KTVHCRangeInvaild(void)
  87. {
  88. return KTVHCMakeRange(KTVHCNotFound, KTVHCNotFound);
  89. }
  90. KTVHCRange KTVHCRangeWithSeparateValue(NSString *value)
  91. {
  92. KTVHCRange range = KTVHCRangeInvaild();
  93. if (value.length > 0) {
  94. NSArray *components = [value componentsSeparatedByString:@","];
  95. if (components.count == 1) {
  96. components = [components.firstObject componentsSeparatedByString:@"-"];
  97. if (components.count == 2) {
  98. NSString *startString = [components objectAtIndex:0];
  99. NSInteger startValue = [startString integerValue];
  100. NSString *endString = [components objectAtIndex:1];
  101. NSInteger endValue = [endString integerValue];
  102. if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) {
  103. // The second 500 bytes: "500-999"
  104. range.start = startValue;
  105. range.end = endValue;
  106. } else if (startString.length && (startValue >= 0)) {
  107. // The bytes after 9500 bytes: "9500-"
  108. range.start = startValue;
  109. range.end = KTVHCNotFound;
  110. } else if (endString.length && (endValue > 0)) {
  111. // The final 500 bytes: "-500"
  112. range.start = KTVHCNotFound;
  113. range.end = endValue;
  114. }
  115. }
  116. }
  117. }
  118. return range;
  119. }
  120. KTVHCRange KTVHCRangeWithRequestHeaderValue(NSString *value)
  121. {
  122. if ([value hasPrefix:@"bytes="]) {
  123. NSString *rangeString = [value substringFromIndex:6];
  124. return KTVHCRangeWithSeparateValue(rangeString);
  125. }
  126. return KTVHCRangeInvaild();
  127. }
  128. KTVHCRange KTVHCRangeWithResponseHeaderValue(NSString *value, long long *totalLength)
  129. {
  130. if ([value hasPrefix:@"bytes "]) {
  131. value = [value stringByReplacingOccurrencesOfString:@"bytes " withString:@""];
  132. NSRange range = [value rangeOfString:@"/"];
  133. if (range.location != NSNotFound) {
  134. NSString *rangeString = [value substringToIndex:range.location];
  135. NSString *totalLengthString = [value substringFromIndex:range.location + range.length];
  136. *totalLength = totalLengthString.longLongValue;
  137. return KTVHCRangeWithSeparateValue(rangeString);
  138. }
  139. }
  140. return KTVHCRangeInvaild();
  141. }
  142. KTVHCRange KTVHCRangeWithEnsureLength(KTVHCRange range, long long ensureLength)
  143. {
  144. if (ensureLength > 0 &&
  145. (range.end == KTVHCNotFound || range.end >= ensureLength)) {
  146. return KTVHCMakeRange(range.start, ensureLength - 1);
  147. }
  148. return range;
  149. }