1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     This file is part of libmicrohttpd
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     Copyright (C) 2007, 2008 Christian Grothoff (and other contributing authors)
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     This library is free software; you can redistribute it and/or
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     modify it under the terms of the GNU Lesser General Public
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     License as published by the Free Software Foundation; either
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     version 2.1 of the License, or (at your option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     This library is distributed in the hope that it will be useful,
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     but WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     Lesser General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     You should have received a copy of the GNU Lesser General Public
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     License along with this library; if not, write to the Free Software
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat*/
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file refuse_post_example.c
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief example for how to refuse a POST request properly
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Christian Grothoff and Sebastian Gerhardt
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h"
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <microhttpd.h>
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *askpage = "<html><body>\n\
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       Upload a file, please!<br>\n\
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <form action=\"/filepost\" method=\"post\" enctype=\"multipart/form-data\">\n\
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <input name=\"file\" type=\"file\">\n\
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       <input type=\"submit\" value=\" Send \"></form>\n\
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                       </body></html>";
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define BUSYPAGE "<html><head><title>Webserver busy</title></head><body>We are too busy to process POSTs right now.</body></html>"
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratahc_echo (void *cls,
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          struct MHD_Connection *connection,
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *url,
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *method,
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *version,
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *upload_data, size_t *upload_data_size, void **ptr)
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  static int aptr;
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  const char *me = cls;
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Response *response;
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int ret;
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if ((0 != strcmp (method, "GET")) && (0 != strcmp (method, "POST")))
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return MHD_NO;              /* unexpected method */
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (&aptr != *ptr)
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      *ptr = &aptr;
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      /* always to busy for POST requests */
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (0 == strcmp (method, "POST"))
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          response = MHD_create_response_from_buffer (strlen (BUSYPAGE),
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						      (void *) BUSYPAGE,
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat						      MHD_RESPMEM_PERSISTENT);
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          ret =
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            MHD_queue_response (connection, MHD_HTTP_SERVICE_UNAVAILABLE,
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                                response);
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          MHD_destroy_response (response);
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          return ret;
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  *ptr = NULL;                  /* reset when done */
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  response = MHD_create_response_from_buffer (strlen (me),
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat					      (void *) me,
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat					      MHD_RESPMEM_PERSISTENT);
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_destroy_response (response);
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return ret;
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain (int argc, char *const *argv)
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Daemon *d;
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (argc != 2)
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      printf ("%s PORT\n", argv[0]);
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return 1;
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG,
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        atoi (argv[1]),
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        NULL, NULL, &ahc_echo, (void *) askpage,
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        MHD_OPTION_END);
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (d == NULL)
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return 1;
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  (void) getc (stdin);
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_stop_daemon (d);
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return 0;
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* end of refuse_post_example.c */
101