mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-19 19:07:48 +02:00
naettClose cleared res->request and then asked the backend to close the response - but the request is what a backend needs to do that. On Windows it owns the WinHTTP handles, so the close had nothing to work with, which is part of why it did nothing at all. Backend first, then clear. With that in place, the Windows close unhooks the status callback and shuts the request handle, so a completion raised later can't write through the response after it's freed. It stops short of a full cancel: a callback already running on another thread isn't waited for, which needs the HANDLE_CLOSING handshake. On Apple, invalidateAndCancel returns before the session has finished with its delegate, so clear the delegate's pointer back to the response first and have didReceiveData check it, the way didCompleteWithError already did. Android is still the only backend that genuinely cancels and waits, so naett.h now says a response should be complete before it's closed rather than leaving that to be discovered.
naett /nɛt:/
Tiny HTTP client library in C.
Wraps native HTTP client functionality on macOS, Windows, Linux, iOS and Android in a single, simple non-blocking API.
Using naett
Get the naett.c and naett.h files and throw them into your project. Check out the example for a basic Makefile - based setup.
The library needs to be initialized by a call to naettInit(). On Android, you need to provide a JavaVM* handle in the call to naettInit().
On the other platforms, call with NULL.
See naett.h for reference docs.
Platform implementations
naett uses the following HTTP client libraries on each platform:
| Platform | Library / component | Build with |
|---|---|---|
| macOS, iOS | NSURLRequest | -framework Foundation |
| Windows | WinHTTP Sessions | -lwinhttp |
| Android | java.net.URL | NDK |
| Linux | libcurl | -lcurl -lpthread |
Example
#include "naett.h"
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv) {
naettInit(NULL);
naettReq* req =
naettRequest("https://foo.site.net", naettMethod("GET"), naettHeader("accept", "application/json"));
naettRes* res = naettMake(req);
while (!naettComplete(res)) {
usleep(100 * 1000);
}
if (naettGetStatus(res) < 0) {
printf("Request failed\n");
return 1;
}
int bodyLength = 0;
const char* body = naettGetBody(res, &bodyLength);
printf("Got %d bytes of type '%s':\n", bodyLength, naettGetHeader(res, "Content-Type"));
printf("%.100s\n...\n", body);
}