Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func b8 is_http_request_ok(int status_code)
- {
- b8 result = status_code >= 200 && status_code <= 299;
- return result;
- }
- func void read_http_data(HINTERNET request, s_memory* memory, s_circular_arena* arena)
- {
- memory->ptr = circular_arena_alloc_zero(arena, 1 * c_mb);
- while(true) {
- DWORD size = 0;
- if(!WinHttpQueryDataAvailable(request, &size)) {
- assert(false);
- break;
- }
- if(size == 0) break;
- assert(size + memory->size <= 1 * c_mb);
- DWORD downloaded = 0;
- if(!WinHttpReadData(request, memory->ptr + memory->size, size, &downloaded)) {
- assert(false);
- }
- memory->size += size;
- }
- }
- 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)
- {
- INTERNET_PORT port = INTERNET_DEFAULT_HTTPS_PORT;
- HINTERNET connect = WinHttpConnect(session, ascii_to_wide(server, arena), port, 0);
- assert(connect);
- HINTERNET request = WinHttpOpenRequest(connect, L"POST", ascii_to_wide(resource, arena), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
- assert(request);
- DWORD flags = SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |
- SECURITY_FLAG_IGNORE_CERT_CN_INVALID | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
- WinHttpSetOption(request, WINHTTP_OPTION_SECURITY_FLAGS, &flags, sizeof(flags));
- LPCWSTR headers = L"Content-Type: application/json";
- BOOL success = WinHttpSendRequest(request, headers, (DWORD)-1L, body.str, body.count, body.count, 0);
- assert(success != 0);
- success = WinHttpReceiveResponse(request, NULL);
- assert(success != 0);
- s_http_request result = zero;
- result.status_code = http_get_status_code(request);
- read_http_data(request, &result.memory, arena);
- if(request) {
- WinHttpCloseHandle(request);
- }
- if(connect) {
- WinHttpCloseHandle(connect);
- }
- return result;
- }
- 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)
- {
- INTERNET_PORT port = INTERNET_DEFAULT_HTTPS_PORT;
- HINTERNET connect = WinHttpConnect(session, ascii_to_wide(server, arena), port, 0);
- assert(connect);
- HINTERNET request = WinHttpOpenRequest(connect, L"GET", ascii_to_wide(resource, arena), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE);
- assert(request);
- {
- wchar_t* headers_wide = ascii_to_wide(headers, arena);
- if(WinHttpAddRequestHeaders(request, headers_wide, (DWORD)-1L, WINHTTP_ADDREQ_FLAG_ADD) != TRUE) {
- assert(false);
- }
- }
- BOOL success = FALSE;
- success = WinHttpSendRequest(request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, NULL);
- assert(success == TRUE);
- success = WinHttpReceiveResponse(request, NULL);
- assert(success = TRUE);
- s_http_request result = zero;
- result.status_code = http_get_status_code(request);
- read_http_data(request, &result.memory, arena);
- if(request) {
- WinHttpCloseHandle(request);
- }
- if(connect) {
- WinHttpCloseHandle(connect);
- }
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment