From f655636db7282a694ed7764bd07fb985e960c2aa Mon Sep 17 00:00:00 2001 From: Nick Bourdakos Date: Fri, 17 Feb 2023 15:47:34 -0800 Subject: [PATCH] Implement `SendRequest` for Apple platform PiperOrigin-RevId: 510539758 --- .../platform/implementation/apple/platform.mm | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/internal/platform/implementation/apple/platform.mm b/internal/platform/implementation/apple/platform.mm index 87635dc1..2e442403 100644 --- a/internal/platform/implementation/apple/platform.mm +++ b/internal/platform/implementation/apple/platform.mm @@ -172,10 +172,56 @@ std::unique_ptr ImplementationPlatform::CreateWifiDirectMedium std::unique_ptr ImplementationPlatform::CreateWebRtcMedium() { return nullptr; } #endif -// TODO(b/261511669): Add implementation. -absl::StatusOr ImplementationPlatform::SendRequest( - const WebRequest& request) { - return absl::UnimplementedError(""); +absl::StatusOr ImplementationPlatform::SendRequest(const WebRequest& requestInfo) { + NSURL* url = [NSURL URLWithString:@(requestInfo.url.c_str())]; + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url]; + [request setHTTPMethod:@(requestInfo.method.c_str())]; + for (const auto& header : requestInfo.headers) { + [request setValue:@(header.second.c_str()) forHTTPHeaderField:@(header.first.c_str())]; + } + [request setHTTPBody:[@(requestInfo.body.c_str()) dataUsingEncoding:NSUTF8StringEncoding]]; + + NSCondition* condition = [[NSCondition alloc] init]; + [condition lock]; + + __block NSData* blockData = nil; + __block NSHTTPURLResponse* blockResponse = nil; + __block NSError* blockError = nil; + NSURLSessionDataTask* task = [[NSURLSession sharedSession] + dataTaskWithRequest:request + completionHandler:^(NSData* data, NSURLResponse* response, NSError* error) { + [condition lock]; + blockData = data; + if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + blockResponse = (NSHTTPURLResponse*)response; + } + blockError = error; + [condition signal]; + [condition unlock]; + }]; + + [task resume]; + [condition wait]; + [condition unlock]; + + if (blockResponse == nil) { + return absl::UnknownError([[blockError localizedDescription] UTF8String]); + } + + WebResponse webResponse; + webResponse.status_code = blockResponse.statusCode; + webResponse.status_text = + [[NSHTTPURLResponse localizedStringForStatusCode:blockResponse.statusCode] UTF8String]; + NSDictionary* headers = blockResponse.allHeaderFields; + for (NSString* key in headers) { + NSString* value = [headers objectForKey:key]; + webResponse.headers.insert({[key UTF8String], [value UTF8String]}); + } + if (blockData != nil) { + webResponse.body = [[[NSString alloc] initWithData:blockData + encoding:NSUTF8StringEncoding] UTF8String]; + } + return webResponse; } // TODO(b/261511529): Add implementation.