NSURLRequest+QNRequest.m 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // NSURLRequest+QNRequest.m
  3. // AppTest
  4. //
  5. // Created by yangsen on 2020/4/8.
  6. // Copyright © 2020 com.qiniu. All rights reserved.
  7. //
  8. #import <objc/runtime.h>
  9. #import "NSURLRequest+QNRequest.h"
  10. @implementation NSURLRequest(QNRequest)
  11. #define kQNURLReuestHostKey @"Host"
  12. #define kQNURLReuestIdentifierKey @"QNURLReuestIdentifier"
  13. - (BOOL)qn_isQiNiuRequest{
  14. if (self.qn_identifier && self.qn_domain) {
  15. return YES;
  16. } else {
  17. return NO;
  18. }
  19. }
  20. - (NSString *)qn_identifier{
  21. return self.allHTTPHeaderFields[kQNURLReuestIdentifierKey];
  22. }
  23. - (NSString *)qn_domain{
  24. NSString *host = self.allHTTPHeaderFields[kQNURLReuestHostKey];
  25. if (host == nil) {
  26. host = self.URL.host;
  27. }
  28. return host;
  29. }
  30. - (NSDictionary *)qn_allHTTPHeaderFields{
  31. NSDictionary *headerFields = [self.allHTTPHeaderFields copy];
  32. NSMutableDictionary *headerFieldsNew = [NSMutableDictionary dictionary];
  33. for (NSString *key in headerFields) {
  34. if (![key isEqualToString:kQNURLReuestIdentifierKey]) {
  35. [headerFieldsNew setObject:headerFields[key] forKey:key];
  36. }
  37. }
  38. return [headerFieldsNew copy];
  39. }
  40. + (instancetype)qn_requestWithURL:(NSURL *)url{
  41. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  42. [request setValue:url.host forHTTPHeaderField:kQNURLReuestHostKey];
  43. return request;
  44. }
  45. - (NSData *)qn_getHttpBody{
  46. if (self.HTTPBody || ![self.HTTPMethod isEqualToString:@"POST"]) {
  47. return self.HTTPBody;
  48. }
  49. NSInteger maxLength = 1024;
  50. uint8_t d[maxLength];
  51. NSInputStream *stream = self.HTTPBodyStream;
  52. NSMutableData *data = [NSMutableData data];
  53. [stream open];
  54. BOOL end = NO;
  55. while (!end) {
  56. NSInteger bytesRead = [stream read:d maxLength:maxLength];
  57. if (bytesRead == 0) {
  58. end = YES;
  59. } else if (bytesRead == -1){
  60. end = YES;
  61. } else if (stream.streamError == nil){
  62. [data appendBytes:(void *)d length:bytesRead];
  63. }
  64. }
  65. [stream close];
  66. return [data copy];
  67. }
  68. - (BOOL)qn_isHttps{
  69. if ([self.URL.absoluteString rangeOfString:@"https://"].location != NSNotFound) {
  70. return YES;
  71. } else {
  72. return NO;
  73. }
  74. }
  75. @end
  76. @implementation NSMutableURLRequest(QNRequest)
  77. - (void)setQn_domain:(NSString *)qn_domain{
  78. if (qn_domain) {
  79. [self addValue:qn_domain forHTTPHeaderField:kQNURLReuestHostKey];
  80. } else {
  81. [self setValue:nil forHTTPHeaderField:kQNURLReuestHostKey];
  82. }
  83. NSString *identifier = [NSString stringWithFormat:@"%p-%@", &self, qn_domain];
  84. [self setQn_identifier:identifier];
  85. }
  86. - (void)setQn_identifier:(NSString *)qn_identifier{
  87. if (qn_identifier) {
  88. [self addValue:qn_identifier forHTTPHeaderField:kQNURLReuestIdentifierKey];
  89. } else {
  90. [self setValue:nil forHTTPHeaderField:kQNURLReuestIdentifierKey];
  91. }
  92. }
  93. @end