1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* Feel free to use this example code in any way
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat   you see fit (Public Domain) */
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/types.h>
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#ifndef _WIN32
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/select.h>
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/socket.h>
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#else
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <winsock2.h>
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdio.h>
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <stdlib.h>
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <string.h>
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <microhttpd.h>
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define PORT            8888
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define POSTBUFFERSIZE  512
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MAXCLIENTS      2
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define GET             0
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define POST            1
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic unsigned int nr_of_uploading_clients = 0;
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstruct connection_info_struct
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int connectiontype;
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_PostProcessor *postprocessor;
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  FILE *fp;
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  const char *answerstring;
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int answercode;
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat};
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *askpage = "<html><body>\n\
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       Upload a file, please!<br>\n\
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       There are %u clients uploading at the moment.<br>\n\
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <form action=\"/filepost\" method=\"post\" enctype=\"multipart/form-data\">\n\
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <input name=\"file\" type=\"file\">\n\
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <input type=\"submit\" value=\" Send \"></form>\n\
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       </body></html>";
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *busypage =
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  "<html><body>This server is busy, please try again later.</body></html>";
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *completepage =
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  "<html><body>The upload has been completed.</body></html>";
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *errorpage =
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  "<html><body>This doesn't seem to be right.</body></html>";
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *servererrorpage =
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  "<html><body>An internal server error has occured.</body></html>";
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *fileexistspage =
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  "<html><body>This file already exists.</body></html>";
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratsend_page (struct MHD_Connection *connection, const char *page,
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat           int status_code)
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int ret;
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Response *response;
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  response =
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    MHD_create_response_from_buffer (strlen (page), (void *) page,
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat				     MHD_RESPMEM_MUST_COPY);
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (!response)
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return MHD_NO;
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, "text/html");
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  ret = MHD_queue_response (connection, status_code, response);
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_destroy_response (response);
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return ret;
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratiterate_post (void *coninfo_cls, enum MHD_ValueKind kind, const char *key,
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              const char *filename, const char *content_type,
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              const char *transfer_encoding, const char *data, uint64_t off,
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              size_t size)
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct connection_info_struct *con_info = coninfo_cls;
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  FILE *fp;
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  con_info->answerstring = servererrorpage;
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  con_info->answercode = MHD_HTTP_INTERNAL_SERVER_ERROR;
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != strcmp (key, "file"))
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return MHD_NO;
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (!con_info->fp)
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (NULL != (fp = fopen (filename, "rb")))
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          fclose (fp);
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->answerstring = fileexistspage;
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->answercode = MHD_HTTP_FORBIDDEN;
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          return MHD_NO;
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      con_info->fp = fopen (filename, "ab");
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (!con_info->fp)
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        return MHD_NO;
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (size > 0)
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (!fwrite (data, size, sizeof (char), con_info->fp))
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        return MHD_NO;
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  con_info->answerstring = completepage;
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  con_info->answercode = MHD_HTTP_OK;
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return MHD_YES;
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic void
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratrequest_completed (void *cls, struct MHD_Connection *connection,
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                   void **con_cls, enum MHD_RequestTerminationCode toe)
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct connection_info_struct *con_info = *con_cls;
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (NULL == con_info)
126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return;
127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (con_info->connectiontype == POST)
129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (NULL != con_info->postprocessor)
131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          MHD_destroy_post_processor (con_info->postprocessor);
133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          nr_of_uploading_clients--;
134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (con_info->fp)
137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        fclose (con_info->fp);
138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  free (con_info);
141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  *con_cls = NULL;
142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratanswer_to_connection (void *cls, struct MHD_Connection *connection,
147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      const char *url, const char *method,
148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      const char *version, const char *upload_data,
149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                      size_t *upload_data_size, void **con_cls)
150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (NULL == *con_cls)
152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      struct connection_info_struct *con_info;
154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (nr_of_uploading_clients >= MAXCLIENTS)
156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        return send_page (connection, busypage, MHD_HTTP_SERVICE_UNAVAILABLE);
157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      con_info = malloc (sizeof (struct connection_info_struct));
159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (NULL == con_info)
160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        return MHD_NO;
161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      con_info->fp = NULL;
163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (0 == strcmp (method, "POST"))
165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->postprocessor =
167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            MHD_create_post_processor (connection, POSTBUFFERSIZE,
168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                                       iterate_post, (void *) con_info);
169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          if (NULL == con_info->postprocessor)
171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            {
172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              free (con_info);
173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              return MHD_NO;
174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            }
175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          nr_of_uploading_clients++;
177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->connectiontype = POST;
179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->answercode = MHD_HTTP_OK;
180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          con_info->answerstring = completepage;
181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      else
183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        con_info->connectiontype = GET;
184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      *con_cls = (void *) con_info;
186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return MHD_YES;
188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 == strcmp (method, "GET"))
191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      char buffer[1024];
193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      snprintf (buffer, sizeof (buffer), askpage, nr_of_uploading_clients);
195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return send_page (connection, buffer, MHD_HTTP_OK);
196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 == strcmp (method, "POST"))
199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      struct connection_info_struct *con_info = *con_cls;
201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (0 != *upload_data_size)
203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          MHD_post_process (con_info->postprocessor, upload_data,
205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                            *upload_data_size);
206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          *upload_data_size = 0;
207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          return MHD_YES;
209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      else
211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	{
212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	  if (NULL != con_info->fp)
213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	  {
214748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	    fclose (con_info->fp);
215748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	    con_info->fp = NULL;
216748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	  }
217748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	  /* Now it is safe to open and inspect the file before calling send_page with a response */
218748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	  return send_page (connection, con_info->answerstring,
219748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			    con_info->answercode);
220748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat	}
221748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
222748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
223748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
224748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return send_page (connection, errorpage, MHD_HTTP_BAD_REQUEST);
225748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
226748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
227748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
228748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
229748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain ()
230748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
231748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Daemon *daemon;
232748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
233748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL,
234748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                             &answer_to_connection, NULL,
235748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                             MHD_OPTION_NOTIFY_COMPLETED, request_completed,
236748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                             NULL, MHD_OPTION_END);
237748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (NULL == daemon)
238748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return 1;
239748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  (void) getchar ();
240748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_stop_daemon (daemon);
241748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return 0;
242748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
243