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 77b391393383b8489c52742a78bbbbcba38d0cc6
parent c9523b511fb3a3e1edc8e08a8f3577fb64dd1000
Author: Erik Agsjö <erik.agsjo@gmail.com>
Date:   Mon,  6 Dec 2021 22:55:28 +0100

Set UA, read body bug fix

Diffstat:
Mnaett.c | 27+++++++++++++++++----------
Mnaett.h | 2++
Msrc/naett_osx.c | 23+++++++++++++++++------
3 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/naett.c b/naett.c @@ -565,23 +565,32 @@ static id pool() { void naettPlatformInit(naettInitData initData) { } +id NSString(const char* string) { + return objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), string); +} + int naettPlatformInitRequest(InternalRequest* req) { id p = pool(); - id urlString = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), req->url); + id urlString = NSString(req->url); id url = objc_msgSend_t(id, id)(class("NSURL"), sel("URLWithString:"), urlString); id request = objc_msgSend_t(id, id)(class("NSMutableURLRequest"), sel("requestWithURL:"), url); objc_msgSend_t(void, double)(request, sel("setTimeoutInterval:"), (double)(req->options.timeoutMS) / 1000.0); - id methodString = - objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), req->options.method); + id methodString = NSString(req->options.method); objc_msgSend_t(void, id)(request, sel("setHTTPMethod:"), methodString); + { + id name = NSString("User-Agent"); + id value = NSString(NAETT_UA); + objc_msgSend_t(void, id, id)(request, sel("setValue:forHTTPHeaderField:"), value, name); + } + KVLink* header = req->options.headers; while (header != NULL) { - id name = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), header->key); - id value = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), header->value); + id name = NSString(header->key); + id value = NSString(header->value); objc_msgSend_t(void, id, id)(request, sel("setValue:forHTTPHeaderField:"), value, name); header = header->next; } @@ -593,12 +602,14 @@ int naettPlatformInitRequest(InternalRequest* req) { id bodyData = objc_msgSend_t(id, NSUInteger)(class("NSMutableData"), sel("dataWithCapacity:"), sizeof(byteBuffer)); + int totalBytesRead = 0; do { bytesRead = req->options.bodyReader(byteBuffer, sizeof(byteBuffer), req->options.bodyReaderData); + totalBytesRead += bytesRead; objc_msgSend_t(void, const void*, NSUInteger)(bodyData, sel("appendBytes:length:"), byteBuffer, bytesRead); } while (bytesRead > 0); - if (bytesRead > 0) { + if (totalBytesRead > 0) { objc_msgSend_t(void, id)(request, sel("setHTTPBody:"), bodyData); } } @@ -1004,7 +1015,6 @@ static void unpackHeaders(InternalResponse* res, LPWSTR packed) { node->value = strdup(split); node->next = res->headers; res->headers = node; - printf("Unpacked header: %s=%s\n", node->key, node->value); } free(header); packed += len + 1; @@ -1133,7 +1143,6 @@ static void callback(HINTERNET request, int naettPlatformInitRequest(InternalRequest* req) { LPWSTR url = winFromUTF8(req->url); - printf("Connecting to %S\n", url); URL_COMPONENTS components; ZeroMemory(&components, sizeof(components)); @@ -1185,7 +1194,6 @@ int naettPlatformInitRequest(InternalRequest* req) { LPCWSTR headers = packHeaders(req); WinHttpAddRequestHeaders(req->request, headers, 0, WINHTTP_ADDREQ_FLAG_ADD); - printf("Request headers: %S\n", headers); free((LPWSTR)headers); return 1; @@ -1193,7 +1201,6 @@ int naettPlatformInitRequest(InternalRequest* req) { void naettPlatformMakeRequest(InternalResponse* res) { if (!WinHttpSendRequest(res->request->request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, NULL, 0, 0, (DWORD_PTR)res)) { - printf("Failed to send request\n"); res->code = naettConnectionError; res->complete = 1; } diff --git a/naett.h b/naett.h @@ -12,6 +12,8 @@ typedef JavaVM* naettInitData; typedef void* naettInitData; #endif +#define NAETT_UA "Naett/1.0" + /** * @brief Global init method. * Call to initialize the library. diff --git a/src/naett_osx.c b/src/naett_osx.c @@ -24,23 +24,32 @@ static id pool() { void naettPlatformInit(naettInitData initData) { } +id NSString(const char* string) { + return objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), string); +} + int naettPlatformInitRequest(InternalRequest* req) { id p = pool(); - id urlString = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), req->url); + id urlString = NSString(req->url); id url = objc_msgSend_t(id, id)(class("NSURL"), sel("URLWithString:"), urlString); id request = objc_msgSend_t(id, id)(class("NSMutableURLRequest"), sel("requestWithURL:"), url); objc_msgSend_t(void, double)(request, sel("setTimeoutInterval:"), (double)(req->options.timeoutMS) / 1000.0); - id methodString = - objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), req->options.method); + id methodString = NSString(req->options.method); objc_msgSend_t(void, id)(request, sel("setHTTPMethod:"), methodString); + { + id name = NSString("User-Agent"); + id value = NSString(NAETT_UA); + objc_msgSend_t(void, id, id)(request, sel("setValue:forHTTPHeaderField:"), value, name); + } + KVLink* header = req->options.headers; while (header != NULL) { - id name = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), header->key); - id value = objc_msgSend_t(id, const char*)(class("NSString"), sel("stringWithUTF8String:"), header->value); + id name = NSString(header->key); + id value = NSString(header->value); objc_msgSend_t(void, id, id)(request, sel("setValue:forHTTPHeaderField:"), value, name); header = header->next; } @@ -52,12 +61,14 @@ int naettPlatformInitRequest(InternalRequest* req) { id bodyData = objc_msgSend_t(id, NSUInteger)(class("NSMutableData"), sel("dataWithCapacity:"), sizeof(byteBuffer)); + int totalBytesRead = 0; do { bytesRead = req->options.bodyReader(byteBuffer, sizeof(byteBuffer), req->options.bodyReaderData); + totalBytesRead += bytesRead; objc_msgSend_t(void, const void*, NSUInteger)(bodyData, sel("appendBytes:length:"), byteBuffer, bytesRead); } while (bytesRead > 0); - if (bytesRead > 0) { + if (totalBytesRead > 0) { objc_msgSend_t(void, id)(request, sel("setHTTPBody:"), bodyData); } }