1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat This file is part of libmicrohttpd
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Copyright (C) 2007 Christian Grothoff
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat libmicrohttpd is free software; you can redistribute it and/or modify
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat it under the terms of the GNU General Public License as published
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat by the Free Software Foundation; either version 2, or (at your
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat libmicrohttpd is distributed in the hope that it will be useful, but
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat You should have received a copy of the GNU General Public License
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat along with libmicrohttpd; see the file COPYING.  If not, write to the
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Boston, MA 02111-1307, USA.
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file mhds_get_test.c
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief  Testcase for libmicrohttpd HTTPS GET operations
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Sagie Amir
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h"
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "microhttpd.h"
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MHD_E_MEM "Error: memory error\n"
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#define MHD_E_SERVER_INIT "Error: failed to start server\n"
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst int DEBUG_GNUTLS_LOG_LEVEL = 0;
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char *test_file_name = "https_test_file";
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratconst char test_file_data[] = "Hello World\n";
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratahc_echo (void *cls,
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          struct MHD_Connection *connection,
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *url,
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *method,
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *version,
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *upload_data, size_t *upload_data_size,
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          void **unused)
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return 0;
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erattest_wrap (char *test_name, int (*test) (void))
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int ret;
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  fprintf (stdout, "running test: %s ", test_name);
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  ret = test ();
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (ret == 0)
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      fprintf (stdout, "[pass]\n");
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  else
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      fprintf (stdout, "[fail]\n");
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return ret;
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * Test daemon initialization with the MHD_OPTION_SOCK_ADDR option
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erattest_ip_addr_option ()
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Daemon *d;
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct sockaddr_in daemon_ip_addr;
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#if HAVE_INET6
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct sockaddr_in6 daemon_ip_addr6;
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  memset (&daemon_ip_addr, 0, sizeof (struct sockaddr_in));
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr.sin_family = AF_INET;
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr.sin_port = htons (4233);
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#if HAVE_INET6
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  memset (&daemon_ip_addr6, 0, sizeof (struct sockaddr_in6));
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr6.sin6_family = AF_INET6;
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr6.sin6_port = htons (4233);
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  daemon_ip_addr6.sin6_addr = in6addr_loopback;
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  d = MHD_start_daemon (MHD_USE_DEBUG, 4233,
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        NULL, NULL, &ahc_echo, NULL, MHD_OPTION_SOCK_ADDR,
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        &daemon_ip_addr, MHD_OPTION_END);
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (d == 0)
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return -1;
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_stop_daemon (d);
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#if HAVE_INET6
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  d = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_IPv6, 4233,
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        NULL, NULL, &ahc_echo, NULL, MHD_OPTION_SOCK_ADDR,
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        &daemon_ip_addr6, MHD_OPTION_END);
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (d == 0)
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return -1;
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_stop_daemon (d);
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return 0;
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/* setup a temporary transfer test file */
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain (int argc, char *const *argv)
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  unsigned int errorCount = 0;
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  errorCount += test_wrap ("ip addr option", &test_ip_addr_option);
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return errorCount != 0;
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
125