gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-twister] 01/02: Importing inflating function from GN


From: gnunet
Subject: [GNUnet-SVN] [taler-twister] 01/02: Importing inflating function from GNUnet..
Date: Wed, 15 May 2019 20:42:40 +0200

This is an automated email from the git hooks/post-receive script.

marcello pushed a commit to branch master
in repository twister.

commit 2363dcc3d93b758b807ef9b2f4cd8cb87899f786
Author: Marcello Stanisci <address@hidden>
AuthorDate: Wed May 15 19:00:46 2019 +0200

    Importing inflating function from GNUnet..
    
    ..and not recompressing data before proxying.
---
 src/twister/taler-twister-service.c | 242 +++++++++++++++++++-----------------
 1 file changed, 127 insertions(+), 115 deletions(-)

diff --git a/src/twister/taler-twister-service.c 
b/src/twister/taler-twister-service.c
index ee15c43..5b0b748 100644
--- a/src/twister/taler-twister-service.c
+++ b/src/twister/taler-twister-service.c
@@ -233,17 +233,6 @@ struct HttpRequest
    * Did we pause CURL processing?
    */
   int curl_paused;
-
-  /**
-   * if GNUNET_YES, then request and response will carry
-   * a compressed body.
-   */
-  int deflate;
-
-  /**
-   * Zlib internal state.
-   */
-  z_stream zstate;
 };
 
 
@@ -437,15 +426,6 @@ curl_check_hdr (void *buffer,
                    hdr_type,
                    hdr_val);
 
