PHP 7.4.33
Preview: RCTInspectorNetworkHelper.mm Size: 4.15 KB
/var/www/uibuilder.cmshelp.dk/httpdocs/node_modules/react-native/React/DevSupport/RCTInspectorNetworkHelper.mm
/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

#import "RCTInspectorNetworkHelper.h"
#import <React/RCTLog.h>

typedef void (^ListenerBlock)(RCTInspectorNetworkListener *);

@interface RCTInspectorNetworkHelper () <NSURLSessionDataDelegate>
@property (nonatomic, strong) NSURLSession *session;
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, void (^)(ListenerBlock)> *executorsByTaskId;
- (void)withListenerForTask:(NSURLSessionTask *)task execute:(ListenerBlock)block;
@end

@implementation RCTInspectorNetworkHelper

- (instancetype)init
{
  self = [super init];
  if (self) {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    self.executorsByTaskId = [NSMutableDictionary new];
  }
  return self;
}

- (void)loadNetworkResourceWithParams:(const RCTInspectorLoadNetworkResourceRequest &)params
                             executor:(RCTInspectorNetworkExecutor)executor
{
  NSString *urlString = [NSString stringWithCString:params.url.c_str() encoding:NSUTF8StringEncoding];
  NSURL *url = [NSURL URLWithString:urlString];
  auto executorBlock = ^(ListenerBlock func) {
    executor([=](RCTInspectorNetworkListener &listener) { func(&listener); });
  };

  if (url == nil) {
    executorBlock(^(RCTInspectorNetworkListener *listener) {
      listener->onError([NSString stringWithFormat:@"Not a valid URL: %@", urlString].UTF8String);
    });
    return;
  }

  NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
  [urlRequest setHTTPMethod:@"GET"];
  NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:urlRequest];
  __weak NSURLSessionDataTask *weakDataTask = dataTask;

  executorBlock(^(RCTInspectorNetworkListener *listener) {
    listener->setCancelFunction([weakDataTask]() { [weakDataTask cancel]; });
  });

  // Store the executor as a block per task.
  self.executorsByTaskId[@(dataTask.taskIdentifier)] = executorBlock;

  [dataTask resume];
}

- (void)withListenerForTask:(NSURLSessionTask *)task execute:(ListenerBlock)block
{
  void (^executor)(ListenerBlock) = self.executorsByTaskId[@(task.taskIdentifier)];
  if (executor) {
    executor(block);
  }
}

#pragma mark - NSURLSessionDataDelegate

- (void)URLSession:(NSURLSession *)session
              dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveResponse:(NSURLResponse *)response
     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
  auto callbackWithHeadersOrError = (^(RCTInspectorNetworkListener *listener) {
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
      std::map<std::string, std::string> headersMap;
      for (NSString *key in httpResponse.allHeaderFields) {
        headersMap[[key UTF8String]] = [[httpResponse.allHeaderFields objectForKey:key] UTF8String];
      }
      completionHandler(NSURLSessionResponseAllow);
      listener->onHeaders(httpResponse.statusCode, headersMap);
    } else {
      listener->onError("Unsupported response type");
      completionHandler(NSURLSessionResponseCancel);
    }
  });
  [self withListenerForTask:dataTask execute:callbackWithHeadersOrError];
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
  auto callbackWithData = ^(RCTInspectorNetworkListener *listener) {
    listener->onData(std::string_view(static_cast<const char *>(data.bytes), data.length));
  };
  [self withListenerForTask:dataTask execute:callbackWithData];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
  auto callbackWithCompletionOrError = ^(RCTInspectorNetworkListener *listener) {
    if (error != nil) {
      listener->onError(error.localizedDescription.UTF8String);
    } else {
      listener->onCompletion();
    }
  };
  [self withListenerForTask:task execute:callbackWithCompletionOrError];
}

@end

Directory Contents

Dirs: 0 × Files: 15
Name Size Perms Modified Actions
540 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
331 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
514 B lrw-r--r-- 2025-03-28 11:04:43
Edit Download
655 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
7.31 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
953 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
4.15 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
773 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
1.86 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
1.05 KB lrw-r--r-- 2025-03-28 11:04:41
Edit Download
1.51 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
2.69 KB lrw-r--r-- 2025-03-28 11:04:41
Edit Download
11.39 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
385 B lrw-r--r-- 2025-03-28 11:04:41
Edit Download
4.88 KB lrw-r--r-- 2025-03-28 11:04:43
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).