apple_net.m 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <iron_net.h>
  2. #import <Foundation/Foundation.h>
  3. void iron_http_request(const char *url, const char *path, const char *data, int port, bool secure, int method, const char *header,
  4. iron_http_callback_t callback, void *callbackdata) {
  5. NSString *urlstring = secure ? @"https://" : @"http://";
  6. urlstring = [urlstring stringByAppendingString:[NSString stringWithUTF8String:url]];
  7. urlstring = [urlstring stringByAppendingString:@":"];
  8. urlstring = [urlstring stringByAppendingString:[[NSNumber numberWithInt:port] stringValue]];
  9. urlstring = [urlstring stringByAppendingString:@"/"];
  10. urlstring = [urlstring stringByAppendingString:[NSString stringWithUTF8String:path]];
  11. NSURL *aUrl = [NSURL URLWithString:urlstring];
  12. NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
  13. sessionConfiguration.HTTPAdditionalHeaders = @{@"Content-Type" : @"application/json"};
  14. NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];
  15. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl];
  16. if (data != 0) {
  17. // printf("Sending %s\n\n", data);
  18. NSString *datastring = [NSString stringWithUTF8String:data];
  19. request.HTTPBody = [datastring dataUsingEncoding:NSUTF8StringEncoding];
  20. }
  21. switch (method) {
  22. case IRON_HTTP_GET:
  23. request.HTTPMethod = @"GET";
  24. break;
  25. case IRON_HTTP_POST:
  26. request.HTTPMethod = @"POST";
  27. break;
  28. case IRON_HTTP_PUT:
  29. request.HTTPMethod = @"PUT";
  30. break;
  31. case IRON_HTTP_DELETE:
  32. request.HTTPMethod = @"DELETE";
  33. break;
  34. }
  35. NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
  36. completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  37. NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
  38. int statusCode = (int)[httpResponse statusCode];
  39. NSMutableData *responseData = [[NSMutableData alloc] init];
  40. [responseData appendData:data];
  41. [responseData appendBytes:"\0" length:1];
  42. dispatch_async(dispatch_get_main_queue(), ^{
  43. callback(error ? 1 : 0, statusCode, (const char *)[responseData bytes], callbackdata);
  44. });
  45. }];
  46. [dataTask resume];
  47. }