1/*
2     This file is part of libmicrohttpd
3     Copyright (C) 2007 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 use libmicrohttpd
22 * @author Christian Grothoff
23 */
24
25#include "platform.h"
26#include <microhttpd.h>
27
28#define PAGE "<html><head><title>libmicrohttpd demo</title></head><body>libmicrohttpd demo</body></html>"
29
30static int
31ahc_echo (void *cls,
32          struct MHD_Connection *connection,
33          const char *url,
34          const char *method,
35          const char *version,
36          const char *upload_data, size_t *upload_data_size, void **ptr)
37{
38  static int aptr;
39  const char *me = cls;
40  struct MHD_Response *response;
41  int ret;
42
43  if (0 != strcmp (method, "GET"))
44    return MHD_NO;              /* unexpected method */
45  if (&aptr != *ptr)
46    {
47      /* do never respond on first call */
48      *ptr = &aptr;
49      return MHD_YES;
50    }
51  *ptr = NULL;                  /* reset when done */
52  response = MHD_create_response_from_buffer (strlen (me),
53					      (void *) me,
54					      MHD_RESPMEM_PERSISTENT);
55  ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
56  MHD_destroy_response (response);
57  return ret;
58}
59
60int
61main (int argc, char *const *argv)
62{
63  struct MHD_Daemon *d;
64
65  if (argc != 2)
66    {
67      printf ("%s PORT\n", argv[0]);
68      return 1;
69    }
70  d = MHD_start_daemon (// MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG | MHD_USE_POLL,
71			MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG,
72			// MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG | MHD_USE_POLL,
73			// MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG,
74                        atoi (argv[1]),
75                        NULL, NULL, &ahc_echo, PAGE,
76			MHD_OPTION_CONNECTION_TIMEOUT, (unsigned int) 120,
77			MHD_OPTION_END);
78  if (d == NULL)
79    return 1;
80  (void) getc (stdin);
81  MHD_stop_daemon (d);
82  return 0;
83}
84