diff --git a/src/ClassiCube.vcxproj b/src/ClassiCube.vcxproj
index f3b907eec..af90e9d24 100644
--- a/src/ClassiCube.vcxproj
+++ b/src/ClassiCube.vcxproj
@@ -289,6 +289,7 @@
+
diff --git a/src/ClassiCube.vcxproj.filters b/src/ClassiCube.vcxproj.filters
index 1c49f3a8f..4f8c6cb9f 100644
--- a/src/ClassiCube.vcxproj.filters
+++ b/src/ClassiCube.vcxproj.filters
@@ -584,5 +584,8 @@
Source Files\Graphics
+
+ Source Files\Platform
+
\ No newline at end of file
diff --git a/src/Core.h b/src/Core.h
index 6724b74e8..31bd81f12 100644
--- a/src/Core.h
+++ b/src/Core.h
@@ -188,14 +188,16 @@ Thus it is **NOT SAFE** to allocate a string on the stack. */
#define CC_BUILD_GLMODERN
#define CC_BUILD_IOS
#define CC_BUILD_TOUCH
+#define CC_BUILD_CFNETWORK
#elif defined __x86_64__ || defined __arm64__
#define CC_BUILD_COCOA
#define CC_BUILD_MACOS
+#define CC_BUILD_CURL
#else
#define CC_BUILD_CARBON
#define CC_BUILD_MACOS
-#endif
#define CC_BUILD_CURL
+#endif
#define CC_BUILD_OPENAL
#elif defined __sun__
#define CC_BUILD_SOLARIS
diff --git a/src/Http_Worker.c b/src/Http_Worker.c
index 44ddc2df6..6b6804be3 100644
--- a/src/Http_Worker.c
+++ b/src/Http_Worker.c
@@ -745,6 +745,80 @@ static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) {
http_curProgress = 100;
return res;
}
+#elif defined CC_BUILD_CFNETWORK
+#include "Errors.h"
+#include
+#include
+
+
+cc_bool Http_DescribeError(cc_result res, cc_string* dst) {
+ return false;
+}
+
+static void HttpBackend_Init(void) {
+
+}
+
+static void Http_AddHeader(struct HttpRequest* req, const char* key, const cc_string* value) {
+ char tmp[NATIVE_STR_LEN];
+ CFStringRef keyCF, valCF;
+ CFHTTPMessageRef msg = (CFHTTPMessageRef)req->meta;
+ Platform_EncodeUtf8(tmp, value);
+
+ keyCF = CFStringCreateWithCString(NULL, key, kCFStringEncodingUTF8);
+ valCF = CFStringCreateWithCString(NULL, tmp, kCFStringEncodingUTF8);
+ CFHTTPMessageSetHeaderFieldValue(msg, keyCF, valCF);
+ CFRelease(keyCF);
+ CFRelease(valCF);
+}
+
+static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) {
+ static CFStringRef verbs[] = { CFSTR("GET"), CFSTR("HEAD"), CFSTR("POST") };
+ char tmp[NATIVE_STR_LEN];
+ CFStringRef urlCF;
+ CFURLRef urlRef;
+ CFHTTPMessageRef msg;
+
+ Platform_EncodeUtf8(tmp, url);
+ urlCF = CFStringCreateWithCString(NULL, tmp, kCFStringEncodingUTF8);
+ urlRef = CFURLCreateWithString(NULL, urlCF, NULL);
+
+ msg = CFHTTPMessageCreateRequest(NULL, verbs[req->requestType], urlRef, kCFHTTPVersion1_1);
+ req->meta = msg;
+ Http_SetRequestHeaders(req);
+
+ if (req->data && req->size) {
+ CFDataRef body = CFDataCreate(NULL, req->data, req->size);
+ CFHTTPMessageSetBody(msg, body);
+ CFRelease(body); /* TODO: ???? */
+
+ req->data = NULL;
+ req->size = 0;
+ Mem_Free(req->data);
+ }
+
+ CFReadStreamRef stream = CFReadStreamCreateForHTTPRequest(NULL, msg);
+ CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue);
+ //CFHTTPReadStreamSetRedirectsAutomatically(stream, TRUE);
+ CFReadStreamOpen(stream);
+ CFIndex read = 0;
+ char buf[1024];
+
+ for (;;) {
+ CFIndex read = CFReadStreamRead(stream, buf, sizeof(buf));
+ if (read <= 0) break;
+
+ if (!req->_capacity) Http_BufferInit(req);
+ Http_BufferEnsure(req, read);
+
+ Mem_Copy(&req->data[req->size], buf, read);
+ Http_BufferExpanded(req, read);
+ }
+
+ // error handling? what's that anyways?
+ req->statusCode = 200;
+ return 0;
+}
#endif
static void ClearCurrentRequest(void) {