Home | History | Annotate | Download | only in microhttpd
      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2008 Christian Grothoff
      4 
      5      libmicrohttpd is free software; you can redistribute it and/or modify
      6      it under the terms of the GNU General Public License as published
      7      by the Free Software Foundation; either version 2, or (at your
      8      option) any later version.
      9 
     10      libmicrohttpd is distributed in the hope that it will be useful, but
     11      WITHOUT ANY WARRANTY; without even the implied warranty of
     12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13      General Public License for more details.
     14 
     15      You should have received a copy of the GNU General Public License
     16      along with libmicrohttpd; see the file COPYING.  If not, write to the
     17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     18      Boston, MA 02111-1307, USA.
     19 */
     20 
     21 /**
     22  * @file test_postprocessor_large.c
     23  * @brief  Testcase with very large input for postprocessor
     24  * @author Christian Grothoff
     25  */
     26 
     27 #include "platform.h"
     28 #include "microhttpd.h"
     29 #include "internal.h"
     30 
     31 #ifndef WINDOWS
     32 #include <unistd.h>
     33 #endif
     34 
     35 static int
     36 value_checker (void *cls,
     37                enum MHD_ValueKind kind,
     38                const char *key,
     39                const char *filename,
     40                const char *content_type,
     41                const char *transfer_encoding,
     42                const char *data, uint64_t off, size_t size)
     43 {
     44   unsigned int *pos = cls;
     45 #if 0
     46   fprintf (stderr,
     47            "VC: %llu %u `%s' `%s' `%s' `%s' `%.*s'\n",
     48            off, size,
     49            key, filename, content_type, transfer_encoding, size, data);
     50 #endif
     51   if (size == 0)
     52     return MHD_YES;
     53   *pos += size;
     54   return MHD_YES;
     55 
     56 }
     57 
     58 
     59 static int
     60 test_simple_large ()
     61 {
     62   struct MHD_Connection connection;
     63   struct MHD_HTTP_Header header;
     64   struct MHD_PostProcessor *pp;
     65   int i;
     66   int delta;
     67   size_t size;
     68   char data[102400];
     69   unsigned int pos;
     70 
     71   pos = 0;
     72   memset (data, 'A', sizeof (data));
     73   memcpy (data, "key=", 4);
     74   data[sizeof (data) - 1] = '\0';
     75   memset (&connection, 0, sizeof (struct MHD_Connection));
     76   memset (&header, 0, sizeof (struct MHD_HTTP_Header));
     77   connection.headers_received = &header;
     78   header.header = MHD_HTTP_HEADER_CONTENT_TYPE;
     79   header.value = MHD_HTTP_POST_ENCODING_FORM_URLENCODED;
     80   header.kind = MHD_HEADER_KIND;
     81   pp = MHD_create_post_processor (&connection, 1024, &value_checker, &pos);
     82   i = 0;
     83   size = strlen (data);
     84   while (i < size)
     85     {
     86       delta = 1 + MHD_random_ () % (size - i);
     87       MHD_post_process (pp, &data[i], delta);
     88       i += delta;
     89     }
     90   MHD_destroy_post_processor (pp);
     91   if (pos != sizeof (data) - 5) /* minus 0-termination and 'key=' */
     92     return 1;
     93   return 0;
     94 }
     95 
     96 int
     97 main (int argc, char *const *argv)
     98 {
     99   unsigned int errorCount = 0;
    100 
    101   errorCount += test_simple_large ();
    102   if (errorCount != 0)
    103     fprintf (stderr, "Error (code: %u)\n", errorCount);
    104   return errorCount != 0;       /* 0 == pass */
    105 }
    106