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 5273897e0ef2b0186df29923dd3e297699d599ca
parent cd88323090b78b972059b7ab34af05456930e1a5
Author: Henrik RydgÄrd <hrydgard@gmail.com>
Date:   Fri, 21 Jul 2023 15:21:19 +0200

Amalgamation

Diffstat:
Mnaett.c | 47+++++++++++++++++++++++++++++------------------
1 file changed, 29 insertions(+), 18 deletions(-)

diff --git a/naett.c b/naett.c @@ -7,12 +7,13 @@ #ifdef _MSC_VER #define strcasecmp _stricmp - #define min(a,b) (((a)<(b))?(a):(b)) + #undef strdup #define strdup _strdup #endif #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN +#define NOMINMAX #include <windows.h> #include <winhttp.h> #define __WINDOWS__ 1 @@ -251,27 +252,27 @@ naettOption* naettMethod(const char* method) { return (naettOption*)option; } -naettOption* naettUserAgent(const char* method) { +naettOption* naettHeader(const char* name, const char* value) { naettAlloc(InternalOption, option); option->numParams = 1; InternalParam* param = &option->params[0]; - param->string = method; - param->offset = offsetof(RequestOptions, userAgent); - param->setter = stringSetter; + param->kv.key = name; + param->kv.value = value; + param->offset = offsetof(RequestOptions, headers); + param->setter = kvSetter; return (naettOption*)option; } -naettOption* naettHeader(const char* name, const char* value) { +naettOption* naettUserAgent(const char* method) { naettAlloc(InternalOption, option); option->numParams = 1; InternalParam* param = &option->params[0]; - param->kv.key = name; - param->kv.value = value; - param->offset = offsetof(RequestOptions, headers); - param->setter = kvSetter; + param->string = method; + param->offset = offsetof(RequestOptions, userAgent); + param->setter = stringSetter; return (naettOption*)option; } @@ -623,7 +624,7 @@ int naettPlatformInitRequest(InternalRequest* req) { { id name = NSString("User-Agent"); - id value = NSString(NAETT_UA); + id value = NSString(req->options.userAgent ? req->options.userAgent : NAETT_UA); objc_msgSend_t(void, id, id)(request, sel("setValue:forHTTPHeaderField:"), value, name); } @@ -951,7 +952,11 @@ void naettPlatformMakeRequest(InternalResponse* res) { setupMethod(c, req->options.method); struct curl_slist* headerList = NULL; - headerList = curl_slist_append(headerList, "User-Agent: Naett/1.0"); + char uaBuf[512]; + if (req->options.userAgent) { + snprintf(uaBuf, sizeof(uaBuf), "User-Agent: %s", req->options.userAgent ? req->options.userAgent : NAETT_UA); + } + headerList = curl_slist_append(headerList, uaBuf); KVLink* header = req->options.headers; size_t bufferSize = 0; @@ -995,6 +1000,7 @@ void naettPlatformCloseResponse(InternalResponse* res) { #include <string.h> #include <winhttp.h> #include <assert.h> +#include <tchar.h> void naettPlatformInit(naettInitData initData) { } @@ -1052,7 +1058,7 @@ static LPCWSTR packHeaders(InternalRequest* req) { } static void unpackHeaders(InternalResponse* res, LPWSTR packed) { - int len = 0; + size_t len = 0; while ((len = wcslen(packed)) != 0) { char* header = winToUTF8(packed); char* split = strchr(header, ':'); @@ -1125,7 +1131,7 @@ static void callback(HINTERNET request, } size_t bytesToRead = min(res->bytesLeft, sizeof(res->buffer)); - if (!WinHttpReadData(request, res->buffer, bytesToRead, NULL)) { + if (!WinHttpReadData(request, res->buffer, (DWORD)bytesToRead, NULL)) { res->code = naettReadError; res->complete = 1; } @@ -1135,7 +1141,7 @@ static void callback(HINTERNET request, size_t bytesRead = statusInfoLength; InternalRequest* req = res->request; - if (req->options.bodyWriter(res->buffer, bytesRead, req->options.bodyWriterData) != bytesRead) { + if (req->options.bodyWriter(res->buffer, (int)bytesRead, req->options.bodyWriterData) != bytesRead) { res->code = naettReadError; res->complete = 1; } @@ -1143,7 +1149,7 @@ static void callback(HINTERNET request, res->bytesLeft -= bytesRead; if (res->bytesLeft > 0) { size_t bytesToRead = min(res->bytesLeft, sizeof(res->buffer)); - if (!WinHttpReadData(request, res->buffer, bytesToRead, NULL)) { + if (!WinHttpReadData(request, res->buffer, (DWORD)bytesToRead, NULL)) { res->code = naettReadError; res->complete = 1; } @@ -1214,8 +1220,13 @@ int naettPlatformInitRequest(InternalRequest* req) { req->resource = wcsndup(components.lpszUrlPath, components.dwUrlPathLength + components.dwExtraInfoLength); free(url); + LPWSTR uaBuf = 0; + if (req->options.userAgent) { + uaBuf = winFromUTF8(req->options.userAgent); + } req->session = WinHttpOpen( - L"Naett/1.0", WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC); + uaBuf ? uaBuf : _T(NAETT_UA), WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, WINHTTP_FLAG_ASYNC); + free(uaBuf); if (!req->session) { return 0; @@ -1421,7 +1432,7 @@ static void* processRequest(void* data) { { jstring name = (*env)->NewStringUTF(env, "User-Agent"); - jstring value = (*env)->NewStringUTF(env, NAETT_UA); + jstring value = (*env)->NewStringUTF(env, req->options.userAgent ? req->options.userAgent : NAETT_UA); voidCall(env, connection, "addRequestProperty", "(Ljava/lang/String;Ljava/lang/String;)V", name, value); (*env)->DeleteLocalRef(env, name); (*env)->DeleteLocalRef(env, value);