naett.c

Tiny cross-platform HTTP / HTTPS client library in C.
git clone git://git.finwo.net/lib/naett.c
Log | Files | Refs | README | LICENSE

commit 333252b443356f2bb9733ea2656a09c66d2fd203
parent e7153ba8e36b60b8d7e7a10fa0c436834774ef37
Author: Henrik RydgÄrd <hrydgard@gmail.com>
Date:   Fri, 21 Jul 2023 17:24:20 +0200

When reading headers, don't update res->headers until the loop is done.

Diffstat:
Msrc/naett_android.c | 6++++--
Msrc/naett_osx.c | 6++++--
Msrc/naett_win.c | 6++++--
3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/naett_android.c b/src/naett_android.c @@ -171,6 +171,7 @@ static void* processRequest(void* data) { jarray headers = call(env, headerSet, "toArray", "()[Ljava/lang/Object;"); jsize headerCount = (*env)->GetArrayLength(env, headers); + KVLink *firstHeader = NULL; for (int i = 0; i < headerCount; i++) { jstring name = (*env)->GetObjectArrayElement(env, headers, i); if (name == NULL) { @@ -185,8 +186,8 @@ static void* processRequest(void* data) { naettAlloc(KVLink, node); node->key = strdup(nameString); node->value = strdup(valueString); - node->next = res->headers; - res->headers = node; + node->next = firstHeader; + firstHeader = node; (*env)->ReleaseStringUTFChars(env, name, nameString); (*env)->ReleaseStringUTFChars(env, value, valueString); @@ -195,6 +196,7 @@ static void* processRequest(void* data) { (*env)->DeleteLocalRef(env, value); (*env)->DeleteLocalRef(env, values); } + res->headers = firstHeader; int statusCode = intCall(env, connection, "getResponseCode", "()I"); diff --git a/src/naett_osx.c b/src/naett_osx.c @@ -97,13 +97,15 @@ void didReceiveData(id self, SEL _sel, id session, id dataTask, id data) { objc_msgSend_t(NSInteger, id*, id*, NSUInteger)( allHeaders, sel("getObjects:andKeys:count:"), headerValues, headerNames, headerCount); + KVLink *firstHeader = NULL; for (int i = 0; i < headerCount; i++) { naettAlloc(KVLink, node); node->key = strdup(objc_msgSend_t(const char*)(headerNames[i], sel("UTF8String"))); node->value = strdup(objc_msgSend_t(const char*)(headerValues[i], sel("UTF8String"))); - node->next = res->headers; - res->headers = node; + node->next = firstHeader; + firstHeader = node; } + res->headers = firstHeader; } const void* bytes = objc_msgSend_t(const void*)(data, sel("bytes")); diff --git a/src/naett_win.c b/src/naett_win.c @@ -66,6 +66,7 @@ static LPCWSTR packHeaders(InternalRequest* req) { static void unpackHeaders(InternalResponse* res, LPWSTR packed) { size_t len = 0; + KVLink* firstHeader = NULL; while ((len = wcslen(packed)) != 0) { char* header = winToUTF8(packed); char* split = strchr(header, ':'); @@ -78,12 +79,13 @@ static void unpackHeaders(InternalResponse* res, LPWSTR packed) { naettAlloc(KVLink, node); node->key = strdup(header); node->value = strdup(split); - node->next = res->headers; - res->headers = node; + node->next = firstHeader; + firstHeader = node; } free(header); packed += len + 1; } + res->headers = firstHeader; } static void CALLBACK callback(HINTERNET request,