Home | History | Annotate | Download | only in examples
      1 /*
      2      This file is part of libmicrohttpd
      3      Copyright (C) 2007, 2008 Christian Grothoff (and other contributing authors)
      4 
      5      This library is free software; you can redistribute it and/or
      6      modify it under the terms of the GNU Lesser General Public
      7      License as published by the Free Software Foundation; either
      8      version 2.1 of the License, or (at your option) any later version.
      9 
     10      This library is distributed in the hope that it will be useful,
     11      but WITHOUT ANY WARRANTY; without even the implied warranty of
     12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13      Lesser General Public License for more details.
     14 
     15      You should have received a copy of the GNU Lesser General Public
     16      License along with this library; if not, write to the Free Software
     17      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     18 */
     19 /**
     20  * @file minimal_example.c
     21  * @brief minimal example for how to generate an infinite stream with libmicrohttpd
     22  * @author Christian Grothoff
     23  */
     24 
     25 #include "platform.h"
     26 #include <microhttpd.h>
     27 
     28 static ssize_t
     29 data_generator (void *cls, uint64_t pos, char *buf, size_t max)
     30 {
     31   if (max < 80)
     32     return 0;
     33   memset (buf, 'A', max - 1);
     34   buf[79] = '\n';
     35   return 80;
     36 }
     37 
     38 static int
     39 ahc_echo (void *cls,
     40           struct MHD_Connection *connection,
     41           const char *url,
     42           const char *method,
     43           const char *version,
     44           const char *upload_data, size_t *upload_data_size, void **ptr)
     45 {
     46   static int aptr;
     47   struct MHD_Response *response;
     48   int ret;
     49 
     50   if (0 != strcmp (method, "GET"))
     51     return MHD_NO;              /* unexpected method */
     52   if (&aptr != *ptr)
     53     {
     54       /* do never respond on first call */
     55       *ptr = &aptr;
     56       return MHD_YES;
     57     }
     58   *ptr = NULL;                  /* reset when done */
     59   response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN,
     60                                                 80,
     61                                                 &data_generator, NULL, NULL);
     62   ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
     63   MHD_destroy_response (response);
     64   return ret;
     65 }
     66 
     67 int
     68 main (int argc, char *const *argv)
     69 {
     70   struct MHD_Daemon *d;
     71 
     72   if (argc != 2)
     73     {
     74       printf ("%s PORT\n", argv[0]);
     75       return 1;
     76     }
     77   d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG,
     78                         atoi (argv[1]),
     79                         NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END);
     80   if (d == NULL)
     81     return 1;
     82   (void) getc (stdin);
     83   MHD_stop_daemon (d);
     84   return 0;
     85 }
     86