#include "http.h" #include #include #include #include #include #include #include static void AppendHeader(char* buf, const char* key, const char* value) { strcat(buf, key); strcat(buf, ": "); strcat(buf, value); strcat(buf, "\r\n"); } char* ProcessChunkedTransfer(char* chunked, size_t chunked_len, size_t *out_len) { char* result = malloc(chunked_len); size_t written = 0; char* curpos = chunked; while(1) { char* crlf = strstr(curpos, "\r\n"); if(!crlf) break; int chunklen = (int)strtol(curpos, NULL, 16); if(chunklen == 0) break; char* data = crlf + 2; memcpy(result + written, data, chunklen); written += chunklen; curpos = data + chunklen + 2; } *out_len = written; return result; } int SendShortHTTPReq(const char* hostname,const char* reqtype, const char* endpoint, const char* extra_headers, const char* user_agent, const char* content_type, void* payload, unsigned long payload_size, char** response, long* responselen) { SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { MessageBoxA(NULL, "socket failed", "Aa", 0); return 1; } struct sockaddr_in server; RtlZeroMemory(&server, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(443); // HTTPS brotatochippiee server.sin_addr = **(struct in_addr**)gethostbyname(hostname)->h_addr_list; if (connect(sock, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { MessageBoxA(NULL, "connect failed", "Aa", 0); closesocket(sock); return 1; } // this debugging thing served us well yall MessageBoxA(NULL, "onto ze ctx", "Aa", 0); SSL_CTX* ctx = SSL_CTX_new(TLS_client_method()); if (!ctx) { MessageBoxA(NULL, "SSL_CTX_new failed", "Aa", 0); unsigned long err = ERR_get_error(); if (err == 0) { MessageBoxA(NULL, "unknown OpenSSL error", "title", MB_ICONERROR); return 1; } char buf[256]; ERR_error_string_n(err, buf, sizeof(buf)); MessageBoxA(NULL, buf, "title", MB_ICONERROR); return 1; } SSL* ssl = SSL_new(ctx); if (!ssl) { MessageBoxA(NULL, "SSL_new failed qwq", "Aa", 0); return 1; } // Attach socket to SSL SSL_set_fd(ssl, (int)sock); // SNI (importante shi) SSL_set_tlsext_host_name(ssl, hostname); if (SSL_connect(ssl) <= 0) { MessageBoxA(NULL, "SSL_connect failed", "Aa", 0); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(sock); return 1; } SSL_write(ssl, reqtype, (int)strlen(reqtype)); // Sends request type SSL_write(ssl, " ", 1); // stupid fuckass space SSL_write(ssl, endpoint, (int)strlen(endpoint)); // endpoint SSL_write(ssl, " HTTP/1.1\r\n", 11); // the protocol thing.. ykw i will be more formal SSL_write(ssl, "Host: ", 6); // Host beginning SSL_write(ssl, hostname, (int)(strlen(hostname))); // Host data SSL_write(ssl, "\r\n", 2); // Host end SSL_write(ssl, "User-Agent: ", 12); // User Agent beginning SSL_write(ssl, user_agent, (int)(strlen(user_agent))); // User Agent data SSL_write(ssl, "\r\n", 2); // User Agent end if (payload != 0) { SSL_write(ssl, "Content-Type: ", 14); // Content Type beginning SSL_write(ssl, content_type, (int)strlen(content_type)); SSL_write(ssl, "\r\n", 2); // Content Type end SSL_write(ssl, "Content-Length: ", 16); // Content Length beginning char lenstr[64]; RtlZeroMemory(lenstr,64); wsprintfA(lenstr,"%d",payload_size); SSL_write(ssl, lenstr, (int)(strlen(lenstr))); // Content Length data SSL_write(ssl, "\r\n", 2); // Content Length end } SSL_write(ssl, extra_headers, (int)(strlen(extra_headers))); // Extra Header SSL_write(ssl, "Connection: close\r\n", 19); //Short-term connection SSL_write(ssl, "\r\n", 2); //Ends the header if(payload) SSL_write(ssl, payload, (int)payload_size); //Payload char* buffer = malloc(4096); size_t sizeofbuf = 4096; size_t total_bytes = 0; int bytes_read; while ((bytes_read = SSL_read(ssl, buffer + total_bytes, (int)(sizeofbuf - total_bytes - 1))) > 0) { total_bytes += bytes_read; if (total_bytes + 1 >= sizeofbuf) { sizeofbuf += 4096; char* newbuf = realloc(buffer, sizeofbuf); if (!newbuf) { //what the fuck had possibly happened on bros pc :sob: free(buffer); SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(sock); return -1; } buffer = newbuf; } } buffer[total_bytes] = '\0'; char *endofhdr = strstr(buffer, "\r\n\r\n"); if (!endofhdr) { free(buffer); SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(sock); return -1; } char *body_start = endofhdr + 4; size_t body_len = total_bytes - (body_start - buffer); if (strstr(buffer, "Transfer-Encoding: chunked")) { size_t outlen; *response = ProcessChunkedTransfer(body_start,body_len,&outlen); *responselen = (long)outlen; free(buffer); } else { char *copy = malloc(body_len + 1); memcpy(copy, body_start, body_len); copy[body_len] = '\0'; *response = copy; *responselen = (long)body_len; free(buffer); } SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); closesocket(sock); return 0; } int InitHTTP() { SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); //me when macros } int CleanupHTTP() { WSACleanup(); }