From 279c36fcf0a4466cb14d350aefcfaedf547a0f0a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 28 Sep 2021 12:43:22 +1000 Subject: [PATCH] iOS: Add a CFNetwork http backend that barely works --- src/ClassiCube.vcxproj | 1 + src/ClassiCube.vcxproj.filters | 3 ++ src/Core.h | 4 +- src/Http_Worker.c | 74 ++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) 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) {