KTVHCHTTPResponse.m 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //
  2. // KTVHCHTTPResponse.m
  3. // KTVHTTPCache
  4. //
  5. // Created by Single on 2017/8/10.
  6. // Copyright © 2017年 Single. All rights reserved.
  7. //
  8. #import "KTVHCHTTPResponse.h"
  9. #import "KTVHCHTTPConnection.h"
  10. #import "KTVHCHTTPRequest.h"
  11. #import "KTVHCDataStorage.h"
  12. #import "KTVHCLog.h"
  13. @interface KTVHCHTTPResponse () <KTVHCDataReaderDelegate>
  14. @property (nonatomic, weak) KTVHCHTTPConnection * connection;
  15. @property (nonatomic, strong) KTVHCHTTPRequest * request;
  16. @property (nonatomic, strong) KTVHCDataRequest * dataRequest;
  17. @property (nonatomic, strong) KTVHCDataReader * reader;
  18. @property (nonatomic, assign) BOOL waitingResponseHeader;
  19. @end
  20. @implementation KTVHCHTTPResponse
  21. - (instancetype)initWithConnection:(KTVHCHTTPConnection *)connection request:(KTVHCHTTPRequest *)request
  22. {
  23. if (self = [super init])
  24. {
  25. KTVHCLogAlloc(self);
  26. self.connection = connection;
  27. self.request = request;
  28. KTVHCDataRequest * dataRequest = [[KTVHCDataRequest alloc] initWithURL:self.request.URL headers:self.request.headers];
  29. self.reader = [[KTVHCDataStorage storage] readerWithRequest:dataRequest];
  30. self.reader.delegate = self;
  31. [self.reader prepare];
  32. KTVHCLogHTTPResponse(@"%p, Create response\nrequest : %@", self, self.request);
  33. }
  34. return self;
  35. }
  36. - (void)dealloc
  37. {
  38. [self.reader close];
  39. KTVHCLogDealloc(self);
  40. }
  41. #pragma mark - HTTPResponse
  42. - (NSData *)readDataOfLength:(NSUInteger)length
  43. {
  44. NSData * data = [self.reader readDataOfLength:length];
  45. KTVHCLogHTTPResponse(@"%p, Read data : %lld", self, (long long)data.length);
  46. if (self.reader.didFinished)
  47. {
  48. KTVHCLogHTTPResponse(@"%p, Read data did finished", self);
  49. [self.reader close];
  50. [self.connection responseDidAbort:self];
  51. }
  52. return data;
  53. }
  54. - (BOOL)delayResponseHeaders
  55. {
  56. BOOL waiting = !self.reader.didPrepared;
  57. self.waitingResponseHeader = waiting;
  58. KTVHCLogHTTPResponse(@"%p, Delay response : %d", self, self.waitingResponseHeader);
  59. return waiting;
  60. }
  61. - (UInt64)contentLength
  62. {
  63. KTVHCLogHTTPResponse(@"%p, Conetnt length : %lld", self, self.reader.response.totalLength);
  64. return self.reader.response.totalLength;
  65. }
  66. - (NSDictionary *)httpHeaders
  67. {
  68. KTVHCLogHTTPResponse(@"%p, Header\n%@", self, self.reader.response.headersWithoutRangeAndLength);
  69. return self.reader.response.headersWithoutRangeAndLength;
  70. }
  71. - (UInt64)offset
  72. {
  73. KTVHCLogHTTPResponse(@"%p, Offset : %lld", self, self.reader.readOffset);
  74. return self.reader.readOffset;
  75. }
  76. - (void)setOffset:(UInt64)offset
  77. {
  78. KTVHCLogHTTPResponse(@"%p, Set offset : %lld, %lld", self, offset, self.reader.readOffset);
  79. }
  80. - (BOOL)isDone
  81. {
  82. KTVHCLogHTTPResponse(@"%p, Check done : %d", self, self.reader.didFinished);
  83. return self.reader.didFinished;
  84. }
  85. - (void)connectionDidClose
  86. {
  87. KTVHCLogHTTPResponse(@"%p, Connection did closed : %lld, %lld", self, self.reader.response.currentLength, self.reader.readOffset);
  88. [self.reader close];
  89. }
  90. #pragma mark - KTVHCDataReaderDelegate
  91. - (void)readerDidPrepared:(KTVHCDataReader *)reader
  92. {
  93. KTVHCLogHTTPResponse(@"%p, Prepared", self);
  94. if (self.reader.didPrepared && self.waitingResponseHeader == YES)
  95. {
  96. KTVHCLogHTTPResponse(@"%p, Call connection did prepared", self);
  97. [self.connection responseHasAvailableData:self];
  98. }
  99. }
  100. - (void)readerHasAvailableData:(KTVHCDataReader *)reader
  101. {
  102. KTVHCLogHTTPResponse(@"%p, Has available data", self);
  103. [self.connection responseHasAvailableData:self];
  104. }
  105. - (void)reader:(KTVHCDataReader *)reader didFailed:(NSError *)error
  106. {
  107. KTVHCLogHTTPResponse(@"%p, Failed\nError : %@", self, error);
  108. [self.reader close];
  109. [self.connection responseDidAbort:self];
  110. }
  111. @end