X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fhttp.c;h=00589686a2ba2ef009dc6d7b9aca11e77653c2c8;hb=eca47918b9fe7fa90a5983c09cef9c492a449ec4;hp=2a41b5bb612fc5eaf0f25eebdcd4cd18ceaa6aec;hpb=dde5b6f0ddf3293cea59da9ef623ff0f7c94b5c9;p=rocksndiamonds.git diff --git a/src/libgame/http.c b/src/libgame/http.c index 2a41b5bb..00589686 100644 --- a/src/libgame/http.c +++ b/src/libgame/http.c @@ -33,6 +33,28 @@ char *GetHttpError(void) return http_error; } +void ConvertHttpRequestBodyToServerEncoding(struct HttpRequest *request) +{ + char *body_utf8 = getUTF8FromLatin1(request->body); + + strncpy(request->body, body_utf8, MAX_HTTP_BODY_SIZE); + request->body[MAX_HTTP_BODY_SIZE] = '\0'; + + checked_free(body_utf8); +} + +void ConvertHttpResponseBodyToClientEncoding(struct HttpResponse *response) +{ + char *body_latin1 = getLatin1FromUTF8(response->body); + + strncpy(response->body, body_latin1, MAX_HTTP_BODY_SIZE); + response->body[MAX_HTTP_BODY_SIZE] = '\0'; + + response->body_size = strlen(response->body); + + checked_free(body_latin1); +} + static void SetHttpResponseToDefaults(struct HttpResponse *response) { response->head[0] = '\0'; @@ -43,6 +65,22 @@ static void SetHttpResponseToDefaults(struct HttpResponse *response) response->status_text[0] = '\0'; } +struct HttpResponse *GetHttpResponseFromBuffer(void *buffer, int size) +{ + if (size > MAX_HTTP_BODY_SIZE) + return NULL; + + struct HttpResponse *response = checked_calloc(sizeof(struct HttpResponse)); + + SetHttpResponseToDefaults(response); + + strncpy(response->body, buffer, MAX_HTTP_BODY_SIZE); + response->body[MAX_HTTP_BODY_SIZE] = '\0'; + response->body_size = MIN(size, MAX_HTTP_BODY_SIZE); + + return response; +} + static boolean SetHTTPResponseCode(struct HttpResponse *response, char *buffer) { char *prefix = "HTTP/1.1 "; @@ -128,11 +166,14 @@ static boolean SetHTTPResponseBody(struct HttpResponse *response, char *buffer, return TRUE; } -boolean DoHttpRequest(struct HttpRequest *request, - struct HttpResponse *response) +static boolean DoHttpRequestExt(struct HttpRequest *request, + struct HttpResponse *response, + char *send_buffer, + char *recv_buffer, + int max_http_buffer_size, + SDLNet_SocketSet socket_set, + TCPsocket socket) { - SDLNet_SocketSet socket_set; - TCPsocket socket; IPaddress ip; int server_host; @@ -195,10 +236,6 @@ boolean DoHttpRequest(struct HttpRequest *request, request->hostname, (int)strlen(request->body)); - int max_http_buffer_size = MAX_HTTP_HEAD_SIZE + MAX_HTTP_BODY_SIZE; - char send_buffer[max_http_buffer_size + 1]; - char recv_buffer[max_http_buffer_size + 1]; - snprintf(send_buffer, max_http_buffer_size, "%s\r\n%s", request->head, request->body); @@ -249,12 +286,41 @@ boolean DoHttpRequest(struct HttpRequest *request, return FALSE; } - SDLNet_TCP_DelSocket(socket_set, socket); - SDLNet_TCP_Close(socket); - Debug("network:http", "server response: %d %s", response->status_code, response->status_text); return TRUE; } + +boolean DoHttpRequest(struct HttpRequest *request, + struct HttpResponse *response) +{ + int max_http_buffer_size = MAX_HTTP_HEAD_SIZE + MAX_HTTP_BODY_SIZE; + char *send_buffer = checked_malloc(max_http_buffer_size + 1); + char *recv_buffer = checked_malloc(max_http_buffer_size + 1); + SDLNet_SocketSet socket_set = NULL; + TCPsocket socket = NULL; + + boolean success = DoHttpRequestExt(request, response, + send_buffer, recv_buffer, + max_http_buffer_size, + socket_set, socket); + if (socket_set != NULL) + { + if (socket != NULL) + { + SDLNet_TCP_DelSocket(socket_set, socket); + SDLNet_TCP_Close(socket); + } + + SDLNet_FreeSocketSet(socket_set); + } + + checked_free(send_buffer); + checked_free(recv_buffer); + + runtime.use_api_server = success; + + return success; +}