Tkap1

Untitled

Sep 2nd, 2025
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. func b8 is_http_request_ok(int status_code)
  2. {
  3.     b8 result = status_code >= 200 && status_code <= 299;
  4.     return result;
  5. }
  6.  
  7. func void read_http_data(HINTERNET request, s_memory* memory, s_circular_arena* arena)
  8. {
  9.     memory->ptr = circular_arena_alloc_zero(arena, 1 * c_mb);
  10.     while(true) {
  11.         DWORD size = 0;
  12.         if(!WinHttpQueryDataAvailable(request, &size)) {
  13.             assert(false);
  14.             break;
  15.         }
  16.         if(size == 0) break;
  17.         assert(size + memory->size <= 1 * c_mb);
  18.  
  19.         DWORD downloaded = 0;
  20.         if(!WinHttpReadData(request, memory->ptr + memory->size, size, &downloaded)) {
  21.             assert(false);
  22.         }
  23.         memory->size += size;
  24.     }
  25. }
  26.  
  27. func s_http_request do_post_request(HINTERNET session, s_len_str server, s_len_str resource, s_len_str body, s_circular_arena* arena)
  28. {
  29.     INTERNET_PORT port = INTERNET_DEFAULT_HTTPS_PORT;
  30.  
  31.     HINTERNET connect = WinHttpConnect(session, ascii_to_wide(server, arena), port, 0);
  32.     assert(connect);
  33.     HINTERNET request = WinHttpOpenRequest(connect, L"POST", ascii_to_wide(resource, arena), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
  34.     assert(request);
  35.  
  36.     DWORD flags = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |
  37.         SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
  38.     WinHttpSetOption(request, WINHTTP_OPTION_SECURITY_FLAGS, &flags, sizeof(flags));
  39.  
  40.     LPCWSTR headers = L"Content-Type: application/json";
  41.     BOOL success = WinHttpSendRequest(request, headers, (DWORD)-1L, body.str, body.count, body.count, 0);
  42.     assert(success != 0);
  43.     success = WinHttpReceiveResponse(request, NULL);
  44.     assert(success != 0);
  45.  
  46.     s_http_request result = zero;
  47.     result.status_code = http_get_status_code(request);
  48.     read_http_data(request, &result.memory, arena);
  49.  
  50.     if(request) {
  51.         WinHttpCloseHandle(request);
  52.     }
  53.     if(connect) {
  54.         WinHttpCloseHandle(connect);
  55.     }
  56.  
  57.     return result;
  58. }
  59.  
  60. func s_http_request do_get_request(HINTERNET session, s_len_str server, s_len_str resource, s_len_str headers, s_circular_arena* arena)
  61. {
  62.     INTERNET_PORT port = INTERNET_DEFAULT_HTTPS_PORT;
  63.     HINTERNET connect = WinHttpConnect(session, ascii_to_wide(server, arena), port, 0);
  64.     assert(connect);
  65.  
  66.     HINTERNET request = WinHttpOpenRequest(connect, L"GET", ascii_to_wide(resource, arena), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
  67.     assert(request);
  68.  
  69.     {
  70.         wchar_t* headers_wide = ascii_to_wide(headers, arena);
  71.         if(WinHttpAddRequestHeaders(request, headers_wide, (DWORD)-1L, WINHTTP_ADDREQ_FLAG_ADD) != TRUE) {
  72.             assert(false);
  73.         }
  74.     }
  75.  
  76.     BOOL success = FALSE;
  77.     success = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, NULL);
  78.     assert(success == TRUE);
  79.  
  80.     success = WinHttpReceiveResponse(request, NULL);
  81.     assert(success = TRUE);
  82.  
  83.     s_http_request result = zero;
  84.     result.status_code = http_get_status_code(request);
  85.     read_http_data(request, &result.memory, arena);
  86.  
  87.     if(request) {
  88.         WinHttpCloseHandle(request);
  89.     }
  90.     if(connect) {
  91.         WinHttpCloseHandle(connect);
  92.     }
  93.  
  94.     return result;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment