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