EMASCurlDemo/RequestDemoController.m (107 lines of code) (raw):

#import "RequestDemoController.h" #import <EMASCurl/EMASCurl.h> @interface RequestDemoController () <NSURLSessionDataDelegate> @property (nonatomic, strong) UIButton *getButton; @property (nonatomic, strong) UIButton *uploadButton; @property (nonatomic, strong) UITextView *resultTextView; @property (nonatomic, strong) NSURLSession *session; @end @implementation RequestDemoController - (void)viewDidLoad { [super viewDidLoad]; self.title = @"Request Demo"; self.view.backgroundColor = [UIColor whiteColor]; [self setupSession]; [self setupUI]; } - (void)setupSession { NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.timeoutIntervalForRequest = 30; configuration.timeoutIntervalForResource = 300; [EMASCurlProtocol setDebugLogEnabled:YES]; [EMASCurlProtocol setBuiltInRedirectionEnabled:NO]; [EMASCurlProtocol installIntoSessionConfiguration:configuration]; self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; } - (void)setupUI { // Get Button self.getButton = [UIButton buttonWithType:UIButtonTypeSystem]; [self.getButton setTitle:@"GET Request" forState:UIControlStateNormal]; self.getButton.frame = CGRectMake(20, 100, self.view.bounds.size.width - 40, 44); [self.getButton addTarget:self action:@selector(getButtonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.getButton]; // Upload Button self.uploadButton = [UIButton buttonWithType:UIButtonTypeSystem]; [self.uploadButton setTitle:@"Upload Request" forState:UIControlStateNormal]; self.uploadButton.frame = CGRectMake(20, 160, self.view.bounds.size.width - 40, 44); [self.uploadButton addTarget:self action:@selector(uploadButtonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.uploadButton]; // Result TextView self.resultTextView = [[UITextView alloc] initWithFrame:CGRectMake(20, 220, self.view.bounds.size.width - 40, 500)]; self.resultTextView.editable = NO; self.resultTextView.layer.borderColor = [UIColor lightGrayColor].CGColor; self.resultTextView.layer.borderWidth = 1.0; self.resultTextView.layer.cornerRadius = 5.0; self.resultTextView.font = [UIFont systemFontOfSize:14]; [self.view addSubview:self.resultTextView]; } - (void)getButtonTapped { NSString *urlString = @"https://mooc1-api.chaoxing.com/mooc-ans/exam/test/transfer/examlist?cxanalyzetag=hp"; NSURL *url = [NSURL URLWithString:urlString]; self.resultTextView.text = @""; // Clear previous results NSURLSessionDataTask *task = [self.session dataTaskWithURL:url]; [task resume]; } - (void)uploadButtonTapped { NSString *urlString = @"https://httpbin.org/post"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [EMASCurlProtocol setMetricsObserverBlockForRequest:request metricsObserverBlock:^(NSURLRequest * _Nonnull request, BOOL success, NSError * _Nullable error, double nameLookUpTimeMS, double connectTimeMs, double appConnectTimeMs, double preTransferTimeMs, double startTransferTimeMs, double totalTimeMs) { NSLog(@"Network Metrics:\n" "Success: %d\n" "Error: %@\n" "DNS Lookup: %.2fms\n" "Connect: %.2fms\n" "App Connect: %.2fms\n" "Pre-transfer: %.2fms\n" "Start Transfer: %.2fms\n" "Total: %.2fms", success, error, nameLookUpTimeMS, connectTimeMs, appConnectTimeMs, preTransferTimeMs, startTransferTimeMs, totalTimeMs); }]; request.HTTPMethod = @"POST"; // Create sample data to upload NSString *sampleText = @"Hello, this is a test upload!"; NSData *uploadData = [sampleText dataUsingEncoding:NSUTF8StringEncoding]; self.resultTextView.text = @""; // Clear previous results NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromData:uploadData]; [uploadTask resume]; } #pragma mark - NSURLSessionDataDelegate - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { // Called when the request first receives a response NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSUInteger code = 0; if (httpResponse) { code = httpResponse.statusCode; } NSLog(@">>> %@ didRecievedResponse - %lu", dataTask.currentRequest.URL.absoluteString, code); completionHandler(NSURLSessionResponseAllow); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // Called as data arrives NSString *receivedString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; self.resultTextView.text = [self.resultTextView.text stringByAppendingString:receivedString]; } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { NSLog(@">>> %@ didComplete - ", task.currentRequest.URL.absoluteString); if (error) { self.resultTextView.text = [NSString stringWithFormat:@"Error: %@", error.localizedDescription]; } } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { NSLog(@">>> %@ willRedirect - ", task.currentRequest.URL.absoluteString); // Log redirect information NSString *redirectInfo = [NSString stringWithFormat:@"Redirecting from: %@\nTo: %@\n\n", task.originalRequest.URL, request.URL]; self.resultTextView.text = [self.resultTextView.text stringByAppendingString:redirectInfo]; // Allow the redirect by passing the new request to the completion handler completionHandler(request); } @end