-  if ((0 == strcasecmp (hdr_type,
-                        MHD_HTTP_HEADER_CONTENT_ENCODING))
-      && (NULL != strstr (hdr_val,
-                          "deflate")))
-  {
-    TALER_LOG_INFO ("Compressed response\n");
-    hr->deflate = GNUNET_YES;
-  }
-
   /* Skip "Host:" header as it will be wrong, given
      that we are man-in-the-middling the connection */
   if (0 == strcasecmp (hdr_type,
@@ -890,8 +870,7 @@ static int
 con_val_iter (void *cls,
               enum MHD_ValueKind kind,
               const char *key,
-              const char *value,
-              size_t value_size)
+              const char *value)
 {
   struct HttpRequest *hr = cls;
   char *hdr;
@@ -902,10 +881,7 @@ con_val_iter (void *cls,
   if ((0 == strcmp (MHD_HTTP_HEADER_ACCEPT_ENCODING,
                     key)))
   {
-    TALER_LOG_INFO ("Compressed request\n");
-    curl_easy_setopt (hr->curl,
-                      CURLOPT_ENCODING,
-                      value); 
+    TALER_LOG_INFO ("Do not re-compressed request\n");
     return MHD_YES;
   }
 
@@ -964,6 +940,7 @@ walk_response_object (const char *path,
   char *last_token;
   char *path_dup;
 
+  GNUNET_assert (NULL != json);
   GNUNET_asprintf (&path_dup,
                    ".%s", /* Make sure path starts with dot. */
                    path);
@@ -1116,7 +1093,7 @@ modify_object (struct MHD_Connection *con,
  * Flip a random character to the string pointed to by @a path.
  *
  * @param con FIXME deprecated.
- * @param json the object whose filed will be flipped.
+ * @param json the object whose field will be flipped.
  * @param flip_path the path to the string-field to flip.
  */
 static void
@@ -1250,52 +1227,98 @@ delete_object (struct MHD_Connection *con,
   return;
 }
 
-
 /**
- * Try to compress a response body.
- * Updates @a buf and @a buf_size.
+ * Decompress data.
  *
- * @param[in,out] buf pointer to body to compress
- * @param[in,out] buf_size pointer to initial size of @a buf
- * @return #MHD_YES if @a buf was compressed
+ * @param request contains input data to inflate
+ * @return result code indicating the status of the operation
  */
 static int
-body_compress (void **buf,
-               size_t *buf_size)
+inflate_data (struct HttpRequest *request)
 {
-  Bytef *cbuf;
-  uLongf cbuf_size;
+  z_stream z;
+  char *tmp;
+  size_t tmp_size;
   int ret;
 
-  cbuf_size = compressBound (*buf_size);
-  cbuf = malloc (cbuf_size);
-  if (NULL == cbuf)
+  memset (&z, 0, sizeof (z));
+  z.next_in = (Bytef *) request->io_buf;
+  z.avail_in = request->io_len;
+  tmp_size = GNUNET_MIN (REQUEST_BUFFER_MAX, request->io_len * 4);
+  tmp = GNUNET_malloc (tmp_size);
+  z.next_out = (Bytef *) tmp;
+  z.avail_out = tmp_size;
+  ret = inflateInit (&z);
+  switch (ret)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Could not allocate the compression buffer\n");
-    return MHD_NO;
+  case Z_MEM_ERROR:
+    GNUNET_break (0);
+    return GNUNET_JSON_PR_OUT_OF_MEMORY;
+  case Z_STREAM_ERROR:
+    GNUNET_break_op (0);
+    return GNUNET_JSON_PR_JSON_INVALID;
+  case Z_OK:
+    break;
   }
-
-  ret = compress (cbuf,
-                 &cbuf_size,
-                 (const Bytef *) *buf,
-                 *buf_size);
-
-  if (Z_OK != ret)
+  while (1)
   {
-    /* compression failed */
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Compression failed\n");
-    free (cbuf);
-    return MHD_NO;
-  }
-  free (*buf);
-  *buf = (void *) cbuf;
-  *buf_size = (size_t) cbuf_size;
-  return MHD_YES;
+    ret = inflate (&z, 0);
+    switch (ret)
+    {
+    case Z_MEM_ERROR:
+      GNUNET_break (0);
+      GNUNET_break (Z_OK == inflateEnd (&z));
+      GNUNET_free (tmp);
+      return GNUNET_JSON_PR_OUT_OF_MEMORY;
+    case Z_DATA_ERROR:
+      GNUNET_break (0);
+      GNUNET_break (Z_OK == inflateEnd (&z));
+      GNUNET_free (tmp);
+      return GNUNET_JSON_PR_JSON_INVALID;
+    case Z_NEED_DICT:
+      GNUNET_break (0);
+      GNUNET_break (Z_OK == inflateEnd (&z));
+      GNUNET_free (tmp);
+      return GNUNET_JSON_PR_JSON_INVALID;
+    case Z_OK:
+      if ((0 < z.avail_out) && (0 == z.avail_in))
+      {
+        /* truncated input stream */
+        GNUNET_break (0);
+        GNUNET_break (Z_OK == inflateEnd (&z));
+        GNUNET_free (tmp);
+        return GNUNET_JSON_PR_JSON_INVALID;
+      }
+      if (0 < z.avail_out)
+        continue; /* just call it again */
+      /* output buffer full, can we grow it? */
+      if (tmp_size == REQUEST_BUFFER_MAX)
+      {
+        /* already at max */
+        GNUNET_break (0);
+        GNUNET_break (Z_OK == inflateEnd (&z));
+        GNUNET_free (tmp);
+        return GNUNET_JSON_PR_OUT_OF_MEMORY;
+      }
+      if (tmp_size * 2 < tmp_size)
+        tmp_size = REQUEST_BUFFER_MAX;
+      else
+        tmp_size = GNUNET_MIN (REQUEST_BUFFER_MAX, tmp_size * 2);
+      tmp = GNUNET_realloc (tmp, tmp_size);
+      z.next_out = (Bytef *) &tmp[z.total_out];
+      continue;
+    case Z_STREAM_END:
+      /* decompression successful, make 'tmp' the new 'data' */
+      GNUNET_free (request->io_buf);
+      request->io_buf = tmp;
+      request->io_size = tmp_size;
+      request->io_len = z.total_out;
+      GNUNET_break (Z_OK == inflateEnd (&z));
+      return GNUNET_JSON_PR_SUCCESS; /* at least for now */
+    }
+  } /* while (1) */
 }
 
-
 /**
  * Main MHD callback for handling requests.
  *
@@ -1381,12 +1404,7 @@ create_response (void *cls,
 
     hr->io_len += *upload_data_size;
     *upload_data_size = 0;
-    if (GNUNET_YES == hr->curl_paused)
-    {
-      hr->curl_paused = GNUNET_NO;
-      curl_easy_pause (hr->curl,
-                       CURLPAUSE_CONT);
-    }
+
     return MHD_YES;
   }
 
@@ -1396,6 +1414,32 @@ create_response (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Finished processing UPLOAD\n");
     hr->state = REQUEST_STATE_UPLOAD_DONE;
+    if (0 != hr->io_len)
+    {
+      #if 1
+      const char *ce;
+      ce = MHD_lookup_connection_value
+        (con,
+         MHD_HEADER_KIND,
+         MHD_HTTP_HEADER_CONTENT_ENCODING);
+      if ((NULL != ce) && (0 == strcmp ("deflate", ce)))
+        GNUNET_assert (Z_OK == inflate_data (hr));
+      #endif
+
+      json_error_t error;
+      hr->json = json_loadb (hr->io_buf,
+                             hr->io_len,
+                             JSON_DECODE_ANY,
+                             &error);
+      if (NULL == hr->json)
+      {
+        TALER_LOG_ERROR ("Could not parse JSON from client: %s (%s)\n",
+                         error.text,
+                         error.source);
+        /* Quick and dirty.  */
+        return MHD_NO;
+      }
+    }
   }
 
   /* generate curl request to the proxied service. */
