{"id":34947142,"url":"https://github.com/4l3x777/wkhttp_lib","last_synced_at":"2026-04-19T23:34:22.250Z","repository":{"id":327861657,"uuid":"1110503980","full_name":"4l3x777/wkhttp_lib","owner":"4l3x777","description":"Windows Kernel Http Library","archived":false,"fork":false,"pushed_at":"2026-03-09T11:33:58.000Z","size":1296,"stargazers_count":4,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-09T16:25:10.852Z","etag":null,"topics":["dns","dtls","http","https","kernel","mbedtls","tdi","tls","windows"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/4l3x777.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-05T09:42:51.000Z","updated_at":"2026-03-09T11:34:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/4l3x777/wkhttp_lib","commit_stats":null,"previous_names":["4l3x777/wkhttp_lib"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/4l3x777/wkhttp_lib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4l3x777%2Fwkhttp_lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4l3x777%2Fwkhttp_lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4l3x777%2Fwkhttp_lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4l3x777%2Fwkhttp_lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/4l3x777","download_url":"https://codeload.github.com/4l3x777/wkhttp_lib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4l3x777%2Fwkhttp_lib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32026708,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns","dtls","http","https","kernel","mbedtls","tdi","tls","windows"],"created_at":"2025-12-26T20:24:22.314Z","updated_at":"2026-04-19T23:34:22.235Z","avatar_url":"https://github.com/4l3x777.png","language":"C","readme":"# wkhttp: Windows Kernel HTTP \u0026 TLS\n\nKernel-mode HTTP/HTTPS client and TLS/DTLS transport library for Windows drivers.\n\n---\n\n## Проект был создан из-за отсутсвия на GitHub толковых библиотек для работы с http в контексте ядра Windows\n\n## Если понравился проект, жмякни стар (if you like the project, click star) ^_^\n\n---\n\n## 1. Integration Overview\n\n```C\n#include \u003cntddk.h\u003e\n#include \"ktls_lib.h\"   // TLS / DTLS transport\n#include \"kdns_lib.h\"   // DNS resolver\n#include \"khttp_lib.h\"  // High-level HTTP\n```\n\n```C\nNTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {\n    UNREFERENCED_PARAMETER(RegistryPath);\n    DriverObject-\u003eDriverUnload = DriverUnload;\n\n    KhttpGlobalInit();\n    \n    // Your code here...\n    \n    return STATUS_SUCCESS;\n}\n\nVOID DriverUnload(PDRIVER_OBJECT DriverObject) {\n    UNREFERENCED_PARAMETER(DriverObject);\n    KhttpGlobalCleanup();\n}\n```\n\n---\n\n## 2. HTTP/HTTPS API (`khttp_lib.h`)\n\nHigh-level, blocking HTTP client with automatic TCP/TLS handling.\n\n```C\ntypedef struct _KHTTP_RESPONSE {\n    ULONG StatusCode;\n    ULONG BodyLength;\n    PCHAR Body;\n} KHTTP_RESPONSE, *PKHTTP_RESPONSE;\n```\n\nSupported methods (all return `NTSTATUS` with `PKHTTP_RESPONSE`):\n\n- `KhttpGet`\n- `KhttpPost`\n- `KhttpPut`\n- `KhttpPatch`\n- `KhttpDelete`\n- `KhttpHead`\n\n### HTTP GET Example\n\n```C\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpGet(\n    \"http://httpbin.org/get\",\n    NULL,\n    NULL,\n    \u0026Response\n);\n\nif (NT_SUCCESS(Status) \u0026\u0026 Response) {\n    DbgPrint(\"Status: %lu, Body: %lu bytes\\n\", \n        Response-\u003eStatusCode, Response-\u003eBodyLength);\n    KhttpFreeResponse(Response);\n}\n```\n\n### HTTPS POST Example\n\n```C\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpPost(\n    \"https://httpbin.org/post\",\n    \"Content-Type: application/json\\r\\n\",\n    \"{\\\"secure\\\":true,\\\"kernel\\\":\\\"mode\\\",\\\"tls\\\":\\\"1.3\\\"}\",\n    NULL,\n    \u0026Response\n);\n\nif (NT_SUCCESS(Status) \u0026\u0026 Response) {\n    DbgPrint(\"Status: %lu\\n\", Response-\u003eStatusCode);\n    KhttpFreeResponse(Response);\n}\n```\n\n### REST API Operations\n\n```C\n// GET\nKhttpGet(\"https://jsonplaceholder.typicode.com/posts/1\", NULL, NULL, \u0026Response);\n\n// POST\nKhttpPost(\n    \"https://jsonplaceholder.typicode.com/posts\",\n    \"Content-Type: application/json\\r\\n\",\n    \"{\\\"title\\\":\\\"test\\\",\\\"body\\\":\\\"content\\\",\\\"userId\\\":1}\",\n    NULL, \u0026Response);\n\n// PUT\nKhttpPut(\n    \"https://jsonplaceholder.typicode.com/posts/1\",\n    \"Content-Type: application/json\\r\\n\",\n    \"{\\\"id\\\":1,\\\"title\\\":\\\"updated\\\",\\\"body\\\":\\\"modified\\\",\\\"userId\\\":1}\",\n    NULL, \u0026Response);\n\n// PATCH\nKhttpPatch(\n    \"https://jsonplaceholder.typicode.com/posts/1\",\n    \"Content-Type: application/json\\r\\n\",\n    \"{\\\"title\\\":\\\"patched\\\"}\",\n    NULL, \u0026Response);\n\n// DELETE\nKhttpDelete(\"https://jsonplaceholder.typicode.com/posts/1\", NULL, NULL, \u0026Response);\n\n// HEAD\nKhttpHead(\"https://ya.ru/\", NULL, NULL, \u0026Response);\n```\n\n---\n\n## 3. Multipart File Upload\n\n### Upload files using multipart/form-data encoding. Supports automatic chunked transfer for large files\n\n### Upload Single File\n\n```C\n// Allocate file data in NonPagedPool\nPVOID FileData = ExAllocatePoolWithTag(NonPagedPool, FileSize, 'FILE');\nRtlCopyMemory(FileData, SourceData, FileSize);\n\nKHTTP_FILE File = {\n    .FieldName = \"document\",\n    .FileName = \"test.bin\",\n    .ContentType = \"application/octet-stream\",\n    .Data = FileData,\n    .DataLength = FileSize\n};\n\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpPostMultipart(\n    \"https://httpbin.org/post\",\n    \"Authorization: Bearer token123\\r\\n\",\n    NULL,\n    0,\n    \u0026File,\n    1,\n    NULL,\n    \u0026Response\n);\n\nif (NT_SUCCESS(Status) \u0026\u0026 Response) {\n    DbgPrint(\"Upload success: %lu\\n\", Response-\u003eStatusCode);\n    KhttpFreeResponse(Response);\n}\n\nExFreePoolWithTag(FileData, 'FILE');\n```\n\n### Upload Multiple Files with Form Data\n\n```C\n// Form fields\nKHTTP_FORM_FIELD Fields[] = {\n    { .Name = \"title\", .Value = \"My Photo\" },\n    { .Name = \"description\", .Value = \"Uploaded from Windows kernel mode driver\" }\n};\n\n// Files\nKHTTP_FILE Files[] = {\n    {\n        .FieldName = \"file1\",\n        .FileName = \"document1.txt\",\n        .ContentType = \"text/plain\",\n        .Data = ImageData,\n        .DataLength = ImageSize\n    },\n    {\n        .FieldName = \"file2\",\n        .FileName = \"document2.bin\",\n        .ContentType = \"application/octet-stream\",\n        .Data = JsonData,\n        .DataLength = JsonSize\n    }\n};\n\nKHTTP_CONFIG Config = {\n    .UseHttps = TRUE,\n    .TimeoutMs = 30000,\n    .UserAgent = \"KernelHTTP/1.0\",\n    .MaxResponseSize = 5 * 1024 * 1024,\n    .ProgressCallback = ProgressCallback,\n    .CallbackContext = NULL\n};\n\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpPostMultipart(\n    \"https://httpbin.org/post\",\n    NULL,\n    Fields,\n    2,\n    Files,\n    2,\n    \u0026Config,\n    \u0026Response\n);\n```\n\n### Upload with Progress Callback\n\n```C\nVOID ProgressCallback(\n    ULONG BytesSent,\n    ULONG TotalBytes,\n    PVOID Context\n)\n{\n    UNREFERENCED_PARAMETER(Context);\n    if (TotalBytes \u003e 0) {\n        ULONG Percent = (BytesSent * 100) / TotalBytes;\n        DbgPrint(\"[PROGRESS] %lu%% (%lu/%lu bytes)\\n\", \n                 Percent, BytesSent, TotalBytes);\n    }\n}\n\nKHTTP_CONFIG Config = {\n    .UseHttps = TRUE,\n    .TimeoutMs = 120000,\n    .ProgressCallback = ProgressCallback,\n    .CallbackContext = NULL,\n    .UseChunkedTransfer = TRUE\n};\n```\n\n### Large File Upload with Chunked Transfer\n\n```C\n// For large files (5MB+)\nPVOID FileData = ExAllocatePoolWithTag(NonPagedPool, 5 * 1024 * 1024, 'FILE');\nif (!FileData) {\n    return STATUS_INSUFFICIENT_RESOURCES;\n}\n\n// Fill with sequential pattern\nfor (ULONG i = 0; i \u003c (5 * 1024 * 1024) / 4; i++) {\n    ((ULONG*)FileData)[i] = i;\n}\n\nKHTTP_FILE File = {\n    .FieldName = \"largefile\",\n    .FileName = \"large5mb.bin\",\n    .ContentType = \"application/octet-stream\",\n    .Data = FileData,\n    .DataLength = 5 * 1024 * 1024\n};\n\nKHTTP_CONFIG Config = {\n    .UseHttps = TRUE,\n    .TimeoutMs = 120000,        // 2 minutes\n    .MaxResponseSize = 5 * 1024 * 1024,\n    .UseChunkedTransfer = TRUE,\n    .ChunkSize = 64 * 1024,     // 64KB chunks\n    .ProgressCallback = NULL\n};\n\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpPostMultipartChunked(\n    \"http://192.168.56.1:8080/upload\",\n    NULL,\n    NULL, 0,\n    \u0026File, 1,\n    \u0026Config,\n    \u0026Response\n);\n\nif (NT_SUCCESS(Status) \u0026\u0026 Response) {\n    DbgPrint(\"Upload success: %lu bytes\\n\", File.DataLength);\n    KhttpFreeResponse(Response);\n}\n\nExFreePoolWithTag(FileData, 'FILE');\n```\n\n### Streaming File Upload from Disk\n\n```C\n// Stream file from disk without loading into memory\nUNICODE_STRING FilePath;\nRtlInitUnicodeString(\u0026FilePath, L\"\\\\??\\\\C:\\\\test_file.bin\");\n\nKHTTP_FILE File = {\n    .FieldName = \"file\",\n    .FileName = \"test_file.bin\",\n    .ContentType = \"application/octet-stream\",\n    .UseFileStream = TRUE,\n    .FilePath = \u0026FilePath,\n    .Data = NULL,\n    .DataLength = 0\n};\n\nKHTTP_CONFIG Config = {\n    .UseHttps = TRUE,\n    .TimeoutMs = 300000,        // 5 minutes\n    .UseChunkedTransfer = TRUE,\n    .ChunkSize = 256 * 1024,    // 256KB chunks\n    .ProgressCallback = ProgressCallback\n};\n\nPKHTTP_RESPONSE Response = NULL;\nNTSTATUS Status = KhttpPostMultipartChunked(\n    \"https://192.168.56.1:8443/upload\",\n    NULL,\n    NULL, 0,\n    \u0026File, 1,\n    \u0026Config,\n    \u0026Response\n);\n```\n\n### File Size Recommendations\n\n| File Size | Transfer Method  | Chunk Size | Timeout | Notes                        |\n| --------- | ---------------- | ---------- | ------- | ---------------------------- |\n| \u003c 2 MB    | Regular          | N/A        | 30s     | Fast, single buffer          |\n| 2-10 MB   | Chunked          | 64KB       | 2min    | Progress tracking available  |\n| 10-100 MB | Chunked          | 256KB      | 5min    | Use larger chunks            |\n| \u003e 100 MB  | Streaming (disk) | 256-512KB  | 10min+  | Avoid loading into memory    |\n\n---\n\n## 4. TLS/DTLS Transport (`ktls_lib.h`)\n\nLow-level encrypted socket abstraction.\n\n```C\nPKTLS_SESSION Session = NULL;\n\nNTSTATUS Status = KtlsConnect(\n    INETADDR(192,168,56,1),\n    4443,\n    KTLS_PROTO_TCP,      // or KTLS_PROTO_UDP for DTLS\n    \"192.168.56.1\",\n    \u0026Session\n);\n\nif (NT_SUCCESS(Status)) {\n    KtlsSetTimeout(Session, 9000);\n\n    ULONG Sent, Recv;\n    CHAR Buffer[4096];\n    \n    // Send HTTP request\n    const char* Request = \"GET / HTTP/1.1\\r\\nHost: 192.168.56.1\\r\\nConnection: close\\r\\n\\r\\n\";\n    KtlsSend(Session, (PVOID)Request, (ULONG)strlen(Request), \u0026Sent);\n    \n    // Receive response\n    KtlsRecv(Session, Buffer, sizeof(Buffer) - 1, \u0026Recv);\n    if (Recv \u003e 0) {\n        Buffer[Recv] = '\\0';\n        DbgPrint(\"Received: %s\\n\", Buffer);\n    }\n    \n    KtlsClose(Session);\n}\n```\n\n### DTLS (UDP) Example\n\n```C\nPKTLS_SESSION Session = NULL;\n\nNTSTATUS Status = KtlsConnect(\n    INETADDR(192,168,56,1),\n    4443,\n    KTLS_PROTO_UDP,      // DTLS over UDP\n    \"192.168.56.1\",\n    \u0026Session\n);\n\nif (NT_SUCCESS(Status)) {\n    KtlsSetTimeout(Session, 9000);\n\n    ULONG Sent, Recv;\n    CHAR Buffer[1024];\n    \n    // Send message\n    const char* Message = \"Hello DTLS\";\n    KtlsSend(Session, (PVOID)Message, (ULONG)strlen(Message), \u0026Sent);\n    \n    // Receive echo\n    KtlsRecv(Session, Buffer, sizeof(Buffer) - 1, \u0026Recv);\n    if (Recv \u003e 0) {\n        Buffer[Recv] = '\\0';\n        DbgPrint(\"Echo: %s\\n\", Buffer);\n    }\n    \n    KtlsClose(Session);\n}\n```\n\nRequirements:\n\n- Buffers for `KtlsRecv` must be from `NonPagedPool`.\n- Every successful `KtlsConnect` must be followed by `KtlsClose`.\n\n---\n\n## 5. DNS Helper (`kdns_lib.h`)\n\n```C\nULONG Ip = 0;\n\nNTSTATUS Status = KdnsResolve(\n    \"ya.ru\",\n    INETADDR(8,8,8,8),  // Google DNS\n    3000,               // 3 seconds timeout\n    \u0026Ip\n);\n\nif (NT_SUCCESS(Status)) {\n    DbgPrint(\"IP: %u.%u.%u.%u\\n\",\n        (Ip \u003e\u003e 0) \u0026 0xFF,\n        (Ip \u003e\u003e 8) \u0026 0xFF,\n        (Ip \u003e\u003e 16) \u0026 0xFF,\n        (Ip \u003e\u003e 24) \u0026 0xFF);\n}\n```\n\n---\n## 6. Stress Testing\n\n### Comprehensive stress test suite validates stability under extreme conditions\n\nThe library includes extensive stress tests covering:\n\n**Connection Stress**\n- 100x rapid TLS handshake cycles\n- Connection pool exhaustion tests\n- Timeout boundary tests (1ms to 60s)\n\n**HTTP/HTTPS Stress**\n- 1000 sequential GET requests\n- 100 rapid-fire POST requests\n- Mixed method rotation (GET/POST/PUT/DELETE)\n- Large payload handling (10MB+ responses)\n\n**File Upload Stress**\n- 50x rapid small file uploads (1KB each)\n- 10x large file uploads (50MB each)\n- Continuous streaming (100MB+)\n- 100 files in single multipart request\n\n**Memory \u0026 Resource Stress**\n- 1000x malloc/free cycles\n- Buffer overflow protection tests\n- Memory leak detection\n- Resource cleanup verification\n\n**Edge Cases**\n- Zero-byte uploads\n- Maximum URL length (8KB+)\n- Invalid data handling\n- Network interruption simulation\n\n### Running Stress Tests\n\nStress tests run automatically on driver load. Configuration options:\n\n```C\n#define STRESS_ITERATIONS 1000      // Test intensity\n#define STRESS_FILE_SIZE (50*1024*1024)  // 50MB\n#define STRESS_CONCURRENT 100       // Parallel requests\n```\n\nResults are logged to DbgView with pass/fail counters and performance metrics.\n\n---\n\n## 7. Test Server (Go TLS/DTLS Echo)\n\nLocated in `test server/`, this Go program provides a dual TLS/DTLS echo endpoint on `0.0.0.0:4443` for testing `KtlsConnect`, `KtlsSend`, and `KtlsRecv`.\n\nBuild and run:\n\n```bash\ncd \"test server\"\ngo mod init test_server\ngo get github.com/pion/dtls/v2\ngo run main.go\n```\n\nIt generates an in-memory self-signed certificate and echoes back any data received over both TCP (TLS) and UDP (DTLS).\n\n---\n\n## 8. Test Results\n\n### Comprehensive test suite validates all functionality with real-world endpoints\n\n| Test Category            | Tests | Status  | Endpoints                         |\n| ------------------------ | ----- | ------- | --------------------------------- |\n| DNS Resolution           | 1     | ✅ PASS | Google DNS (8.8.8.8)              |\n| TLS/DTLS                 | 2     | ✅ PASS | Local test server                 |\n| HTTP Methods             | 3     | ✅ PASS | httpbin.org, ya.ru                |\n| HTTPS Requests           | 4     | ✅ PASS | httpbin.org, jsonplaceholder      |\n| REST API (HTTP)          | 5     | ✅ PASS | jsonplaceholder.typicode.com      |\n| REST API (HTTPS)         | 4     | ✅ PASS | jsonplaceholder.typicode.com      |\n| File Upload (Small)      | 1     | ✅ PASS | httpbin.org (1KB)                 |\n| File Upload (With Form)  | 1     | ✅ PASS | example.com (2KB)                 |\n| File Upload (Multiple)   | 1     | ✅ PASS | httpbin.org (512B + 1KB)          |\n| File Upload (Large)      | 1     | ✅ PASS | Local server (5MB chunked)        |\n| File Upload (Streaming)  | 1     | ✅ PASS | Local server (disk streaming)     |\n| Connection Stress        | 3     | ✅ PASS | 100+ cycles, timeout tests        |\n| HTTP/HTTPS Stress        | 4     | ✅ PASS | 1000+ sequential, 100+ parallel   |\n| Upload Stress            | 4     | ✅ PASS | 50x small, 10x large, streaming   |\n| Memory Stress            | 4     | ✅ PASS | 1000+ cycles, leak detection      |\n| Edge Cases               | 4     | ✅ PASS | Zero-byte, max URL, interruption  |\n| **Total**                | **43**| ✅ **100%** |                               |\n\n### Test Features\n\n- **Protocol Tests**: DNS resolution, TLS handshake, DTLS handshake\n- **HTTP/HTTPS**: All methods (GET, POST, PUT, PATCH, DELETE, HEAD)\n- **REST API**: Full CRUD operations with JSON payloads\n- **File Uploads**: Single file, multiple files, form fields, chunked transfer, streaming\n- **Progress Tracking**: Callback support for monitoring upload progress\n- **Large Files**: 5MB chunked upload with sequential pattern verification\n- **Streaming**: Direct disk-to-network streaming without memory buffering\n- **Stress Tests**: Connection cycles, memory pressure, concurrent requests, resource exhaustion\n- **Stability**: BSOD prevention, graceful error handling, resource leak detection\n\n### Running Tests\n\nAll tests are implemented in `wkhttp_tests.c` and run automatically on driver load:\n\n```C\nNTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {\n    UNREFERENCED_PARAMETER(RegistryPath);\n    DriverObject-\u003eDriverUnload = DriverUnload;\n\n    // Initialize library\n    NTSTATUS Status = KhttpGlobalInit();\n    if (!NT_SUCCESS(Status)) {\n        return Status;\n    }\n\n    // Tests run here automatically\n    // See wkhttp_tests.c for details\n    \n    return STATUS_SUCCESS;\n}\n```\n\n---\n\n## 9. Configuration Options\n\n```C\ntypedef struct _KHTTP_CONFIG {\n    BOOLEAN UseHttps;                    // Use HTTPS instead of HTTP\n    ULONG TimeoutMs;                     // Request timeout in milliseconds\n    PCHAR UserAgent;                     // Custom User-Agent header\n    ULONG MaxResponseSize;               // Maximum response body size\n    ULONG DnsServerIp;                   // Custom DNS server (0 = use 8.8.8.8)\n    BOOLEAN UseChunkedTransfer;          // Enable chunked transfer encoding\n    ULONG ChunkSize;                     // Chunk size for uploads (default 64KB)\n    PKHTTP_PROGRESS_CALLBACK ProgressCallback;  // Upload progress callback\n    PVOID CallbackContext;               // User context for callback\n} KHTTP_CONFIG, *PKHTTP_CONFIG;\n```\n\n### Example Configuration\n\n```C\nKHTTP_CONFIG Config = {\n    .UseHttps = TRUE,\n    .TimeoutMs = 60000,              // 60 seconds\n    .UserAgent = \"MyDriver/1.0\",\n    .MaxResponseSize = 10 * 1024 * 1024,  // 10MB\n    .DnsServerIp = INETADDR(8,8,8,8),\n    .UseChunkedTransfer = TRUE,\n    .ChunkSize = 128 * 1024,         // 128KB chunks\n    .ProgressCallback = MyProgressCallback,\n    .CallbackContext = MyContext\n};\n```\n\n---\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4l3x777%2Fwkhttp_lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F4l3x777%2Fwkhttp_lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4l3x777%2Fwkhttp_lib/lists"}