added function to create HTTP response object from buffer
[rocksndiamonds.git] / src / libgame / http.c
index 2a41b5bb612fc5eaf0f25eebdcd4cd18ceaa6aec..a179620e141b64c913df7f4151f1280bed3ae279 100644 (file)
@@ -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,8 +166,11 @@ 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;
@@ -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);
 
@@ -258,3 +295,22 @@ boolean DoHttpRequest(struct HttpRequest *request,
 
   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);
+
+  boolean success = DoHttpRequestExt(request, response,
+                                    send_buffer, recv_buffer,
+                                    max_http_buffer_size);
+
+  checked_free(send_buffer);
+  checked_free(recv_buffer);
+
+  runtime.use_api_server = success;
+
+  return success;
+}