@@ -1419,27 +1463,9 @@ create_response (void *cls,
                   "Will try to flip: %s\n",
                   flip_path_ul);
 
-      GNUNET_assert (0 == strcmp (MHD_HTTP_METHOD_POST,
-                                  meth));
-      GNUNET_break
-        (GNUNET_JSON_PR_SUCCESS != GNUNET_JSON_post_parser
-          (REQUEST_BUFFER_MAX,
-           con,
-           con_cls,
-           hr->io_buf,
-           &hr->io_len,
-           &hr->json));
-
       flip_object (con,
                    hr->json,
                    flip_path_ul);
-      /* Existing io_len is enough to accomodate this encoding. */
-      json_dumpb (hr->json,
-                  hr->io_buf,
-                  hr->io_len,
-                  JSON_COMPACT);
-
-      json_decref (hr->json);
     }
 
     if ('\0' != modify_path_ul[0])
@@ -1448,29 +1474,18 @@ create_response (void *cls,
                   "Will try to modify: %s\n",
                   flip_path_ul);
 
-      GNUNET_assert (0 == strcmp (MHD_HTTP_METHOD_POST,
-                                  meth));
-      GNUNET_break
-        (GNUNET_JSON_PR_SUCCESS != GNUNET_JSON_post_parser
-          (REQUEST_BUFFER_MAX,
-           con,
-           con_cls,
-           hr->io_buf,
-           &hr->io_len,
-           &hr->json));
-
       modify_object (con,
                      hr->json,
                      modify_path_ul);
-
-      /* Existing io_len is enough to accomodate this encoding. */
-      json_dumpb (hr->json,
-                  hr->io_buf,
-                  hr->io_len,
-                  JSON_COMPACT);
-      json_decref (hr->json);
     }
 
+    /* Existing io_len is enough to accomodate this encoding. */
+    json_dumpb (hr->json,
+                hr->io_buf,
+                hr->io_len,
+                JSON_COMPACT);
+    json_decref (hr->json);
+
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Generating curl request\n");
     hr->curl = curl_easy_init ();
@@ -1481,10 +1496,12 @@ create_response (void *cls,
                                  MHD_HTTP_INTERNAL_SERVER_ERROR,
                                  curl_failure_response);
     }
-    if (0 != hr->io_len)
-      curl_easy_setopt (hr->curl,
-                       CURLOPT_POSTFIELDSIZE,
-                       hr->io_len);
+
+    /* No need to check whether we're POSTing or PUTting.
+     * If not needed, this value will just be ignored.*/
+    curl_easy_setopt (hr->curl,
+                      CURLOPT_POSTFIELDSIZE,
+                     hr->io_len);
     curl_easy_setopt (hr->curl,
                       CURLOPT_HEADERFUNCTION,
                       &curl_check_hdr);
@@ -1527,6 +1544,9 @@ create_response (void *cls,
     if (0 == strcasecmp (meth,
                         MHD_HTTP_METHOD_PUT))
     {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Crafting a CURL PUT request\n");
+
       curl_easy_setopt (hr->curl,
                        CURLOPT_UPLOAD,
                        1L);
@@ -1759,14 +1779,6 @@ create_response (void *cls,
     malform = GNUNET_NO;
   }
 
-  /**
-   * COMPRESSION STARTS HERE.
-   */
-  if (GNUNET_YES == hr->deflate)
-    GNUNET_assert
-      (MHD_YES == body_compress ((void **) &hr->io_buf,
-                                 &hr->io_len));
-
   hr->response = MHD_create_response_from_buffer
     (hr->io_len,
      hr->io_buf,

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]