QCloudRequestData+COSXMLVersion.m 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. //
  2. #import "QCloudRequestData+COSXMLVersion.h"
  3. #import <QCloudCore/QCloudSDKModuleManager.h>
  4. static NSString *const kCOSXMLModuleName = @"QCloudCOSXML";
  5. @implementation QCloudRequestData (COSXMLVersion)
  6. + (void)load {
  7. static dispatch_once_t onceToken;
  8. dispatch_once(&onceToken, ^{
  9. Class class = [self class];
  10. SEL originalSelector = @selector(loadDefaultHTTPHeaders);
  11. SEL swizzledSelector = @selector(swizzle_loadDefaultHTTPHeaders);
  12. Method originalMethod = class_getInstanceMethod(class, originalSelector);
  13. Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  14. BOOL didAddMethod
  15. = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
  16. if (didAddMethod) {
  17. class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
  18. } else {
  19. method_exchangeImplementations(originalMethod, swizzledMethod);
  20. }
  21. });
  22. }
  23. - (void)swizzle_loadDefaultHTTPHeaders {
  24. [self swizzle_loadDefaultHTTPHeaders];
  25. static NSDictionary *httpHeaders;
  26. static dispatch_once_t onceToken;
  27. dispatch_once(&onceToken, ^{
  28. __block NSString *versionString;
  29. NSArray *modules = [[QCloudSDKModuleManager shareInstance] allModules];
  30. [modules enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *_Nonnull stop) {
  31. QCloudSDKModule *module = obj;
  32. if ([module.name isEqualToString:kCOSXMLModuleName]) {
  33. versionString = module.version;
  34. *stop = YES;
  35. }
  36. }];
  37. NSString *userAgent = [NSString stringWithFormat:@"cos-xml-ios-sdk-v%@", versionString];
  38. httpHeaders = @ { @"Connection" : @"keep-alive", HTTPHeaderUserAgent : userAgent };
  39. });
  40. [httpHeaders enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL *_Nonnull stop) {
  41. [self setValue:obj forHTTPHeaderField:key];
  42. }];
  43. }
  44. @end